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