主要功能:
1.能实现时、分、秒的显示;
2.按键控制时、分、秒的调整。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
本次设计的单片机系统由AT89C51、数码管显示屏、时钟振荡器、电源、按键键盘等组成。2.3 单片机系统流程图程序首先开始进行初始化,在主程序的循环程序中首先调用时钟子程序完成秒的计时及向分钟、小时的进位,用于调整分钟、小时、秒,主要由主函数组成通过对相关子程序的调用。然后调用按键子程序,在判断是否有按键按下。若有按键按下则转到相应的功能程序执行。
第三部分 系统硬件设计3.1 时钟振荡器时钟振荡器即时钟脉冲发生器,产生整个芯片内部个功能电路正常操作所需的时钟脉冲和定时信号。最常用的一种电路连接方法是,在XTAL1和XTAL2这2只引脚之间外接一只晶体振荡器XTAL和2只电容C1和C2到地,与片内电路共同构成一个多谐振荡器电路。其振荡频率取决于外接石英振荡器原件XTAL的固有频率3.2 数码管显示电路数码管显示屏的A到G与单片机P0口相连,数码管显示屏的1到6口与单片机P2口相连。
3.3 键盘输入电路本次设计采用独立键盘,键盘按下时,相应的I/O口电平由高变低。3个独立键盘依次控制着秒、分钟、小时的设置。3个独立按键与单片机P1.0—P1.2口相连。3.4 中心模块AT89C51是一种带4K字节的低电压、高性能的高效微控制器。P0口:是一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(计时器0外部输入)
P3.5 T1(计时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)RST:复位输入。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
单片机源程序如下:- #include<reg51.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};
- uchar seconde=0;
- uchar minite=0;
- uchar hour=0;
- uchar mstcnt=0;
- sbit P1_0=P1^0;
- sbit P1_1=P1^1;
- sbit P1_2=P1^2;
- void delay(uint k );
- void delay1(uchar h );
- void time_pro( );
- void display( );
- void keyscan( );
- void delay1 (uchar h)
- {
- uchar j;
- while((h--)!=0)
- {
- for(j=0;j<125;j++)
- {;}
- }
- }
- void delay (uint k)
- {
- uint a,b,c;
- for(c=k;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- void time_pro( void)
- {
- if(seconde==60)
- { seconde=0;
- minite++;
- if( minite==60)
- { minite=0;
- hour++;
- if(hour==24)
- {hour=0; }
- }
- }
-
- }
- void display(void)
- {
- P2=0xfe;
- P0=dispcode[hour/10];
- delay1(4);
- P2=0xfd;
- P0=(dispcode[(hour%10)])|0X80;
- delay1(4);
- P2=0xfb;
- P0=dispcode[minite/10];
- delay1(4);
- P2=0xf7;
- P0=(dispcode[minite%10])|0X80;
- delay1(4);
- P2=0xef;
- P0=dispcode[seconde/10];
- delay1(4);
- P2=0xdf;
- P0=dispcode[seconde%10];
- delay1(4);
- }
- void keyscan (void)
- {
- if(P1_0==0)
- {
- delay(3);
- if(P1_0==0)
- {
- seconde++;
- if(seconde==60)
- {seconde=0; }
- }
- }
- if(P1_1==0)
- {
- delay(3);
- if(P1_1==0)
- {
- minite++;
- if(minite==60)
- {minite=0;}
- }
- }
- if(P1_2==0)
- {
- delay(3);
- if(P1_2==0)
- {
- hour++;
- if(hour==24)
- {hour=0; }
- }
- }
- }
- void timer0(void) interrupt 1 using 0
- {
- TH0=0x3c;
- TMOD = 0x11;
- mstcnt++;
- if(mstcnt==20)
- {
- seconde++;
- mstcnt=0;
- }
-
- }
- void main(void)
- { P1=0xff;
- TMOD = 0x11;
- TH0=0x3c;
- TL0=0xb0;
- EA=1;
- ET0=1;
- TR0=1;
- while (1)
- {
- keyscan( );
- time_pro( );
- display( );
- }
- }
复制代码
Keil代码与Proteus仿真下载:
仿真程序.7z
(62.19 KB, 下载次数: 20)
|