数码管电子钟
时间:11-29
来源:互联网
点击:
主要元器件:89C52RC,74HL138,四位数码管两个,独立按钮三个,排线,杜邦线
原理:利用定时计数器定时50ms,每20次为一秒,产生一次中断,在中断函数中,对秒数加一,当秒数加满60后清零,分数加一,同理可得分数和时数直接安定关系。数码管的显示采用动态扫描法,至于如何对按键进行实时响应,参考程序部分。
说明:由于本程序软件部分既不是很复杂也不是很简单,故采用C51编写,硬件原理图暂缺。软件部分如下,本程序仅供QQ好友中从事嵌入式工作的叔叔和大哥们参考,修改。
结语:向广大大哥大叔们表示感谢,在此也多谢导师的指引,青见一定不负所望,仰望星空,脚踏实地,五月份本人事情较多,估计没有时间和你们讨论一些问题,期待我们暑假的大飞机项目。告嵌入式同胞们,我的一些上位机软件和硬件自学笔记在我的嵌入式服务器中,用户名和密码已经给你们了。空间上的只是备份,大家无需来我空间,直接登录服务器即可,下次有空决定为我的宝马做一个速度计和里程表,希望有兴趣的去我服务器讨论。
附录:代码下载:http://www.51hei.com/f/smgpp.rar部分代码:#include#define uchar unsigned char#define uint unsigned int#define delaytime 4//译码器的控制位sbit LA=P2^2;sbit LB=P2^3;sbit LC=P2^4;//键盘的控制位sbit SetMode=P2^5;sbit Plus=P2^6;sbit Minus=P2^7;sbit duanxuan=P1^0;//键盘的状态位bit Sethour,Setmin,Setsec;//时间数据位uchar hour,min,sec,count,state;//共阳数码管数字0~9的码值uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};void show();void display_wei(uchar wei){wei=wei-1;LA=wei%2;LB=(wei/2)%2;LC=(wei/2/2)%2;}void display_duan(uchar duan){duanxuan=1;P3=duan;duanxuan=0; }void init(){EA=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TMOD=0x01;TR0=1;hour=0;min=0;sec=0;count=0;Sethour=0;Setmin=0;Setsec=0;state=1;}void timer() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==10)state=~state;if(count==20){state=~state;count=0;sec++;}if(sec==60){sec=0;min++;}if(min==60){min=0;hour++;}if(hour==24)hour=0;}void delay(uint ms){unsigned char i;while(ms--){for(i=0;i<120;i++);}}void show(){ if(Sethour==1&&Setmin==0&&Setsec==0&&state==1){display_wei(1);display_duan(table[10]);delay(delaytime);display_wei(2);display_duan(table[10]);delay(delaytime);}else{display_wei(1);display_duan(table[hour%100/10]);delay(delaytime);display_wei(2);display_duan(table[hour%10]);delay(delaytime);}display_wei(3);display_duan(0x40);delay(delaytime);if(Sethour==1&&Setmin==1&&Setsec==0&&state==1){display_wei(4);display_duan(table[10]);delay(delaytime);display_wei(5);display_duan(table[10]);delay(delaytime);}else{display_wei(4);display_duan(table[min%100/10]);delay(delaytime);display_wei(5);display_duan(table[min%10]);delay(delaytime);}display_wei(6);display_duan(0x40);delay(delaytime);if(Sethour==1&&Setmin==1&&Setsec==1&&state==1){display_wei(7);display_duan(table[10]);delay(delaytime);display_wei(8);display_duan(table[10]);delay(delaytime);}else{display_wei(7);display_duan(table[sec%100/10]);delay(delaytime);display_wei(8);display_duan(table[sec%10]);delay(delaytime);}}void process_Plus(){if(Plus==0){delay(7);if(Plus==0){while(show(),Plus==0)delay(7);if(Sethour==1&&Setmin==0&&Setsec==0)hour++;if(Sethour==1&&Setmin==1&&Setsec==0)min++;if(Sethour==1&&Setmin==1&&Setsec==1)sec=0;}}}void process_Minus(){if(Minus==0){delay(7);if(Minus==0){while(show(),Minus==0)delay(7);if(Sethour==1&&Setmin==0&&Setsec==0){ hour--;if(hour==255)hour=23;}if(Sethour==1&&Setmin==1&&Setsec==0){min--;if(min==255)min=59;}if(Sethour==1&&Setmin==1&&Setsec==1){sec=0;} }}}void main(){init();while(show(),process_Plus(),process_Minus(),1){if(SetMode==0){delay(10);if(SetMode==0){while(show(),SetMode==0);delay(10);if(SetMode==1){if(Sethour==0&&Setmin==0&&Setsec==1){Sethour=0;Setmin=0;Setsec=0;}if(Sethour==1&&Setmin==1&&Setsec==1){Sethour=0;Setmin=0;Setsec=1;}if(Sethour==1&&Setmin==1&&Setsec==0)Setsec=1;if(Sethour==1&&Setmin==0&&Setsec==0)Setmin=1;if(Sethour==0&&Setmin==0&&Setsec==0)Sethour=1;} }}} }
数码管电子钟89C52R 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)