数字钟电路原理图如下:
效果图
单片机源程序如下:
- #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)
|