1、基于AT89C52的数字时钟 电子系统设计创新实验报告题目: 基于AT89C52的数字时钟 学生姓名: 学生学号: 专业名称: 电子信息工程 指导教师: 2013年12月29 日一系统总体设计 数字时钟设计框图如图所示,系统共由三部分组成:主控制器、按键控制电路,1602LCD显示电路。其中按键控制电路用于校准时,分,秒。1602液晶实时显示时间。二系统硬件电路设计 (1)系统的复位电路任何含有计算机的系统,在启动运行时都需要复位,以便CPU和系统中的其他部件都处于某一确定的初始状态,并从这个状态开始执行工作。同样,单片机在外界的干扰下出现程序跑飞或者进入死循环的状况时,需要人为低进行复位操作
2、,恢复正常状态。因此,手动复位是微机子系统的一个基本功能要求。复位电路如下图所示:该复位电路由R2,C3和开关K组成,当开关K断开时,C3两端电压较高,单片机RST端则为高电平,而当开关K闭合时,RST端接地,变为低电平,此时单片机复位(2)时钟电路此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。MCS-51内部有一个用于构成振荡器的高增益反相放大器。这个放大器外接晶体谐振器以及电容CX1和CX2构成并联谐振电路,接在放大器的反馈回路中构成时钟电路。时钟频率越高,单片机控制器的控制节拍越快,运算速度也就越快。(3)独立按键 本例所需要三个独立按键,由于此设计较功能简单,按键数目
3、较少。故本系统采用扫描式的独立按键,同时利用软件消抖。 (4)LCD1602 液晶显示 本设计仅需要显示数字和分隔号,故选择直接可以和5V的TTL电平兼容16*2的LCD1602 液晶集成模块 三系统软件设计 (1)软件流程图主函数流程图 (2)源程序主程序: #includeextern void display();extern void lcd_init(); sbit adjust_hour=P13; sbit adjust_minute=P14; sbit adjust_second=P15; unsigned int hour,minute,second; unsigned cha
4、r count,show16; void delay1() unsigned char i; for(i=0;i200;i+); void main() EA=1; ET0=1; TMOD=0X01; TH0=-5000/256; TL0=-5000%256; show3=:; show6=:; 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(!adju
5、st_second) display(); else if(adjust_minute=0) delay1(); if(adjust_minute=0) TR0=0; if(+minute=60) minute=0; while(!adjust_minute) display(); else if(adjust_hour=0) delay1(); if(adjust_hour=0) TR0=0; if(+hour=24) hour=0; while(!adjust_hour) display(); else TR0=1; display(); void timer()interrupt 1 i
6、f(+count=20) count=0; if(+second=60) second=0; if(+minute=60) minute=0; if(+hour=24) hour=0; 液晶显示子程序:#include intrins.h#includesbit rs=P24; sbit rw=P25;sbit ep=P26;extern unsigned char show16;extern unsigned int second,minute,hour;void delay(unsigned char ms) unsigned char i; while(ms-) for(i=0;i250
7、;i-) _nop_(); _nop_(); _nop_(); _nop_(); bit lcd_bz() bit result; rs=0; rw=1; ep=1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P0&0x80); ep=0; return result; void LCD_cls() /LCD清屏 while(lcd_bz(); rs=0; rw=0; P0=1; ep=1; ep=0; void lcd_wcmd(unsigned char cmd) while(lcd_bz(); rs=0; rw=0; ep=0; _
8、nop_(); _nop_(); P0=cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop_(); _nop_(); ep=0; void lcd_pos(unsigned char pos) lcd_wcmd(pos|0x80); void lcd_wdat(unsigned char dat) while(lcd_bz(); rs=1; rw=0; ep=0; P0=dat; _nop_(); _nop_(); _nop_(); _nop_(); ep=1; _nop_(); _nop_(); _nop
9、_(); _nop_(); ep=0; void lcd_init() lcd_wcmd(0x38); delay(1); lcd_wcmd(0x0c); delay(1); lcd_wcmd(0x06); delay(1); lcd_wcmd(0x01); delay(1); LCD_cls(); void display() unsigned char i; show1=hour/10+0x30; show2=hour%10+0x30; show4=minute/10+0x30; show5=minute%10+0x30; show7=second/10+0x30; show8=secon
10、d%10+0x30; lcd_pos(0x42); for(i=0;i16;i+) lcd_wdat(showi); 四系统仿真初始化时,显示的时间 校准之后显示的时间从仿真效果上来看基本上完成了,设计要求五系统整体电路图如下 六、系统测试及调试(仿真) 1) 软件调试 软件调试,我们是在keil软件平台和单片机学习板上来完成的。当我们写部分程序在keil软件经过调试,开始出现很多错误和警告。通过逐个错误排错及修改。得出下列经验:(1)调用函数最好在头文件中进行申明,主函数写在最后;(2)特别注意一些字母的大小写,一般要用英语文字写,不要用中文汉写,这是最不容易检查的,如我在检查液晶显示程序时
11、,时钟没检查到错误,最后我删掉此行重新写,错误排除了,据我分析可能是中英文变换时出现问题。 经过一系列排错,最后文件没有错误但还有警告。由于c语言中有警告是没关系的,我将HEX文件下在到单片机竟显示一些乱码。我有回到文件,经过对警告的分析及上网查阅。将程序稍微修改警告慢慢被排除,最后没有错误和警告了,下载到单片机,发现乱码竟然还出现,还有多个界面叠加显示,里面还有一些乱码。经过分析,叠屏现象是没有对液晶清平所致。于是我又在不同界面程序前加入调用填充空格函数(void clrram_lcd ()),然后又下载,结果与前面一样,崩溃啊!经过几个小时后,无意间我去掉 调用函数前void。结果叠屏现象
12、解决。但是显示还是乱码。 又经过几天,排错,上网查阅与参考程序对照。最后在void R1302()函数中DS1302InputByte(ucAddr|0x01);掉了|0x01,加上生成HEX文件,下载到单片机中。能够正常显示了。界面的闪烁不能闪烁。 经过一段时间,我发现界面程序中的a=1与功能设置中a重赋值(a=0)相冲突,最后将if()语句中a=1改为a=0 。相应的问题也解决了。 最后对程序进行相应的扩展完善,由于按键不灵敏我们加上声音程序。加上另一个闹钟实现设计需求。 通过单片机学习板对照,程序基本实现我所预期的要求,但是界面显示闹钟1,闹钟2闪烁时,液晶竟然出现显示淡化。据分析,可能
13、使程序的问题。由于这部分显示复杂,用了多个if语句,可能出现语句冗余。 2)硬件调试 硬件调试,我们用万用表,单片机学习板来完成的。首先,我们调试LCD1602显示。我将液晶显示程序下载到单片机内,连好所有的线,通电后,观察显示结果。唉!液晶竟然不显示。我们用万用表测试各连线是否导通及某些点的电压,发现没问题。最后在网上发现我的P0口竟然没接上拉电阻,通过计算电阻应该去5K至10K,我们选用4.7k的电阻。由于没准备多的电阻,我在以前买的电阻找到了4.7k的电阻。开始布局没有为上拉电阻留下空间,我们在单片机插槽里插电阻,解决一些连线的复杂度。后来在调试液晶能够显示了。 然后,我们调试DS1302时钟芯片。连上按键模块,液晶显示模块,单片机最小系统,时钟系统,温度系统,连接所有线,通上电源后,我们观察到液晶显示 20858585 85:85:85 20.125C 温度能正常显示,时钟不能正常显示。我们还是用万用表检查所用线路,对照电路原理图,最后发现时钟上拉电阻没焊上电源。接上电源后,时钟能够正常显示,按键也能控制。 最后,我们对报警模块进行简单调试。最后发现没问题。七、结论系统在仿真过程中比较顺利,没有出现什么大问题,在实际电路中,都表现的很完整,能实现预期的所有要求。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1