电子钟课程设计.docx
《电子钟课程设计.docx》由会员分享,可在线阅读,更多相关《电子钟课程设计.docx(36页珍藏版)》请在冰点文库上搜索。
电子钟课程设计
信息科学与技术学院
单片机原理及应用
课程设计报告
课题名称:
基于STC89C52单片机电子钟设计
学生姓名:
黄友
学号:
2010508119
专业年级:
电信10
(2)班
指导教师:
张更新
完成时间:
2013-07-04
基于STC89C52单片机电子钟设计
1.单片机电子钟系统概述
1.1电子钟的描述
数字电子钟是采用电子电路实现对年、月、日、时、分、秒数字显示的计时装置,由于数字集成电路的发展和石英晶体震荡器的广泛应用,使得数字电子钟的精度远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,成为人们日常生活中不可缺少的必需品。
1.2电子钟的概述
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
随着科技的发展和社会的进步,人们对钟表的要求也越来越高,传统的钟表已不能满足人们的需求。
单片机在多功能电子钟中的应用已是非常普遍的,人们对电子钟的功能及工作顺序都非常熟悉。
电子时钟是采用数字电路实现对时间、日期数字显示的计时装置,是人们日常生活中必不可少的必需品,广泛用于个人家庭以及车站、航站、剧院、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各个仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理;以及我们生活中广泛使用的各种智能IC卡等,这些都离不开单片机。
以前没有单片机时,这些东西也能做,但是智能使用复杂的模拟电路、然而这样做出来的产品不仅体积大,而且成本高,并且由于长期使用,与元件不断老化,控制精度自然也会达不到标准。
在单片机产生后,我们就将控制这些东西变为智能化了,我们只需要在单片机外围接一点简单的接口电路,核心部分只是由人为的写入程序来完成。
这样产品的体积变小了,成本也降低了。
随着电子技术的飞速发展,家用电器和办公电子设备逐渐增多,不同的设备都有自己的控制器,使用起来很不方便。
根据这种实际情况,设计了一个单片机多功能电子钟系统,他可以避免多种控制器的混淆,利用一个控制器对多路电器进行控制,同时又可以进行时钟校准,它可以任意设置时间。
这种具有人们所需要的智能化特性的产品减轻了人们的劳动,扩大了数字化的范围,为家庭数字化提供了可能。
2.题目及要求
2.1题目
基于STC89C52单片机电子钟设计
2.2要求
(1)在LCD1602液晶显示器上显示年份、月、日、星期、时、分、秒。
(2)年-月-日-星期显示在第一行,格式XX-XX-XX-星期X;时-分-秒显示在第二行,格式XX-XX-XX(24小时格式)。
(3)用按键任意更改显示的时间:
1)K13按键功能是停止时钟,进行设置显示的时间,光标移动。
2)在K13按下的时候,K14进行时间的增加。
按一次就增加1。
3)在K13按下的时候,K15进行时间的减少。
按一次就减少1。
3.方案选择与论证
3.1单片机芯片的选择方案和论证
3.1.1、方案一:
采用STC89C52芯片作为硬件核心。
STC89C52内部具有8KBROM存储空间,512字节数据存储空间,带有2K字节的EEPROM存储空间,与MCS-51系列单片机完全兼容,STC89C52可以通过串口下载。
3.1.2、方案二:
采用AT89S52。
AT89S52片内具有8K字节程序存储空间,256字节的数据存储空间没有EEPROM存储空间,也与MCS-51系列单片机完全兼容,具有在线编程可擦除技术。
由两种单片机都完全能够满足设计需要,而STC89C52相对ATS89C52价格便宜,且抗干扰能力强。
考虑到成本因素,因此选用STC89C52。
3.2显示模块选择方案和论证
3.2.1、方案一:
采用点阵式数码管显示。
点阵式数码管是由八行八列的发光二极管组成,可用来显示数。
但体积较大,且价格也相对较高,从便携实用的角度出发,不采用此种方案。
3.2.2、方案二:
采用LED数码管动态扫描。
LED数码管价格便宜,对于显示数字最合适,但功耗较大,且显示容量不够,所以也不用此种方案。
3.2.3、方案三:
采用LCD液晶显示屏。
液晶显示屏的显示功能强大,可显示大量文字,显示多样,清晰可见,且价格适中,所以采用了LCD数码管作为显示。
3.3电路设计最终方案决定
综上各方案所述,对此次作品的方案选定:
采用STC89C52单片机作为主控制系统;采用1602LCD液晶作为显示器件。
4.硬件原理电路图的设计及分析
4.1STC89C52介绍
4.1.1STC89C52主要功能及PDIP封装
STC89C52是由深圳宏晶科技公司生产的与工业标准MCS-51指令集和输出管脚相兼容的单片机。
STC89C52主要功能如表4.1所示,其PDIP封装如图4.1所示
主要功能特性
兼容MCS51指令系统
8K可反复擦写FlashROM
32个双向I/O口
256x8bit内部RAM
3个16位可编程定时/计数器中断
时钟频率0-24MHz
2个串行中断
可编程UART串行通道
2个外部中断源
共6个中断源
2个读写中断口线
3级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功能
表4.1STC89C52主要功能
4.1.2STC89C52引脚介绍
(1)主电源引脚(2根)
VCC(Pin40):
电源输入,接+5V电源
GND(Pin20):
接地线
(2)外接晶振引脚(2根)
XTAL1(Pin19):
片内振荡电路的输入端
XTAL2(Pin20):
片内振荡电路的输出端
(3)控制引脚(4根)
RST/VPP(Pin9):
复位引脚,引脚上出现2个机器周期的高电平将使单片机复位
ALE/PROG(Pin30):
地址锁存允许信号
PSEN(Pin29):
外部存储器读选通信号
EA/VPP(Pin31):
程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
(4)可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
P0口(Pin39~Pin32):
8位双向I/O口线,名称为P0.0~P0.7
P1口(Pin1~Pin8):
8位准双向I/O口线,名称为P1.0~P1.7
P2口(Pin21~Pin28):
8位准双向I/O口线,名称为P2.0~P2.7
P3口(Pin10~Pin17):
8位准双向I/O口线,名称为P3.0~P3.7
图4.1STC89C52PDIP封装图
4.1.3STC89C52最小系统
最小系统是指能进行正常工作的最简单电路。
STC89C52最小应用系统电路如图4.2所示。
它包含五个电路部分:
电源电路、时钟电路、复位电路、片内外程序存储器选择电路、输入/输出接口电路。
其中电源电路、时钟电路、复位电路是保证单片机系统能够正常工作的最基本的三部分电路,缺一不可。
(1)电源电路芯片引脚VCC一般接上直流稳压电源+5V,引脚GND接电源+5V的负极,电源电压范围在4~5.5之间,可保证单片机系统能正常工作。
为提高电路的抗干扰性能,通常在引角Vcc与GND之间接上一个10uF的电解电容和一个0.1uF陶片电容,这样可抑制杂波串扰,从而有效确保电路稳定性。
(2)时钟电路单片机引脚18和引脚19外接晶振及电容,STC89C52芯片
工作频率可在2~33MHz范围之间选,单片机工作频率取决于晶振XT的频率,通常选用11.0592MHz晶振。
两个小电容通常取值3pF,以保证振荡器电路的稳定性及快速性。
(3)复位电路一般若在引脚RST上保持24个工作主频周期的高电平,单片机就可以完成复位,但为了保证系统可靠地复位,复位电路应使引脚RST保持10ms以上的高电平。
如图复位电路带有上电自动复位功能,当电路上电时,由于C1电容两端电压值不能突变,电源+5V会通过电容向RST提供充电电流,因此在RST引脚上产生一高电平,使单片机进入复位状态。
随着电容C1充电,它两端电压上升使得RST电位下降,最终使单片机退出复位状态。
正常运行时,可按复位按钮对单片机复位
图4.2STC89C52最小系统
4.2LCD1602液晶显示器介绍
4.2.1LCD1602液晶概述
工业字符型液晶,LCD1602是指显示的内容为16*2,能同时显示两行,每行16个字符。
常见的1602字符液晶有两种,一种显示绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上绝大多数基于HD44780液晶芯片控制,原理是完全相同的。
本课题所用LCD1602液晶模块,显示屏是蓝色背光白色字体。
如图4.3所示
图4.3LCD1602字符液晶
4.2.2LCD1602引脚介绍(如表4.2)
编号
符号
引脚说明
编号
符号
引脚说明
1
GND
电源地
2
VCC
电源正极
3
VO
液晶显示对比度调节端
4
RS
数据/命令选择端
5
R/W
读写选择
6
E
使能信号
7
D0
数据口
8
D1
数据口
9
D2
数据口
10
D3
数据口
11
D4
数据口
12
D5
数据口
13
D6
数据口
14
D7
数据口
15
BLA
背光电源正
16
BLK
背光电源负
表4.2LCD1602字符液晶引脚说明
各个引脚具体功能说明:
第1脚:
GND为地电源。
第2脚:
VCC接5V正电源。
第3脚:
VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生重影,使用一个1K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
DB0~DB7为8位双向数据线。
第15~16脚:
背光灯电源。
4.2.3LCD1602字符液晶使用方法
(1)基本操作时序(如表4.3、图4.4、5)
操作
输入
输出
读状态
RS=L,RW=H,E=H
D0~D7=状态字
读数据
RS=H,RW=H,E=H
D0~D7=数据
写数据
RS=H,RW=L,D0~D7=数据,E=高脉冲
无
表4.3LCD1602字符液晶读写状态表
图4.4LCD1602液晶写时序图
图4.5LCD1602液晶读时序图
(2)RAM
LCD1602液晶控制器芯片内部带有80个8位的RAM缓冲区,其地址和屏幕的对应关系如图4.6示
图4.6RAM缓冲区
5.系统流程图
5.1电路设计框图(如图5.1)
图5.1系统框图
5.2系统流程图(如图5.2)
5.3硬件框图
5.3.1LCD1602框图
程序主要实现对信息的显示,包括年、月、日、星期、时、分、秒等信息,在这里要注意它的读写控制指令。
其流程图如图5.3所示。
5.3.2STC89C52
框图(如图5.4)
图5.4STC89C52框图
6、编程思路
编程思路是,在确定了时钟要实现的功能后按照上述各按键所实现的效果编写程序。
本程序包含液晶写指令函数(write_com())、写数据函数(write_data())、初始化函数(init())、写入时分秒函数(write_sfm())、写入月和日函数(write_nyr())【别指出,由于年包含四位数字其写法与月和日不同,故单独设置一个写入年函数】、写入星期函数(write_xq())和键盘扫描函数,这些程序围绕主函数互相嵌套调用。
7、系统评价
此时钟设计是利用STC89C52单片机进行设计,基本上实现了课程设计要求实现的功能。
硬件部分设置了的4个按键。
当按键K13按下时,进入光标显示状态,计数器停止工作,时钟也停止,进入设置时间的状态。
在K13按下的情况,按键K14按下时,对应光标的数据随着K14按键的按下的次数而变化,具体是按键一次就是增加一个单位。
在K13按下的情况,按键K15按下时,对应光标的数据随着K15按键的按下的次数而变化,具体是按键一次就是少一个单位。
在增加和减少设置的选项中也加入了闰年平年的判断,更利于设置。
K16按下的时候,推出设置状态,计数器工作,开始计时。
调试阶段,出现一些问题。
比如,实际小时显示到29才归零,分钟显示到60才进一……,以上问题均一一排除,结果达到预期目标。
但时间有限,1,按键问题。
我的设计中,很多功能选择是通过按键开关实现的。
在仿真中发现,调整数值时,有时按键反应太快,按一次,跳了几下,使设置时间,日期很不方便。
但是仿真多了之后,找到了按键(实际上是按鼠标)的节奏,对按键的掌控力提高了不少,不怎么会出现跳变的情况了。
有些开关我采用了长按键的方式来防抖,效果不错,但是每次都要长按键,调整效率太低,我没有普及。
本来想把所有的按键都加延时防抖电路,但仿真中感觉对键盘的控制力没提高多少,有时还是会出问题,这个方案放弃了。
索性将板子焊接出来了在调试软件吧,仿真毕竟不是那么“真”啊!
实际电路调试中,按键反应没有出现过于灵敏的问题,基本可控制。
出现以上问题,我认为是电路板上焊接点太多,接触不是很好,影响了信号的传输时间,从而解决了按键问题!
也有可能是按键质量问题,接触不良。
8、心得体会
一分耕耘,一分收获。
只有亲自用实践来验证这句话,在能得其要领。
经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。
虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。
在实验的开始几天,基本上没有收获,不知何从下手,不知所措。
为了看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我阅读了不少。
随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。
有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。
9.参考文献
(1)、瓮嘉民单片机应用开发技术中国电力出版社
(2)、肖婧单片机系统设计与仿真北京航空航天大学出版社
(3)、张晓乡89C51单片机实用教程电子工业出版社
(4)、于海生微型计算机控制技术清华大学出版社
(5)、孙涵芳MCS-51系列单片机原理及应用北京航空航天大学社
(6)、黄正谨综合电子设计与实践东南大学出版社
(6)、杨欣等电子设计从零开始清华大学出版社
(7)、谢嘉奎电子线路高等教育出版社
(8)、王毓银数字电路逻辑设计高等教育出版社
(9)、邱关源电路高等教育出版社
10.程序代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P1^0;
sbitRW=P1^1;
sbitE=P1^5;
sbits1=P2^4;
sbits2=P2^5;
sbits3=P2^6;
sbits4=P2^7;
sbitspeaker=P2^0;
ucharcodetable[]="2099-12-31MON";
ucharcodetable1[]="23:
58:
5023:
59";
ucharnum,count,shi=23,fen=58,miao=50;
ucharyue=12,ri=31;
uintnian=2099;
uchars1num,xq;
charNshi=23,Nfen=59,clock;
voiddelay(ucharz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
RS=0;
RW=0;
P0=com;
delay(5);
E=0;
delay(5);
E=1;
}
voidwrite_data(uchardate)
{
RS=1;
RW=0;
P0=date;
delay(5);
E=0;
delay(5);
E=1;
}
voidinit()//初始化
{
delay(15);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
write_com(0x01);
write_com(0x80);
write_com(0x02);
for(num=0;num<15;num++)
{
write_data(table[num]);
delay(20);
}
write_com(0x80+0x41);
for(num=0;num<15;num++)
{
write_data(table1[num]);
delay(20);
}
TMOD=0x01;//t016位计数器
EA=1;
ET0=1;
TR0=1;
TH0=(65536-50000)/256;//赋值初值12MHz晶振
TL0=(65536-50000)%256;
}
voidwrite_sfm(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);//
write_data(0x30+ge);
}
voidwrite_nyr(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidwrite_nian(ucharadd,uintyear)
{
uintqian,bai,shi,ge;
qian=year/1000;//2413/1000=2
bai=(year%1000)/100;//(2413%1000)=413413/100=4
shi=((year%1000)%100)/10;//413%100=1313/10=1
ge=(((year%1000)%100))%10;//13%10=3
write_com(0x80+add);
write_data(0x30+qian);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidwrite_xq1(ucharadd)
{
write_com(0x80+add);
write_data(0x40+0x0d);
write_data(0x40+0x0f);
write_data(0x40+0x0e);
}
voidwrite_xq2(ucharadd)
{
write_com(0x80+add);
write_data(0x54);
write_data(0x55);
write_data(0x45);
}
voidwrite_xq3(ucharadd)
{
write_com(0x80+add);
write_data(0x50+4);
write_data(0x40+8);
write_data(0x50+5);
}
voidwrite_xq4(ucharadd)
{
write_com(0x80+add);
write_data(0x57);
write_data(0x45);
write_data(0x4e);
}
voidwrite_xq5(ucharadd)
{
write_com(0x80+add);
write_data(0x46);
write_data(0x52);
write_data(0x49);
}
voidwrite_xq6(ucharadd)
{
write_com(0x80+add);
write_data(0x53);
write_data(0x41);
write_data(0x54);
}
voidwrite_xq7(ucharadd)
{
write_com(0x80+add);
write_data(0x53);
write_data(0x55);
write_data(0x4e);
}
voidwrite_naozhong(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidkeyscan()
{
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!
s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+8);
write_com(0x0f);
}
if(s1num==2)
{
write_com(0x80+0x40+5);
}
if(s1num==3)
{
write_com(0x80+0x40+2);
}
if(s1num==4)
{
write_com(0x80+4);
}
if(s1num==5)
{
write_com(0x80+7);
}
if(s1num==6)
{
write_com(0x80+10);
}
if(s1num==7)
{
write_com(0x80+12);
}
if(s1num==8)
{
write_com(0x80+0x40+12);
}
if(s1num==9)
{
write_com(0x80+0x40+15);
}
if(s1num==10)
{