1. 程式人生 > >單片機八位時鐘

單片機八位時鐘

數碼 累加 sign span keil class ++ default bre

 1 /* Main.c file generated by New Project wizard
 2  *
 3  * Created:   周一 六月 5 2017
 4  * Processor: 80C51
 5  * Compiler:  Keil for 8051
 6  */
 7 
 8 #include <reg51.h>
 9 #include <stdio.h>
10      //定義共陰數碼管斷碼  0    1    2    3    4     5   6     7    8    9   A    B    C     D   E    F
11 unsigned char
duan[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 12 unsigned char wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定義共陰數碼管位碼 13 unsigned char t50ms = 0,sec =0, min = 0,hour = 0;//定義50ms,秒,分、時的變量 14 unsigned char j;//定義循環變量 15 //延時函數 16 void delay(unsigned int i) 17 { 18 while(i--); 19 } 20 //定時器0的初始化
21 void init(){ 22 TMOD = 0X01;//選擇工作方式1,16位寄存器存儲初值 23 ET0 = 1;//打開定時器0的分開關 24 TH0 = (65535-50000)/256;//給定時器0高八位賦初值 25 TH0 = (65535-50000)%256;//給定時器0低八位賦初值 26 TR0 = 1;//啟動定時器0 27 EA = 1;//打開總閘 28 } 29 //主函數 30 void main(void) 31 { 32 init();//調用初始化函數 33 while(1)//死循環 34 { 35 for(j=0;j<8;j++)
36 { 37 P1 = wei[j];//給P1端口送位碼 38 switch(j)//分別給八位數碼管賦相應的值 39 { 40 case 0:P2=duan[hour/10];break;//hour/10:取到小時的十位 41 case 1:P2=duan[hour%10];break;//hour%10:取到小時的個位 42 case 2:P2=0X40;break;//顯示小時和分鐘之間的-(橫杠) 43 case 3:P2=duan[min/10];break; 44 case 4:P2=duan[min%10];break; 45 case 5:P2=0X40;break; 46 case 6:P2=duan[sec/10];break; 47 case 7:P2=duan[sec%10];break; 48 default:break; 49 } 50 delay(500);//小延時 51 } 52 } 53 } 54 //中斷服務子函數 55 void dingshi() interrupt 1{ 56 t50ms++;//50ms累加 57 if(t50ms == 20)//加到20次,即1s 58 { 59 sec++;//秒就累加 60 t50ms = 0;//50ms清零 61 if(sec == 60)//秒鐘為60s 62 { 63 min++;//分鐘就累加 64 sec = 0;//秒清零 65 if(min ==60)//分鐘為60m 66 { 67 hour++;//小時就累加 68 min = 0;//分鐘清零 69 if(hour ==24)//hour為24小時 70 { 71 hour = 0;//hour清零 72 } 73 } 74 } 75 } 76 }

技術分享

單片機八位時鐘