51单片机时钟完整资料
时钟计时器元件清单 序号 | | | | | 1 | | | | | 2 | | | | | 3 | | | | | 4 | | | | | 5 | | | | | 6 | | | | | 7 | | | | | 8 | | | | | 9 | | | | | 10 | | | | | 11 | | | | | 12 | | | | | 13 | | | | | 14 | | | | |
单片机源程序:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit K1=P1^0; //功能键
- sbit K2=P1^1; //加1键
- sbit K3=P1^2; //减1键
- sbit K4=P1^3; //备用
- sbit beep=P1^4;// 蜂鸣器输出控制
- uchar t,m,f,s;
- uchar num;
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
- 0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-F共阴极数码管
- /*uchar code table0[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//共阳极段码
- 0x82,0xf8,0x80,0x90};*/
- uchar code tablewe[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //控制位选
- void delayms(uint z) //延时z ms
- {
- uint x,y;
- for(x=z;x>0;x--) for(y=110;y>0;y--);
- }
- void di() //蜂鸣器响
- { beep=0; delayms(100); beep=1; }
- void display(uchar n,uchar c,uchar d) //分离变量
- {
- uchar a,b;
- a=n/10; //十位
- b=n%10; //个位
- P0=table[a]; P2=tablewe[c]; delayms(2); //十位显示
- P0=table[b]; P2=tablewe[d]; delayms(2); //个位显示
- }
- void init()
- { t=0; m=0; f=0; s=0;
-
- TMOD=0X01; //定时器T0工作于方式1
- TH0=(65536-50000)/256; //晶振为12MHZ
- TL0=(65536-50000)%256; //定时时间为50ms
- EA=1; //开中断
- ET0=1; //开T0中断
- TR0=1; //启动T0
- }
- void key() //按键扫描
- {
- if(K1==0) //功能键
- {
- delayms(10); //延时消抖
- if(K1==0) //再判
- { di(); //调蜂鸣器响
- num++; //功能键按下次数加1
- while(!K1);//等待功能键释放
- if(num==1)TR0=0; //关闭T0,进入调时模式
- if(num==4)
- {
- num=0; TR0=1; //启动T0
- }
- }
- }
- if(K2==0) //加1键
- {
- delayms(10);//延时消抖
- if(K2==0)
- { di(); //调蜂鸣器响
- while(!K2); //等待加1键释放
- if(num==1){ m++; if(m==60)m=0; display(m,6,7); } //秒加1,显示秒
- if(num==2){ f++; if(f==60)f=0; display(f,3,4); } //分加1,显示分
- if(num==3){ s++; if(s==24)s=0; display(s,0,1); } //时加1,显示时
- }
- }
- if(K3==0) //加1键
- {
- delayms(10);
- if(K3==0)
- { di(); //调蜂鸣器响
- while(!K3); //等待减1键释放
- if(num==1){ m--;if(m==-1)m=59;display(m,6,7);} //秒减1,显示秒
- if(num==2){ f--;if(f==-1)f=59;display(f,3,4);} //分减1,显示分
- if(num==3){ s--;if(s==-1)s=23;display(s,0,1);} //时减1,显示时
- }
- }
- }
- void main()
- {
- init();//初始化
- while(1)
- {
- key(); //调键扫描
- P0=0x40; //显示-
- P2=0xdb;
-
- delayms(2); //延时
- display(s,0,1); //秒显示
- display(f,3,4); //分显示
- display(m,6,7); //时显示
- }
- }
- void T0_time() interrupt 1
- {
- TH0=(65536-50000)/256; //重赋初值
- TL0=(65536-50000)%256;
- t++; //中断次数加1
- if(t==20) //到1秒
- {
- t=0; //计数清0
- m++; //秒加1
-
- …………限于本文篇幅 余下代码请从51电子黑下载附件…………
复制代码
下载:
源程序.zip
(21.97 KB, 下载次数: 54)
原理图和PCB及仿真.zip
(89.88 KB, 下载次数: 41)
时钟计时器元件清单.doc
(34 KB, 下载次数: 29)
|