|
這個(gè)程序是參照《手把手教你學(xué)51單片機(jī)》里的練習(xí)程序修改寫的:
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- /*數(shù)碼管計(jì)時(shí)和LED流水燈*/
-
- #include <reg52.h>
- sbit WE1 = P2^0; // 數(shù)碼管位定義
- sbit WE2 = P2^1;
- sbit WE3 = P2^2;
- sbit WE4 = P2^3;
- sbit BEEP = P2^4;
-
- unsigned char code LedChar[]={ //數(shù)碼管顯示字符轉(zhuǎn)換表
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
- 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
- };
- unsigned char LedBuff[]={ // 數(shù)碼管顯示緩沖區(qū),初值0xFF確保啟動(dòng)時(shí)都不亮
- 0XFF,0XFF,0XFF,0XFF,0XFF
- };
- unsigned char cnt200 = 0; // 200ms計(jì)數(shù)
- unsigned int cnt1000 = 0; // 1000ms計(jì)數(shù)
-
- void ShowCount(); // 秒計(jì)數(shù)顯示函數(shù)
- void FlowingLight(); // 流水燈實(shí)現(xiàn)函數(shù)
-
- void main ()
- {
-
- EA = 1 ; //使能總中斷
- TMOD = 0X01 ; //設(shè)置T0為模式1
- TH0 = 0XFC ; //為T0賦初值0xFC67,定時(shí)1ms
- TL0 = 0X67 ;
- ET0 = 1 ; //使能T0中斷
- TR0 = 1 ; //啟動(dòng)T0
-
- while (1)
- {
-
- if (cnt200 >= 200 ) // 200ms刷新一次流水燈
- {
- cnt200 = 0 ;
- FlowingLight();
-
- }
- if (cnt1000 >= 1000) //1s刷新一次計(jì)數(shù)值
- {
- cnt1000 = 0 ;
- ShowCount();
- }
- }
- }
-
-
- /* 流水燈實(shí)現(xiàn)函數(shù) */
-
- void FlowingLight()
- {
- static unsigned char dir = 0; //移位方向變量dir,用于控制移位的方向
- static unsigned char shift = 0X01 ; //循環(huán)移位變量shift,并賦初值0x01
-
- P1 = ~shift ; //循環(huán)移位變量取反,控制8個(gè)LED
- if(dir == 0) //移位方向變量為0時(shí),左移
- {
- shift = shift << 1; //循環(huán)移位變量左移1位
- if (shift == 0X80) //左移到最左端后,改變移位方向
- {
- dir = 1 ;
- }
- }
- else //移位方向變量不為0時(shí),右移
- {
- shift = shift >>1; //循環(huán)移位變量右移1位
- if (shift == 0X01) //右移到最右端后,改變移位方向
- {
- dir = 0 ;
- }
- }
- }
-
-
- /* 秒計(jì)數(shù)顯示函數(shù) */
-
- void ShowCount()
- {
- char i ; //循環(huán)變量
- unsigned char buf[4]; //中間轉(zhuǎn)換緩沖區(qū)
- static unsigned long sec = 1; //記錄經(jīng)過的秒數(shù)
-
- sec++ ; //秒計(jì)數(shù)自加1
- buf[0] = sec%10 ; //將sec按十進(jìn)制位從低到高依次提取到buf數(shù)組中
- buf[1] = sec/10%10 ;
- buf[2] = sec/100%10 ;
- buf[3] = sec/1000%10 ;
- //buf[4] =sec/10000%10 ;
- //buf[5] = sec/100000%10;
-
- for(i=3; i>=1; i--) //從最高為開始,遇到0不顯示,遇到非0退出循環(huán)
- {
- if(buf[i] == 0)
- LedBuff[i] = 0XFF ;
- else
- break;
- }
- for (;i>=0; i--) //將剩余的有效數(shù)字位如實(shí)轉(zhuǎn)換
- {
- LedBuff[i] = LedChar[buf[i]] ;
- }
- }
-
-
- /* 定時(shí)器0中斷服務(wù)函數(shù) */
- void InterruptTimer0() interrupt 1
- {
- static unsigned char i = 0 ; //動(dòng)態(tài)掃描的索引
- TH0 = 0XFC ; //重新加載初值
- TL0 = 0X67 ;
- cnt200++ ;
- cnt1000++ ;
- //以下代碼完成數(shù)碼管動(dòng)態(tài)掃描刷新
- P0 = 0xFF; //顯示消隱
-
- switch(i)
- {
- case 0: WE1 = 0;WE2 = 0;WE3 = 0;WE4 = 1; P0=LedBuff[0];i++;break;
- case 1: WE1 = 0;WE2 = 0;WE3 = 1;WE4 = 0; P0=LedBuff[1];i++; break;
- case 2: WE1 = 0;WE2 = 1;WE3 = 0;WE4 = 0; P0=LedBuff[2];i++;break;
- case 3: WE1 = 1;WE2 = 0;WE3 = 0;WE4 = 0; P0=LedBuff[3];i=0;break;
- default: break;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
LED SMG - 1.rar
(77.37 KB, 下載次數(shù): 31)
2019-1-27 11:14 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|