當前位置:編程學習大全網 - 編程語言 - at89c51單片機的七段顯示數碼管和流水燈的編程

at89c51單片機的七段顯示數碼管和流水燈的編程

這個可以借鑒網上的壹些資料,具體的看妳的原理圖,可以仿寫

最重要的是自己掌握方法

可以到壹些貼吧論壇討論,相互學習

#include <reg52.h>

typedef unsigned int uint;

typedef unsigned char uchar;

sbit wela = P2^7; //數碼管位聲明

sbit dula = P2^6; //數碼管段選聲明

sbit FM = P2^3;//蜂鳴器聲明

uchar counter = 0, counter1 = 0, j = 0, flag = 0, flag1 = 0;

uchar num = 6, num1 = 0;

//數碼管段選編碼

uchar code table_du [] = {

0x3F, //"0"

0x06, //"1"

0x5B, //"2"

0x4F, //"3"

0x66, //"4"

0x6D, //"5"

0x7D, //"6"

0x07, //"7"

0x7F, //"8"

0x6F, //"9"

0x77, //"A"

0x7C, //"B"

0x39, //"C"

0x5E, //"D"

0x79, //"E"

0x71, //"F"

0x76, //"H"

0x38, //"L"

0x37, //"n"

0x3E, //"u"

0x73, //"P"

0x5C, //"o"

0x40, //"-"

0x00, //熄滅

0x00 //自定義

};

//數碼管位選編碼

uchar code table_we[] = {

0xfe,

0xfd,

0xfb,

0xf7,

0xef,

0xdf

};

void init();

void display();

void main()

{

init();

while(1)

{

if(counter1 == 30)

{

counter1 = 0;

display();

num--;

num1++;

if(num == 0)

{

num = 6;

}

if(num1 == 6)

{

num1 = 0;

}

}

if(counter == 200)//定時到4秒後,流水燈向右流動

{

counter = 0;//counter清零,

//關閉定時器0

TR0 = 0;

//ET0 = 0;

flag = 1; //標誌變量置1後,定時器重新初始化

TH0 = 0xB8; //定時器0定時20毫秒

TL0 = 0x00;

TR0 = 1; //重新打開定時器0

//ET0 = 1;

j = 0;

}

}

}

//定時器初始化程序

void init()

{

//定時器0和定時器1初始化函數

TMOD = 0x11;//定義定時器1和0在工作方式1下

TH0 = 0xB8; //定時器0定時20毫秒

TL0 = 0x00;

TH1 = 0xFC; //定時器1定時20毫秒

TL1 = 0x67;

TR0 = 1; //打開定時器0

TR1 = 1; //打開定時器1

EA = 1; //打開總中斷

ET0 = 1; //打開定時器0中斷

ET1 = 1; //打開定時器1中斷

}

//數碼管顯示子程序

void display()

{

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

dula = 1;

P0 = table_du[num];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = table_we[num1];

wela = 0;

}

//中斷定時器0

void int_time0() interrupt 1

{

TH0 = 0xB8;

TL0 = 0x00;

counter++;

if(flag == 0)

{

if(counter % 10 == 0)//定時200毫秒

{

P1 = ~(1 << j++);//流水燈左移流動

if(j == 8)

{

j = 0;

}

}

}

else

{

if(counter % 5 == 0)

{

//counter = 0;

//流水燈右移流動

P1 = ~(0x80 >> j++);

FM = ~FM;

if(j == 8)

j = 0;

}

}

}

//中斷定時器1

void int_time1() interrupt 3

{

TH1 = 0xFC;

TL1 = 0x67;

counter1++;

}

參考

  • 上一篇:編程工具ai
  • 下一篇:伺服驅動器的CLR清零脈沖指令可以省略嗎?
  • copyright 2024編程學習大全網