基于AT89C52的数字时钟.docx

上传人:b****8 文档编号:10836259 上传时间:2023-02-23 格式:DOCX 页数:15 大小:185.39KB
下载 相关 举报
基于AT89C52的数字时钟.docx_第1页
第1页 / 共15页
基于AT89C52的数字时钟.docx_第2页
第2页 / 共15页
基于AT89C52的数字时钟.docx_第3页
第3页 / 共15页
基于AT89C52的数字时钟.docx_第4页
第4页 / 共15页
基于AT89C52的数字时钟.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于AT89C52的数字时钟.docx

《基于AT89C52的数字时钟.docx》由会员分享,可在线阅读,更多相关《基于AT89C52的数字时钟.docx(15页珍藏版)》请在冰豆网上搜索。

基于AT89C52的数字时钟.docx

基于AT89C52的数字时钟

电子系统设计创新实验报告

题  目:

基于AT89C52的数字时钟

学生姓名:

学生学号:

专业名称:

 电子信息工程 

指导教师:

    

 

2013年 12 月 29日

 

一.系统总体设计

数字时钟设计框图如图所示,系统共由三部分组成:

主控制器、按键控制电路,1602LCD显示电路。

其中按键控制电路用于校准时,分,秒。

1602液晶实时显示时间。

二.系统硬件电路设计

(1)系统的复位电路

任何含有计算机的系统,在启动运行时都需要复位,以便CPU和系统中的其他部件都处于某一确定的初始状态,并从这个状态开始执行工作。

同样,单片机在外界的干扰下出现程序跑飞或者进入死循环的状况时,需要人为低进行复位操作,恢复正常状态。

因此,手动复位是微机子系统的一个基本功能要求。

复位电路如下图所示:

该复位电路由R2,C3和开关K组成,当开关K断开时,C3两端电压较高,单片机RST端则为高电平,而当开关K闭合时,RST端接地,变为低电平,此时单片机复位

(2)时钟电路

此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。

MCS-51内部有一个用于构成振荡器的高增益反相放大器。

这个放大器外接晶体谐振器以及电容CX1和CX2构成并联谐振电路,接在放大器的反馈回路中构成时钟电路。

时钟频率越高,单片机控制器的控制节拍越快,运算速度也就越快。

(3)独立按键

本例所需要三个独立按键,由于此设计较功能简单,按键数目较少。

故本系统采用扫描式的独立按键,同时利用软件消抖。

(4)LCD1602液晶显示

本设计仅需要显示数字和分隔号,故选择直接可以和5V的TTL电平兼容16*2的LCD1602液晶集成模块

三.系统软件设计

(1)软件流程图

 

主函数流程图

 

(2)源程序

主程序:

#include

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)

{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();

}

}

}

voidtimer()interrupt1

{if(++count==20)

{count=0;

if(++second==60)

{second=0;

if(++minute==60)

{minute=0;

if(++hour==24)

hour=0;

}

}

}

}

液晶显示子程序:

#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;i<250;i--)

{_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

bitlcd_bz()

{bitresult;

rs=0;

rw=1;

ep=1;

_nop_();

_nop_();

_nop_();

_nop_();

result=(bit)(P0&0x80);

ep=0;

returnresult;

}

voidLCD_cls()//LCD清屏

{while(lcd_bz());

rs=0;

rw=0;

P0=1;

ep=1;

ep=0;

}

voidlcd_wcmd(unsignedcharcmd)

{while(lcd_bz());

rs=0;

rw=0;

ep=0;

_nop_();

_nop_();

P0=cmd;

_nop_();

_nop_();

_nop_();

_nop_();

ep=1;

_nop_();

_nop_();

_nop_();

_nop_();

ep=0;

}

voidlcd_pos(unsignedcharpos)

{lcd_wcmd(pos|0x80);

}

voidlcd_wdat(unsignedchardat)

{while(lcd_bz());

rs=1;

rw=0;

ep=0;

P0=dat;

_nop_();

_nop_();

_nop_();

_nop_();

ep=1;

_nop_();

_nop_();

_nop_();

_nop_();

ep=0;

}

voidlcd_init()

{lcd_wcmd(0x38);

delay

(1);

lcd_wcmd(0x0c);

delay

(1);

lcd_wcmd(0x06);

delay

(1);

lcd_wcmd(0x01);

delay

(1);

LCD_cls();

}

voiddisplay()

{unsignedchari;

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);

for(i=0;i<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温度能正常显示,时钟不能正常显示。

我们还是用万用表检查所用线路,对照电路原理图,最后发现时钟上拉电阻没焊上电源。

接上电源后,时钟能够正常显示,按键也能控制。

最后,我们对报警模块进行简单调试。

最后发现没问题。

 

七、结论

系统在仿真过程中比较顺利,没有出现什么大问题,在实际电路中,都表现的很完整,能实现预期的所有要求。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1