基于单片机的数字时钟加闹钟的设计与制作毕业设计 精品Word下载.docx
《基于单片机的数字时钟加闹钟的设计与制作毕业设计 精品Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字时钟加闹钟的设计与制作毕业设计 精品Word下载.docx(32页珍藏版)》请在冰豆网上搜索。
一是用软件实现,即用单片机内部的
可编程定时器计数器来实现;
二是用专门的时钟芯片实现。
1.2研究目的
通过利用STC89C52单片机和DS1302芯片以及外围的按键和LCD显示器等部件,设计一个基于单片机的电子时钟。
设计的电子时钟通过液晶显示器显示,并能通过按键对时间以及闹钟进行置。
1.3系统基本方案选择和论证
1.3.1单片机芯片的选择方案和论证:
方案一:
采用STC89C52芯片作为硬件核心。
STC89C52内部具有8KBROM存储空间,512字节数据存储空间,带有2K字节的EEPROM存储空间,与MCS-51系列单片机完全兼容,STC89C52可以通过串口下载。
方案二:
采用AT89S52。
AT89S52片内具有8K字节程序存储空间,256字节的数据存储空间没有EEPROM存储空间,也与MCS-51系列单片机完全兼容,具有在线编程可擦除技术。
两种单片机都完全能够满足设计需要,STC89C52相对ATS89C52价格便宜,且抗干扰能力强。
考虑到成本因素,因此选STC89C52。
1.3.2显示模块选择方案和论证:
方案一:
采用点阵式数码管显示。
点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且也相对较高,所以不用此种作为显示。
方案二:
采用LED数码管动态扫描。
LED数码管价格便宜,对于显示数字最合适,但功耗较大,且显示容量不够,所以也不用此种方案。
方案三:
采用LCD液晶显示屏。
液晶显示屏的显示功能强大,可显示大量文字,显示多样,清晰可见,且价格适中,所以采用LCD数码管作为显示。
1.3.3时钟芯片的选择方案和论证:
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。
采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。
所以不采用此方案。
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.
1.3.4电路设计最终方案确定
综上各方案所述,对此次作品的方案选定:
采用STC89C52单片机作为主控制系统;
采用DS1302作为时钟芯片;
采用LCD1602液晶作为显示器件。
1.4硬件系统框图
该系统采用单片机89C52作为控制芯片,把DS1302计时模块传来的信息和键盘输入的指令进行处理,控制着液晶屏LCD1602的显示和蜂鸣器的驱动。
2主要元件介绍
2.1STC89C52以及最小系统介绍
2.1.1ST89C52单片机:
1.主要性能参数:
①与MCS-51产品指令和引脚完全兼容。
②8字节可重擦写FLASH闪速存储器
③1000次擦写周期
④全静态操作:
0HZ-24MHZ
⑤三级加密程序存储器
⑥256X8字节内部RAM
⑦32个可编程I/0口线
⑧3个16位定时/计数器
⑨8个中断源
⑩可编程串行UART通道、低功耗空闲和掉电模式。
2.功能特性:
STC89C52提供以下标准功能:
8字节FLASH闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电上作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器.串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位.
3.管脚图:
STC89C52引脚介绍:
①主电源引脚(2根)
VCC(Pin40):
电源输入,接+5V电源
GND(Pin20):
接地线
②外接晶振引脚(2根)
XTAL1(Pin19):
片内振荡电路的输入端
XTAL2(Pin20):
片内振荡电路的输出端
③控制引脚(4根)
RST/VPP(Pin9):
复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(Pin30):
地址锁存允许信号
PSEN(Pin29):
外部存储器读选通信号
EA/VPP(Pin31):
程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(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
2.1.2计时芯片DS1302:
1.概述:
DS1302是DALLAS公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整。
时钟操作可通过AM/PM指示决定采用24或12小时格式。
DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线①RES复位②I/O数据线③SCLK串行时钟。
RAM的读/写数据以一个字节或多达31个字节的字符组方式通信。
DS1302工作时功耗很低保持数据和时钟信息时功率小于1mW。
2.DS1302功能特性:
双电源管脚用于主电源和备份电源供应VCC1为可编程涓流充电电源;
附加七个字节的存储器;
实时时钟具有能计算2100年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力31*8位暂存数据存储RAM;
串行I/O口方式使得管脚数量最少;
宽范围工作电压2.0~5.5V;
工作电流2.0V时,小于300nA;
读/写时钟或RAM数据时有两种传送方式:
单字节传送和多字节传送字符组方式;
8脚DIP封装或可选的8脚SOIC封装;
简单3线接口;
与TTL兼容(VCC=5V);
可选工业级温度范围:
-40℃~+85℃。
3.管脚描述:
X1、X2——32.768KHz晶振管脚
GND——地
RST——复位脚
I/O——数据输入/输出引脚
SCLK——串行时钟
VCC1、VCC2——电源供电管脚
4.DS1302的控制字如表所示。
控制字节最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1指示操作单元的地址;
最低有效位(位0)如为0表示要进行写操作,为1表示进
行读操作,控制字节总是从最低位开始传输。
数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
其读写时序如图示:
2.1.3字符液晶显示屏LCD1602资料:
1.概述:
工业字符型液晶,1602是指显示的内容为16*2,即能够同时显示两行,每行16个符。
常见的1602字符液晶有两种,一种显示的是绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的。
本课题所用1602液晶模块,显示屏是蓝色背光白色字体。
如图
2.引脚功能说明:
第1脚:
GND为地电源。
第2脚:
VCC接5V正电源。
第3脚:
VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,
对比度过高时会产生重影,使用一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
DB0~DB7为8位双向数据线。
第15~16脚:
背光灯电源。
DS1302读写时序
3.LCD1602液晶屏的使用时序:
4.LCD1602存储器RAM:
1602液晶控制器芯片内部带有80个8位的RAM缓冲区,其地址和屏幕的对应关系如图示:
2.1.4电源模块:
系统的供电采用5V供电,具体的连接如图示:
变压器采用的是:
AC220~AC9V,稳压芯片是LM7805。
3.硬件电路连接图:
以STC89C52单片机最小系统为核心控制,时钟电路由DS1302芯片提供,采用三线与单片机进行通信,用四个独立的按键进行年、月、日、时间、星期等调整,最终的结果通过LCD1602液晶显示屏显示出来。
3.1单片机的连接图
其中XTAL1和XTAL2接11.0592MHZ的晶振,RST经开关接+5V,控制系统的复位。
P1口与DS1302计时模块连接,进行通信与对其控制。
P2口与LCD1602液晶显示模块连接,控制着LCD1602的显示。
P3口与按键连接,通过P3口输入控制信号。
3.2DS1302计时模块
其中X1、X2接晶振32.768KHZ,VCC1、VCC2接电源I/O接单片机的P1.1,,进行数据的交换,SCLK接单片机的P1.0,RST接单片机的P1.2引脚,进行指令的接收。
3.3LCD1602液晶显示模块
其中DB0~DB7分别接单片机的P2.0~P2.7,进行数据的传输,VO接电阻进行背光亮度的调节,RS、RW和EN分别接单片机的P1.3~P1.5,用于单片机的指令接收。
3.4按键模块
开关一端接地,另一端接P3.0~P3.3,单片机用检测P3.0~P3.3引脚的电位判断是否有键按下。
4.系统的软件设计:
4.1软件设计流程图:
首先,编写主程序,对计时模块DS1302和显示模块LCD1602进行初始化,同时定义计时模块、显示模块和按键模块的控制程序,之后读取DS1302计时模块预先设定数据,显示模块LCD1602进行显示。
按键检测程序一直在检测是否有键按下,如果S1键按下一次,主函数调用计时控制和显示控制的函数对秒进行操作,此时秒闪烁,如果此时按下S2、S3可对其进行加减调整;
按下如果S1按下两次,主函数调用计时控制和显示控制的函数对分进行操作,此时分闪烁,如果此时按下S2、S3可对其进行加减调整;
按下如果S1按下三次,主函数调用计时控制和显示控制的函数对时进行操作,此时时闪烁,如果此时按下S2、S3可对其进行加减调整;
按下如果S1按下四次,主函数调用计时控制和显示控制的函数对年进行操作,此时年闪烁,如果此时按下S2、S3可对其进行加减调整;
按下如果S1按下五次,主函数调用计时控制和显示控制的函数对月进行操作,此时月闪烁,如果此时按下S2、S3可对其进行加减调整;
按下如果S1按下六次,主函数调用计时控制和显示控制的函数对日进行操作,此时日闪烁,如果此时按下S2、S3可对其进行加减调整;
按下如果S1按下七次,主函数调用计时控制和显示控制的函数对周进行操作,此时周闪烁,如果此时按下S2、S3可对其进行加减调整;
按下如果S1按下八次,程序进入主函数。
5.系统的调试:
将系统的电源、计时模块、按键模块、显示模块、控制模块,按照附录一的电路做成PCB电路板,把元器件焊接在板子上。
进行硬件的搭建。
搭建好硬件之后,将编译好的软件程序下载到STC89C52中。
检查无误后,接通电源,看是否能够实现预期的功能。
在单个的模块调试中,各个模块均能够正常稳定的工作,但是在将它们装配在一块,进行整体的调试时,就出现了其他一些问题,不能实现预期的功能。
经过仔细的检查和查阅资料、询问老师同学等方式,进行解决。
现在系统能够稳定、正常的工作。
调试过程:
①检查各个器件完好,连接正常之后,接通电源,此时电源指示灯亮,液晶显示屏LCD1602同时亮,依次出现开机画面;
②数秒之后,显示初始的年、月、日、星期、时、分、秒。
③通过模式选择键可以在时间显示模式和闹钟模式之间切换,④通过移位键可以使液晶屏上的光标依次移位,⑤将光标移位在想要的调节的位置,按加、减键可以进行该位置的数字的调整。
⑥加、减键可以在按下移位键之后,调节光标闪烁位置的数字。
⑦将模式切换到闹钟模式,依次调整时、分,当时间到预设的时间,蜂鸣器发出”滴滴…”声。
6.总结:
通过本次课程设计,使我加深了对单片机的认识,并且掌握了单片机系统的设计、制作流程,收获丰硕。
功能上基本达标:
时钟与闹钟的显示,调时间和闹钟功能以及闹钟鸣叫功能。
时钟与闹钟显示功能,精确度完全可以满足日常生活显示时间的需要;
调时间与闹钟功能,方便快捷。
硬件设施基本合乎要求,软件设计可以配合硬件实现其功能。
技术在不断进步,机械式时钟已经被淘汰,取而代之的是具有高度准确性和直观性且无机械装置,具有更长的使用寿命等优点的电子时钟。
电子时钟更具人性化,更能提高人们的生活质量,更受人们欢迎。
机械时代已经远去,电子时代已经到来。
做为新时代的我们,更应该提高自身能力,适应新时代的发展。
知识来自实践,多从生活中探寻所需要的。
从这次的课程设计中,我真正的体会到,知识的重要性,特别是要理论联系实际,把我们所学的理论知识运用到实际生活当中,学以致用。
参考文献
[1]李广第,朱月秀,冷租祁.单片机基础第三版.北京:
北京航空航天大学出版社(1——259)。
[2]李庆亮.C语言程序设计实用教程.北京:
机械工业出版社,2005.3(1——100)。
[3]康华光.电子技术基础数字部分.北京:
高等教育出版社,2008(1——560)。
[3]康华光.电子技术基础模拟部分.北京:
[4]杨志忠.数字电子技术.北京:
高等教育出版社,2003.12(30——100)。
[5]及力.Protel99SE原理图与PCB设计教程.北京:
电子工业出版社,2007.8(48——100)。
[6]杨欣.电子设计从零开始.北京:
清华大学出版社,2005(10——200)。
[12]邢小杰.单片机电子时钟设计.中国科技博览,2009。
附录一:
整体电路连接图:
附录二:
源程序代码:
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
bitflag;
uchars1num;
charnian,yue,ri,shi,fen,miao,week;
chara_fen=10,a_shi=10;
//初始值年周月时分秒
ucharkaiji[]="
^-^-Welcome!
-^-^"
;
//开机画面显示
ucharkaiji1[]="
***GoodLuck!
***"
//123456789abcdefg
ucharalarm_table[]="
Alarm:
"
ucharwrite_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
ucharread_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
sbitrs=P1^5;
//1602定义
sbitrw=P1^4;
sbite=P1^3;
sbitsck=P1^0;
//1302定义
sbitio=P1^1;
sbitrst=P1^2;
sbits1=P3^2;
//调整按键
sbits2=P3^1;
//加1
sbits3=P3^0;
//减1
sbits4=P3^3;
//模式选择
sbitdd=P3^4;
//蜂鸣器
voiddelay_1ms(ucharm)//延时函数
{
uchari,j;
for(j=0;
j<
m;
j++)
for(i=0;
i<
110;
i++);
}
voidbeep()//蜂鸣器发声
{
dd=0;
delay_1ms(50);
dd=1;
voidwrite_com(ucharcom)//lcd1602写指令
e=0;
rs=0;
rw=0;
P2=com;
delay_1ms
(1);
e=1;
voidwrite_data(uchardat)//lcd1602写数据
rs=1;
P2=dat;
voidwrite_sfm(ucharadd,uchardat)//时分秒刷新显示函数
ucharshi,ge;
shi=dat/10;
ge=dat%10;
write_com(0xc0+add);
write_data(0x30+shi);
write_data(0x30+ge);
voidwrite_nyr(ucharadd,uchardat)//年月日刷新显示函数
write_com(0x80+add);
voidwrite_ds1302_byte(ucharadd)//ds1302
uchari;
8;
i++)
{
sck=0;
io=add&
0x01;
add=add>
>
1;
sck=1;
}
voidwrite_ds1302(ucharadd,uchardat)
rst=0;
_nop_();
sck=0;
rst=1;
write_ds1302_byte(add);
write_ds1302_byte(dat);
io=1;
sck=1;
voidwrite_tran_data(ucharadd,uchardat)//十进制转换成BCD码
uchart;
t=dat/10;
dat=dat%10;
dat=t<
<
4|dat;
write_ds1302(0x8e,0x00);
//去除写保护
write_ds1302(add,dat);
//给指定的地址写数据
write_ds1302(0x8e,0x80);
//加写保护
ucharread_ds1302(ucharadd)//读ds1302数据
ucharvulue,i;
rst=0;
{sck=0;
vulue=vulue>
if(io)
vulue=vulue|0x80;
vulue=(vulue>
4)*10+(vulue&
0x0f);
//BCD码转换成十进制
returnvulue;