采用4位数码管制作一个时钟,
要求:左侧2位显示:小时,
右侧2位显示“分钟”,中间的点(第2位数码管右下方)
秒闪烁(1秒亮、1秒灭),且时间从“12.00”开始。
电路原理图:
单片机源程序如下:
- #include "reg52.h"
- typedef unsigned int uint;
- typedef unsigned char uchar;
- sbit keymode=P2^4;
- sbit keyadd=P2^5;
- sbit keysub=P2^6;
- uchar code segcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar code digcode[]={0xfe,0xfd,0xfb,0xf7};
- uchar ms=0,s=0,min=0,hour=12;
- uchar mode=0;// 0:time 1:hour 2min
- void delayms(unsigned char s)
- {
- uchar i;
- do
- {
- for(i=0;i<250;i++);
- }while(s--);
- }
- void display(uchar dat,uchar dig)
- {
- P0=segcode[dat/10];
- P2=digcode[dig];
- delayms(5);
- P0=0;
- if(s%2==1 && dig==0)
- P0=segcode[dat%10]|0x80;
- else
- P0=segcode[dat%10];
- P2=digcode[dig+1];
- delayms(5);
- P0=0;
- }
- void disoff(uchar dig)
- {
- P0=0;
- P2=digcode[dig];
- delayms(5);
- P0=0;
- P2=digcode[dig+1];
- delayms(5);
- }
- void timecounter()
- {
- ms++;
- if(ms==100)
- {
- ms=0;
- s++;
- if(s==60)
- {
- s=0;
- min++;
- if(min==60)
- {
- min=0;
- hour++;
- if(hour==24)
- hour=0;
- }
- }
- }
-
- }
- void main()
- {
- while(1)
- {
- switch(mode)
- {
- case 0:
- {
- display(hour,0);
- display(min,2);
- break;
- }
- case 1:
- {
- if(s%2==1)
- display(hour,0);
- else
- disoff(0);
- display(min,2);
- break;
- }
- case 2:
- {
- display(hour,0);
- if(s%2==1)
- display(min,2);
- else
- disoff(2);
- break;
- }
- }
-
- timecounter();
- if(keymode==0)
- {
- mode++;
- if(mode==3)
- mode=0;
- while(~keymode);
- }
- if(keyadd==0)
- {
- switch(mode)
- {
- case 1:
- {
- hour++;
- if(hour==24)
- hour=0;
- break;
- }
- case 2:
- {
- min++;
- if(min==60)
- min=0;
- break;
- }
- }
- while(~keyadd);
- }
- if(keysub==0)
- {
- switch(mode)
- {
- case 1:
- {
- hour--;
- if(hour==0xff)
- hour=23;
- break;
- }
- case 2:
- {
- min--;
- if(min==0xff)
- min=59;
- break;
- }
- }
- while(~keysub);
- }
- }
-
- }
复制代码
全部程序51hei下载地址:
C51.zip
(22.21 KB, 下载次数: 40)
|