基于AT89C52的数字时钟Word格式.docx
《基于AT89C52的数字时钟Word格式.docx》由会员分享,可在线阅读,更多相关《基于AT89C52的数字时钟Word格式.docx(15页珍藏版)》请在冰点文库上搜索。
因此,手动复位是微机子系统的一个基本功能要求。
复位电路如下图所示:
该复位电路由R2,C3和开关K组成,当开关K断开时,C3两端电压较高,单片机RST端则为高电平,而当开关K闭合时,RST端接地,变为低电平,此时单片机复位
(2)时钟电路
此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
MCS-51内部有一个用于构成振荡器的高增益反相放大器。
这个放大器外接晶体谐振器以及电容CX1和CX2构成并联谐振电路,接在放大器的反馈回路中构成时钟电路。
时钟频率越高,单片机控制器的控制节拍越快,运算速度也就越快。
(3)独立按键
本例所需要三个独立按键,由于此设计较功能简单,按键数目较少。
故本系统采用扫描式的独立按键,同时利用软件消抖。
(4)LCD1602液晶显示
本设计仅需要显示数字和分隔号,故选择直接可以和5V的TTL电平兼容16*2的LCD1602液晶集成模块
三.系统软件设计
(1)软件流程图
主函数流程图
(2)源程序
主程序:
#include<
reg52.h>
externvoiddisplay();
externvoidlcd_init();
sbitadjust_hour=P1^3;
sbitadjust_minute=P1^4;
sbitadjust_second=P1^5;
unsignedinthour,minute,second;
unsignedcharcount,show[16];
voiddelay1()
{unsignedchari;
for(i=0;
i<
200;
i++);
}
voidmain()
{
EA=1;
ET0=1;
TMOD=0X01;
TH0=-5000/256;
TL0=-5000%256;
show[3]='
:
'
;
show[6]='
count=0;
minute=0;
hour=0;
second=0;
lcd_init();
while
(1)
{if(adjust_second==0)
{delay1();
if(adjust_second==0)
{TR0=0;
if(++second==60)
second=0;
while(!
adjust_second)
display();
}
}
else
if(adjust_minute==0)
if(++minute==60)
minute=0;
while(!
adjust_minute)
else
if(adjust_hour==0)
if(++hour==24)
hour=0;
adjust_hour)
}
{TR0=1;
display();
}
voidtimer()interrupt1
{if(++count==20)
{count=0;
if(++second==60)
{second=0;
if(++minute==60)
{minute=0;
if(++hour==24)
液晶显示子程序:
#include"
intrins.h"
#include<
sbitrs=P2^4;
sbitrw=P2^5;
sbitep=P2^6;
externunsignedcharshow[16];
externunsignedintsecond,minute,hour;
voiddelay(unsignedcharms)
{unsignedchari;
while(ms--)
{for(i=0;
250;
i--)
{_nop_();
_nop_();
bitlcd_bz()
{bitresult;
rs=0;
rw=1;
ep=1;
_nop_();
result=(bit)(P0&
0x80);
ep=0;
returnresult;
voidLCD_cls()//LCD清屏
{while(lcd_bz());
rw=0;
P0=1;
voidlcd_wcmd(unsignedcharcmd)
{while(lcd_bz());
P0=cmd;
voidlcd_pos(unsignedcharpos)
{lcd_wcmd(pos|0x80);
voidlcd_wdat(unsignedchardat)
{while(lcd_bz());
rs=1;
P0=dat;
voidlcd_init()
{lcd_wcmd(0x38);
delay
(1);
lcd_wcmd(0x0c);
lcd_wcmd(0x06);
lcd_wcmd(0x01);
LCD_cls();
voiddisplay()
show[1]=hour/10+0x30;
show[2]=hour%10+0x30;
show[4]=minute/10+0x30;
show[5]=minute%10+0x30;
show[7]=second/10+0x30;
show[8]=second%10+0x30;
lcd_pos(0x42);
16;
i++)
lcd_wdat(show[i]);
四.系统仿真
初始化时,显示的时间
校准之后显示的时间
从仿真效果上来看基本上完成了,设计要求
五.系统整体电路图如下
六、系统测试及调试(仿真)
1)软件调试
软件调试,我们是在keil软件平台和单片机学习板上来完成的。
当我们写部分程序在keil软件经过调试,开始出现很多错误和警告。
通过逐个错误排错及修改。
得出下列经验:
(1)调用函数最好在头文件中进行申明,主函数写在最后;
(2)特别注意一些字母的大小写,一般要用英语文字写,不要用中文汉写,这是最不容易检查的,如我在检查液晶显示程序时,时钟没检查到错误,最后我删掉此行重新写,错误排除了,据我分析可能是中英文变换时出现问题。
经过一系列排错,最后文件没有错误但还有警告。
由于c语言中有警告是没关系的,我将HEX文件下在到单片机竟显示一些乱码。
我有回到文件,经过对警告的分析及上网查阅。
将程序稍微修改警告慢慢被排除,最后没有错误和警告了,下载到单片机,发现乱码竟然还出现,还有多个界面叠加显示,里面还有一些乱码。
经过分析,叠屏现象是没有对液晶清平所致。
于是我又在不同界面程序前加入调用填充空格函数(voidclrram_lcd()),然后又下载,结果与前面一样,崩溃啊!
经过几个小时后,无意间我去掉调用函数前void。
结果叠屏现象解决。
但是显示还是乱码。
又经过几天,排错,上网查阅与参考程序对照。
最后在voidR1302()函数中DS1302InputByte(ucAddr|0x01);
掉了|0x01,加上生成HEX文件,下载到单片机中。
能够正常显示了。
界面的闪烁不能闪烁。
经过一段时间,我发现界面程序中的a==1与功能设置中a重赋值(a=0)相冲突,最后将if()语句中a==1改为a==0。
相应的问题也解决了。
最后对程序进行相应的扩展完善,由于按键不灵敏我们加上声音程序。
加上另一个闹钟实现设计需求。
通过单片机学习板对照,程序基本实现我所预期的要求,但是界面显示闹钟1,闹钟2闪烁时,液晶竟然出现显示淡化。
据分析,可能使程序的问题。
由于这部分显示复杂,用了多个if语句,可能出现语句冗余。
2)硬件调试
硬件调试,我们用万用表,单片机学习板来完成的。
首先,我们调试LCD1602显示。
我将液晶显示程序下载到单片机内,连好所有的线,通电后,观察显示结果。
唉!
液晶竟然不显示。
我们用万用表测试各连线是否导通及某些点的电压,发现没问题。
最后在网上发现我的P0口竟然没接上拉电阻,通过计算电阻应该去5K至10K,我们选用4.7k的电阻。
由于没准备多的电阻,我在以前买的电阻找到了4.7k的电阻。
开始布局没有为上拉电阻留下空间,我们在单片机插槽里插电阻,解决一些连线的复杂度。
后来在调试液晶能够显示了。
然后,我们调试DS1302时钟芯片。
连上按键模块,液晶显示模块,单片机最小系统,时钟系统,温度系统,连接所有线,通上电源后,我们观察到液晶显示2085—85—8585:
85:
8520.125C温度能正常显示,时钟不能正常显示。
我们还是用万用表检查所用线路,对照电路原理图,最后发现时钟上拉电阻没焊上电源。
接上电源后,时钟能够正常显示,按键也能控制。
最后,我们对报警模块进行简单调试。
最后发现没问题。
七、结论
系统在仿真过程中比较顺利,没有出现什么大问题,在实际电路中,都表现的很完整,能实现预期的所有要求。