數字鐘電路原理圖如下:
QQ圖片20181114162140.png (15.17 KB, 下載次數: 41)
下載附件
效果圖
2018-11-14 16:21 上傳
單片機源程序如下:
- #include"reg51.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1 = P0^0;//按鍵調時間加一 秒
- sbit k2 = P0^1; //分
- sbit k3 = P0^2; //時
- sbit k4 = P0^7; //暫停
- char code smduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //共陽
- 0x80,0x90,0xbf}; //0-9和-
- uchar ms = 0,sec = 0,min =0,hour = 12;//定義變量
- uchar i = 0;
- /**************延時函數,有參******/
- void delay(uchar h)//延時xms
- {
- uchar k;
- for(;h > 0;h--)
- {
- for(k = 110;k > 0;k--);
- }
- }
- /********定時器初始化************/
- void csh()
- {
- TMOD = 0x11;//T0,T1工作方式1
- TH1 = (65536 - 2500) / 256; //給初值 T1給2.5ms
- TL1 = (65536 - 2500) % 256;
- TH0 = (65536 - 50000) / 256; //T0給50ms
- TL0 = (65536 - 50000) % 256;
- //開中斷
- ET1 = 1;
- ET0 = 1;
- EA = 1;
- //二級中斷嵌套令T0 50ms優先
- PT0 = 1;
- //開定時器
- TR0 = 1;
- TR1 = 1;
- }
- /****************按鍵函數*******/
- void key()
- {
- if(k1 == 0) //秒
- {
- delay(10);//延時10ms
- if(k1 == 0)
- {
- if(sec > 59) sec = 0;
- else sec++;
- }
- while(k1 == 0);
- }
- if(k2 == 0)//分
- {
- delay(10);//延時10ms,
- if(k2 == 0)
- {
- if(min > 59) min = 0;
- else min++;
- }
- while(k2 == 0);
- }
- if(k3 == 0) //時
- {
- delay(10);//延時10ms
- if(k3 == 0)
- {
- if(hour > 23) hour = 0;
- else hour++;
- }
- while(k3 == 0);
- }
- if(k4 == 0)
- {
- delay(10);//延時10ms
- if(k4 == 0)
- {
- TR0 = 0;
- TR1 = 0;
- }
- while(k4 == 0);
- }
-
-
- }
- /***********定時器T0中斷(產生時間數據)*********/
- void i_time() interrupt 1
- {
- TH0 = (65536 - 50000) / 256; //初值
- TL0 = (65536 - 50000) % 256;
- if(ms > 19) //1s時間到
- {
- ms = 0;
- if(sec >59) //1min時間到
- {
- sec = 0;
- if (min>59)//1h到
- {
- min = 0;
- if(hour > 23) hour = 0;
- else hour++;
- }
- else min++;
- }
- else sec++;
- }
- else ms++;//50ms中斷計數
-
- }
- /***********定時器T1中斷(產生動態掃描)*********/
- void t_display() interrupt 3
- {
- TH1 = (65536 - 2500) / 256;//給初值 T1給2.5ms
- TL1 = (65536 - 2500) % 256;
- i++;
- if(i > 7) i =0;
- switch(i)
- {
-
- case 0:P3 = 0x00; P2 = smduan[sec % 10]; P3 = 0x01; //第0次中斷,顯示秒個位
- break;
- case 1: P3 = 0x00;P2 = smduan[sec / 10]; P3 = 0x02; //第1次中斷,顯示秒十位
- break;
- case 2:P3 = 0x00; P2 = smduan[10]; P3 = 0x04; //第2次中斷,顯示-
- break;
- case 3:P3 = 0x00; P2 = smduan[min % 10]; P3 = 0x08; //第3次中斷,顯示分個位
- break;
- case 4: P3 = 0x00;P2 = smduan[min / 10]; P3 = 0x10; //第4次中斷,顯示分十位
- break;
- case 5: P3 = 0x00;P2 = smduan[10]; P3 = 0x20; //第5次中斷,顯示-
- break;
- case 6:P3 = 0x00; P2 = smduan[hour % 10]; P3 = 0x40; //第6次中斷,顯示時個位
- break;
- case 7:P3 = 0x00; P2 = smduan[hour / 10]; P3 = 0x80; //第7次中斷 ,顯示時十位
- break;
- }
- }
- /***************主函數************/
- main()
- {
- csh();
- while(1)
- {
- key();
- }
- }
復制代碼
所有資料51hei提供下載:
KEIL.zip
(25.43 KB, 下載次數: 33)
2018-11-14 16:21 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|