基于单片机的数字钟设计设计Word下载.docx
《基于单片机的数字钟设计设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字钟设计设计Word下载.docx(58页珍藏版)》请在冰豆网上搜索。
1.引言
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
基于单片机的定时和控制装置在许多行业有着广泛的应用,数字钟作为其中最基本的一个应用实例,具有结构简单应用广泛的特点。
数字钟中使用了单片机中最为常用的输入输出设备按键开关和数码管;
数字钟程序主要应用单片机的定时器和中断实现计时和显示功能。
当今数字种作为一个单元电路被广泛应用于电子表、电子万年历等产品中,带来广泛的经济效益。
随着半导体工艺技术的发展及系统设计水平的提高,单片机还会不断产生新的变化和进步。
在不久的将来,最终单片机与微机系统之间的距离越来越小,甚至难以辨认。
2.方案设计与论证
按照系统设计功能的要求,初步确定设计系统由复位模块、时钟模块、音乐模块、光识模块及显示模块共五个模块组成,后来在时钟模块的基础上又加载了日历、星期的模块,为了使本设计中的数字钟的功能更加完善和强大,最后又将温度显示加入了设计方案中。
首先以单片机AT89S52为入手点,通过使用AT89S52的内部的可编程定时器/计数器,结合对外接晶振的调节来确定一个合适的振荡周期,从而确定出内部的机器周期。
根据题目的要求,我设计了以下方案:
设计中加载了年、月、日的设计,刚开始时打算用18个共阳数码管,考虑到数码管太多是毕会给硬件电路带来麻烦,经过考虑后,决定把年、月、日与时间设置到一组数码管上来,即六个数码管即能显示时间又能显示年、月、日,这样一来就方便了硬件电路。
主控芯片使用51系列AT89S52单片机,温度模块设计中,温度元件采用AD590,利用AD590以及接口电路把温度转换成模拟电压,经由ADC0804转换成数字信号,然后经AT89S52处理显示温度。
但由于AD590价钱比较贵,且只能转换成模拟电压,这样一来硬件就要增加更多的器件且又不经济,经查找发现18B20温度传感器价钱便宜且可以直接把温度转换成数字量测温范围为-55—125度,最大分辨率可达0.0625度,采用3线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点,所以我选择了18B20温度传感器。
在音乐模块的设计中,我决定采用音乐芯片,这样可以避免对铃声音乐的编程,即节省了时间,又减少了在程序中发生错误的可能性。
3.系统总体结构框图
图4-1
在本设计中,以按键开关作为输入装置,LED七段数码显示管作为显示装置,因此,各按键开关的功能为:
S1键:
P1.0口时间调整
S2键:
P1.1口日期调整
S3健;
p1.2口闹铃设置
S4健:
p1.3口闹铃开关
4.系统的硬件设计
电路是由控制部分和显示部分两大部分组成。
利用单片机程序进行控制,并通过数码管进行显示。
4.1显示部分电路的设计
4.1.1LED数码显示管的基本原理
用单片机驱动LED数码管有很多方法,按显示方式分,有静态显示和动态显示,按译码方式可分为硬件译码和软件译码。
静态显示是显示驱动电路具有输出锁存功能,单片机将要显示的数据送出后不再控制LED,直到下次显示时再传送一次新的显示数据。
静态显示的数据稳定,占用CPU时间少。
动态显示要CPU时刻对显示器件进行刷新,显示数据有闪烁感,占用CPU时间多。
这两种显示方式各有利弊:
静态显示虽然数据显示稳定,占用很少的CPU时间,但每个显示单元都需要单独的显示驱动电路,使用的电路硬件较多;
动态显示虽然有闪烁感,占用的CPU时间多,但使用的硬件少,能节省线路板空间。
动态扫描显示接口是单片机中应用最广泛的一种显示方式。
其接口电路是把所有LED显示器的8个笔划段A~D、DP的同名端连在一起,而每一个数码管的公共端COM是各自独立地受I/O线控制。
CPU向字段输出口送出字形码时,所有显示器接受到相同的字形码,但究竟是哪个显示器亮,则取决于COM端,而这一端是由I/O控制的,可以自行决定何时显示哪一位了。
而所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的COM端,是各个显示器轮流点亮。
在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的,约1ms左右,但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。
从上述的论述中,可以看出动态显示方案具备一定的实用性,也是目前单片机数码管显示中较为常用的一种显示方法。
所以,本设计也采用动态显示方案。
4.1.2数码管显示模块分析
电路先通过电源电路送出+5V电压,单片机AT89S52通过74LS47和CD4515(4—16译码器)驱动数码管显示数值,显示部分采用普通共阳极数码管显示,采用动态扫描,以减少硬件电路。
考虑到一次扫描12位数码管显示时会出现闪烁情况,设计时分两排显示,一排显示时间和年月日,一排显示星期和温度,共阳极数码管中8个发光
二极管的阳极(二极管正端)连在一起。
通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。
当某段驱动电路的输入端为低电平时,该端所连接的字段导通并点亮。
根据发光字段的不同组合可显示出各种数字或字符。
此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
采用动态显示方式,比较节省I/O口,硬件电路也较静态显示简单,但其亮度不如静态显示方式,而且在显示位数较多时,CPU要依次扫描,占用CPU较多时间。
为了提供共阳LED数码管的驱动电压,用三极管9012作电源驱动输出。
采用12MHz晶振,有利于提高秒计时的精确性。
;
4.1.3LED显示电路
5.2控制部分电路的设计
5.2.1时钟模块
利用芯片内部的振荡器,然后在引脚XTAL1和引脚
XTAL2两端接晶体谐振器,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部的时钟电路,如图外接晶振时,C1和C2的值通常选择30pF;
C1、C2对频率有微调作用,晶体谐振器的频率12MHz。
为了减少寄生电容,更好地保证振荡器稳定、可靠地工作,振荡器和电容应尽可能安装得与单片机芯片靠近。
设置了12—24两种显示状态,调整计时的按键、设置定时的按键且定时设置了3次定时、还另加载了星期、年、月、日的调整及闰年的自动调整。
5.2.2温度模块
主要由18B20通过单片机AT89S52中的温度程序不断的检测温度来显示温度。
18B20温度传感器工作原理:
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并可根据实际要求通过简单的编程实现9—12位的数字值读数方式,DS18B20的性能特点如下:
1、独特的单线接口仅需要一个引脚进行通信;
2、多个DS18B20可以并联在唯一的三线上,实现多点组网功能;
3、无须外部器件;
4、可通过数据线供电,电压范围为3.0---5.5V;
5、零待机功耗;
6、温度以9或12位数字量读出;
7、用户可定义的非易失性温度报警设置;
8、报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
9、负电压特性,电源极性接反是,温度计不会因发热而烧毁,但不能正常工作。
5.2.3音乐模块
通过LM386N-1给扬声器信号来发出音乐,这个模块主要是为时钟定时到时发出音乐闹铃,而在软件部分设置了可以一次设置3次定时,每次定时到时,音乐程序中编了6种音乐,它可以自动选择6种音乐中的任一音乐响1分钟,如果中间不想让闹铃响可以按一按键,闹铃就立刻停止。
5.2.4复位模块
单片机复位电路是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从该状态开始工作,例如复位后PC=0000H,使单片机从第一个单元取指令。
无论是在单片机刚接上电源时,还是断电后或者发生故障后都要复位。
电路图为:
图5-2
5.2.5光识模块
同样也是为定时服务的,只要定时到,组成心字的18只发光二极管就会按程序全亮全灭20次,如此循环。
图5-3
6.系统的软件设计
6.1各模块的程序设计
6.1.1计时程序
计时程序是实现电子时钟的核心内容,本程序用中断time0来控制,计时显示的单元从50h开始,50h=秒的个位,51h=秒的十位,52h=分的个位,53h=分的十位,54h=时的个位,55h=时的十位
org000bh
jmptime0
movtmod,#00010001b
movie,#10001010b
movip,#00000010b
movth0,#(65536-2000)/256
movtl0,#low(65536-2000)
mov4fh,#02;
两个中断250次为1秒
6.1.2定时闹钟程序
作用是判断时间是否与设置的闹钟时间相等,如相等则开启闹钟。
片机内定时振铃开关使用软件开关,即用标志寄存器,且程序设置了3次定时,可见要使电子时钟定时打铃,必须同时具备两个条件,第一:
定时振铃开;
第二:
当前定时项数不为0项。
因为要使电子时钟定时打铃,必须同时具备上述的两个条件,所以在单片机执行查询定时各项的程序之前,主程序会首先查询这两个条件是否同时满足,如果满足的话,则进行一轮查询,所谓一轮查询定时,即将当前时间与定时各项一一比较,看是否相符,如果查到某项相符,则调用音乐程序。
每查完一项,寄存器中的值会自动减1(即为定时时间的项数)。
当定时时间的项数值自动减为0时,则表示这一轮查询定时时间完毕,只要条件允许(定时
音乐开且定时项数不为0),有可以进行一轮新的查询定时时间。
定时1:
33h=分,34h=时,定时2:
35h=分,36h=时,定时3:
37h=分,38h=时,定时状态=39h;
定时显示的单元从60h开始,60h=定时状态,61h=此时;
定时状态的音乐种类,62h=分的个位,63h=分的十位;
64h=时的个位,65h=时的十位
6.1.3温度程序
57h=温度的十位,58h=温度的个位,
6.2系统程序设计的总体框图
图6-1
7.系统电路的制作与调试
7.1电路硬件焊接制作
电路硬件焊接是毕业设计的重要内容之一,其焊接工艺的好坏直接关系到系统的整体性能。
本设计的样品制作采用手工焊接,在焊接制作中应遵守手工焊接的工艺流程和技术要求。
7.2调试的主要方法
⑴测试单片机软件功能的完善性。
这是针对整个单片机系统功能的测试,测试软件是否写的正确完整。
单片机是否能正常工作。
⑵上电、掉电测试。
在使用中用户必然会遇到上电和掉电的情况,可以进行多次开关电源,测试单片机系统的可靠性。
⑶老化测试。
测试长时间工作情况下,单片机系统的可靠性。
必要的话可以放置在高温,高压以及强电磁干扰的环境下测试。
⑷D和EFT等测试。
可以使用各种干扰模拟器来测试单片机系统的可靠性。
例如使用静电模拟器测试单片机系统的抗静电ESD能力;
使用突波杂讯模拟器进行快速脉冲抗干扰EFT测试等等。
⑸整个显示系统的测试。
这是针对整个单片机显示系统功能的测试,单片机正常工作后,加上负载液晶整个系统共同测试。
⑹整个显示系统的调试。
编写不同的程序写入单片机,用单片机控制液晶显示不同的画面,如字符、图形。
7.3系统调试
7.3.1硬件调试
静态测试。
在电路板制作好以后,先不要急着加电,首先进行静态测试。
检查线路:
通过目测和使用万用表,检查线路连接的正确性,有无断路和短路,无虚焊的存在等。
核对元件:
检查元件是否安装正确,有无损坏等。
7.3.2软件调试
本程序采用单片机汇编语言编写,用wave6000编译器编程模拟调试。
7.3.3联机调试
在硬件无故障和软件模块调试完成的情况下,还要对系统进行联机调试。
在系统调试时,应将全部硬件电路都接上,应用程序模块也都组合好,进行全系统软硬件调试。
系统调试的任务是排除软硬件中的残留错误。
使整个系统能够完成预定的工作任务,达到要求的技术性能指标。
系统联机调试到能正确显示时间、日期、12小时和24小时的转换,并且闹铃功能正常,即铃声响起的同时,摆成心型的18个二极管闪烁。
7.3.4调试中遇到的问题及解决方法
⑴调试中反复检查,仍没有错误,这时候看是否要排除元器件失效了。
造成这类错误的原因有两个:
一个是元器件买来时就已坏了;
另一个是由于安装错误,造成器件烧坏。
可以采取检查元器件与设计要求的型号、规格和安装是否一致。
在保证安装无误后,用替换方法排除错误。
⑵还有可能是电源故障,所以排除电源故障这项必不可少。
在通电前,一定要检查电源电压的幅值和极性,否则很容易造成集成块损坏。
加电后检查各插件上引脚的电位,一般先检查VCC与GND之间电位,若在5V~4.8V之间属正常。
若有高压,联机仿真器调试时,将会损坏仿真器等,有时会使应用系统中的集成块发热损坏。
⑶当判断单片机不工作时候,需要进行联机仿真调试。
联机仿真必须借助仿真开发装置、示波器、万用表等工具。
这些工具是单片机开发的最基本工具。
信号线是联络单片机和外部器件的纽带,信号线连结错误或时序不对,都会造成对外围电路读写错误。
单片机的信号线大体分为读、写信号线、片选信号线、时钟信号线、外部程序存贮器读选通信号(PSEN)、地址锁存信号(ALE)、复位信号等几类。
这些信号大多属于脉冲信号,对于脉冲信号借助示波器(这里指通用示波器)用常规方法很难观测到,必须采取一定措施才能观测到。
应该利用软件编程的方法来实现。
例如对片选信号,运行下面的小程序就可以检测出译码片选信号是否正常。
MAIN:
MOVDPTR,#DPTR ;
将地址送入DPTR
MOVXA,@DPTR;
将译码地址外RAM中的内容送入
ACCNOP;
适当延时
SJMPMAIN;
循环
执行程序后,就可以利用示波器观察芯片的片选信号引出脚(用示波器扫描时间为1μs/每格档),这时应看到周期为数微秒的负脉冲波形,若看不到则说明译码信号有错误。
对于电平类信号,观测起来就比较容易。
例如对复位信号观测就可以直接利用示波器,当按下复位键时,可以看到单片机的复位引脚将变为高电平;
一旦松开,电平将变低。
总而言之,对于脉冲触发类的信号我们要用软件来配合,并要把程序编为死循环,再利用示波器观察;
对于电平类触发信号,可以直接用示波器观察。
结论
经过调试,和多次改进,本设计达到了预期的效果。
数字钟可以正常显示时间和日期,并且对每个月份的天数进行了处理,特别是2月这个特殊月份,本设计可以自动从2月28日直接过度到3月1日。
而且,在本设计中,闰年和平年的2月,其天数可以被正常区分,从而达到了实用和人性化的效果。
对温度的显示也比较正常,能够正常反映出室温情况。
当然,还可以根据需要,增加整点报时的功能,以使本设计更加完善。
总之,本设计提供了一套行之有效的数字钟的设计方案,并且成本较低,具有较高的实用性。
参考文献
[1]卢坤,奚大顺电子设计技术[M].成都电子科技大学出版社,1997.P103-210
[2]唐竞新.数字电子电路[M].第1版.北京:
清华大学出版社,2003.P99-120
[3]康华光.电子技术基础[M].数字部分.第4版.北京:
高等教育出版社,1998.
P47-79
[4]电子工程手册编委会等中外集成电路简明速查手册[M]---TTL,CMOS.北京:
电子工业出版社,1991.P245-340
[5]杨长春.论数字技术[J].《电子报》合订本.第0113期.成都:
四川科学技术出版社,2002.12.P13-30
[6]彭国贤.数码显示[M].北京:
电子工业出版社,1993.P21-50
[7]康华光主编,邹寿彬副主编《电子技术基础(数字技术)》高等教育出版,2004.P129-180
[8]康华光主编,陈大钦副主编《电子技术基础(模拟技术)》高等教育出版社,2003.P269-307
[9]袁俊泉,孙敏琪,曹瑞编著《数字系统设计及其应用》[J].《数字电子》第9908期.西安电子科技大学出版社,2002.P13-26
[10]李光飞、楼然苗等《单片机课程设计实例指导》北京航空航天大学出版社,2004.P5-37
[11]余永权.《ATMEL系列Flash单片机原理及应用》北京:
电子工业出版社,1997年第一版,P88~121
[12]沙占友.《智能化集成温度传感器原理与应用》北京:
机械工业出版社,2002年第一版,P84~106
[13]李广弟,朱月秀,王秀山.《单片机基础修订版》北京:
北京航空航天大学出版社,2001年第二版,P11~77
[14]蔡明生.《电子设计》北京:
高等教育出版社,2004年第一版,P48~101
[15]孙安青.《AT89S51单片机实验及实践教程》www.supermcu.com.P179~186
[16]刘云,成后发,尹波.《温度无线传输技术的研究》电脑与信息技术,2004年第4期,P47~50
[17]陈跃东.《DS18B20集成温度传感器原理及其应用》安徽机电学院学报,2002年第4期,P34~38
[18]刘楚浩.《用单片机实现温度远程显示》单片机与嵌入式系统应用.2002年第9期
[19]WilliamStallings.《DataandComputerCommunications》.北京:
高等教育出版社,2001年第一版
[20]CHEE-YEECHONG,SRIKANTAPKUMAR.《SensorNetworks:
Evolution》,OpportunitiesandChallenges[A].PROCEEDINGSOFTHEIEEE[C].2003,91(8):
1247-1256.
[21]AlteraCorporation.2002.《AlteraDigitalLibrary.Altera》.P99-101
[22]XilinxInc.2001.DataBook2001.Xilinx.P31-54
附录1数字钟电路图
附录2程序清单
org0000h
jmpstart
org000bh
jmptime
org30h
start:
movsp,#5fh;
//小时分钟秒
movr1,#0;
//r2r1r5r0r3r4
movr2,#0
movr7,#0
movr0,#0
movr6,#0
movr5,#0
mov20h,#31;
//20h日地址日月年个位年十位年百位年千位
mov21h,#10;
//21h月地址20h21h22h23h24h25h
mov22h,#6;
//年个位
mov23h,#0;
//年十位
mov24h,#0;
//年百位
mov25h,#2;
/年千位
mov34h,#0;
//闹铃1秒个位时十位时个位分十位分个位秒十位秒个位
mov35h,#0;
//闹铃1秒十位
mov36h,#1;
//闹铃1分个位39h38h37h36h35h34h
mov37h,#0;
//闹铃1分十位
mov38h,#0;
//闹铃1时个位
mov39h,#0;
//闹铃1时十位时十位时个位分十位分个位秒十位秒个位
mov49h,#1;
//闹铃2分个位4ch4bh4ah49h48h47h
mov4ah,#0;
//闹铃2分十位
mov4bh,#0;
//闹铃2时个位
mov4ch,#0;
//闹铃2时十位
setbp1.5
movTMOD,#00000001b
movTH0,#3ch;
//定时器初值
movTL0,#0b0h
setbEA;
//开总中断
setbET0;
//开定时器一的中断
movp1,#0ffh
setbTR0;
//定时器开始工作
k:
mov12h,r0
mov13h,r1
mov14h,r2;
//小时分钟秒
;
//r2r1r5r0r3r4
mov15h,r5
//14h13h15h12h
loop:
movr5,15h
movr2,14h
movr1,13h;
//地址中不是BCD码而是要显示的数字