这是我花了好久时间做的一个电子时钟,没有按照老师的要求去做,而是按照我自己的思路做的。完全是自己的原创,没有抄袭,里面有很多不足的地方,希望大神能修改了与我分享。
飞机里面包含硬件系统和软件系统,使用的是51单片机。
仿真电路图:
所有资料下载:
时钟计时.rar
(57.11 KB, 下载次数: 280)
电子时钟程序源码:
- /************* 头文件与宏定义 ************/
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- /************* 数组与位码 ************/
- uchar code DSY_CODE[]=
- {
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,
- };//第11个为-
- uchar code Scan_BITs[]=
- {
- 0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80
- };
- uchar data Buffer_Counts[8];
- uchar KeyNO=16;
- uchar Key_N;
- uint Count_H=23; //小时
- //uint Count_A; //显示-
- uint Count_M=59; //分钟
- //uint Count_B; //显示-
- uint Count_S=00; //秒
- uint TCNT;
- /************* 延时程序 ************/
- void DelayMS(uint x)
- {
- uchar t;
- while(x--)
- {
- for(t=0;t<120;t++);
- }
- }
- /************* 键处理 ************/
- void Keys_Scan()
- {
- uchar Tmp;
- P1 = 0xff;
- DelayMS(1);
- Tmp = P1 ^ 0xff;
- while(P1!=0xff) {}
- switch(Tmp)
- {
- case 1:KeyNO=0;break;
- case 2:KeyNO=1;break;
- case 4:KeyNO=2;break;
- case 8:KeyNO=3;break;
- case 16:KeyNO=4;break;
- }
- }
- /************* 段码显示 ************/
- void Show_Counts()
- {
- uint i;
- Buffer_Counts[0] = Count_H / 10;
- Buffer_Counts[1] = Count_H % 10;//小时
-
- Buffer_Counts[2] =10;
- Buffer_Counts[3] = Count_M / 10;
- Buffer_Counts[4] = Count_M % 10;//分钟
-
- Buffer_Counts[5] =10;
- Buffer_Counts[6] = Count_S / 10;
- Buffer_Counts[7] = Count_S % 10;//秒
- for(i=0;i<8;i++)
- {
- P2 = ~Scan_BITs[i];
- P0 = ~DSY_CODE[Buffer_Counts[i]];
- DelayMS(1);
- }
- }
- /************* 时间到进位 ************/
- void TIME_INT0() interrupt 1
- { TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- TCNT ++;
- if(TCNT==20)
- {
- Count_S++;
- TCNT=0;
- if(Count_S==60)
- {
- Count_M++;
- Count_S=0;
- if(Count_M==60)
- {
- Count_H++;
- Count_M=0;
- if(Count_H==24)
- {
- Count_H=0;
- Count_M=0;
- Count_S=0;
- TCNT=0;
- }
- }
- }
- }
- }
- /************* 主函数 ************/
- void main()
- {
- TMOD = 0x01;
- TH0 = (65536-5000)/256;
- TL0 = (65536-5000)%256;
- EA=1;
- ET0=1;
- TR0 = 0;
- while(1)
- { if(P1 != 0xff)
- {Keys_Scan();}
- switch(KeyNO)
- {
- case 0:
- if(Key_N>2)
- Key_N=0;
- else if(Key_N==0)
- TR0=~TR0;
- else
- Key_N++;
- break;
- case 1:
- if(~TR0)Count_H++;
-
- {
- if(Count_H==24)
- Count_H=0;
- Count_M=0;
- Count_S=0;
- }break;
- case 2:
- if(~TR0)Count_M++;
- {
- if(Count_M==60)
- Count_M=0;
- Count_S=0;
- }
- break;
- case 3:
- if(~TR0)Count_S++;
- {
- if(Count_S==60)Count_S=0;
- }break;
- case 4: if(Key_N==0)
- Count_H=0;
- Count_M=0;
- Count_S=0;
- break;
- }
- KeyNO=5;
- Show_Counts();
- }
- }
- /*void main()
- {
- while(1)
- {
- TMOD=0x01;
- TH0=(65536-5000)/256;
- TL0=(65536-5000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- Show_Counts();
- switch(P1)
- {
- case 1: Count_H++;
- case 2: Count_M++;
- case 4: Count_S++;
- }
- }
- } */
复制代码
|