数字钟毕业设计Word格式.docx
《数字钟毕业设计Word格式.docx》由会员分享,可在线阅读,更多相关《数字钟毕业设计Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
![数字钟毕业设计Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/28/5f27830d-51a4-479b-beda-7b35fed1da02/5f27830d-51a4-479b-beda-7b35fed1da021.gif)
参考文献.............................................................19
致谢..................................................................20
摘要
本设计基于单片机技术原理,通过硬件电路的制作以及软件程序的编制,设计制作出一个数字时钟系统。
单片机扩展的LCD显示器用来显示秒、分、时计数单元中的值。
整个设计包括两大部分:
硬件部分和软件部分,以单片机为核心,配以一定的外围电路和软件。
硬件是整个系统的基础,软件部分则要合理、充分地支持和使用系统的硬件,从而完成系统所要完成的任务。
该时钟系统主要由时钟模块、LED、键盘控制模块等组成。
能够准确显示时间(显示格式为时时:
分分:
秒秒,24小时制),可随时进行时间调整,还具有闹钟时间设置、闹钟开/关、止闹功能。
设计以硬件软件化为指导思想,充分发挥单片机功能,大部分功能通过软件编程来实现,电路简单明了,系统稳定性高。
关键词:
单片机LED数码管数字钟
Abstract
Thisdesignbasedonthesinglechipmicrocomputerprinciple,throughthemakingandhardwarecircuitandsoftwareprogrammingdesignedandproducedadigitalclocksystem.SCMextendedLCDdisplayusedtodisplayseconds,points,whenthevalueiscountingunit.Thewholedesignincludestwoparts,hardwareandsoftwareof,basedonsinglechip,matchwithcertainperipheralcircuitandsoftware.Hardwareisbasedinthewholesystem,thesoftwarepartthenbereasonableandfullysupportandusethesystemhardware,thuscompletingsystemtocompletethetask.
Thisclocksystemmainlybytheclockmodule,alarmmoduleandleds,keyboardcontrolmodule.Toaccuratelydisplaythetime(displayformatforalways:
component:
secondsseconds,24-hoursystem),availablefortimetoadjust,withalarmtimesetting,alarmclockon/off,stopjokingfunction.Designwithhardwareandsoftwareintoguidingideology,givefullplaytotheSCMfunctions,mostfunctionsthroughsoftwareprogrammingrealize,circuitstraightforward,stabilityofthesystemishigh.
Keywords:
SCMLEDdigitaltubedigitalclock
一、设计要求
1.显示时、分、秒。
2.可以24小时制或12小时制。
3.具有校时功能,可以对小时和分单独校时,对分校时的时候,停止分向小时进位。
校时时钟源可以手动输入或借用电路中的时钟。
4.为了保证计时准确、稳定,由晶体振荡器提供标准时间的基准信号。
系统由8051、LED数码管、按键、发光二极管等部分构成,能实现时间的调整和时间输出等功能。
系统的时间调整和复位功能由sp1,sp2,sp3完成。
其中sp3为时间复位,sp1为小时调整键,sp2为分钟调整键。
单片机的P2口实现数码管的动态选择,二极管发亮表示电源接通。
上电后,系统自动进入计时状态,起始于12:
00:
00。
二、系统的硬件设计
2.1设计思路
本设计是纯粹的应用性设计,主要以实现计时、显示等功能为最终目的。
设计以Atmel公司的8051为核心,在最小系统的基础上利用单片机的实时功能和外部中断口P3.2和P3.3以及LCD显示模块,硬件设计简单节约,其功能的实现主要靠软件设计,所以软件在本设计中是最为重要的。
本设计包括硬件设计和软件设计两部分。
主要硬件有:
8051单片机,LED显示模块
2.2系统框图
图2-1电路总体框架
2.3电路原理图
2.4电路PCB图
2.5各个部分原理
2.5.1显示原理
数码管显示模块由8个共阴极的数码管组成时、分、秒的显示。
P0口的8条数
据线P0.0至P0.7分别与两个CD4511译码的ABCD口相接,P2口的P2.0至P2.2分别通过电阻R10至R13与VT1至VT3的基极相连接[1]。
这样通过P0口送出一个存储单元的高位、低位BCD显示代码,通过P2口送出扫描选通代码轮流点亮LED1至LED6,就会将要显示的数据在数码管中显示出来。
从P0口输出的代码是BCD码,从P2口输出的就是位选码。
这是扫描显示原理。
2.5.2键盘及读数原理
键盘是人与微机打交道的主要设备,按键的读取容易引起误动作。
可采用软件去抖动的方法处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的逻辑电平是不稳定的,如不采取妥善处理的话,将引起按键命令错误或重复执行,在这里采用软件延时的方法来避开抖动,延时时间20ms[3]。
2.5.3连击功能的实现
按下某键时,对应的功能键解释程序得到执行,如操作者没有释放按键,则对应的功能会反复执行,好象连续执行,在这里我采用软件延时250ms,当按键没释放则执行下一条对应程序。
利用连击功能,能实现快速调时操作。
2.68051单片机简介
8051是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的8051单片机可为您提供许多较复杂系统控制应用场合[4]。
8051芯片的引脚图见图2-2:
图2-28051芯片
8051有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,8051可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本[5]。
8051有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
P3口特殊功能见表2-1:
P3口引脚
特殊功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0外部输入)
P3.5
T1(定时器1外部输入)
表2-1P3口特殊功能
主要功能特性:
•兼容MCS51指令系统
•8k可反复擦写(>
1000次)FlashROM
•32个双向I/O口
•256x8bit内部RAM
•3个16位可编程定时/计数器中断
•时钟频率0-24MHz
•2个串行中断
•可编程UART串行通道
•2个外部中断源
•共6个中断源
•2个读写中断口线
•3级加密位
•低功耗空闲和掉电模式
•软件设置睡眠和唤醒功能
2.7数码管的基本概念
2.7.1段码
数码管中的每一段相当于一个发光二极管,8段数码管则具有8个发光二极管。
本次实验使用的是共阴数码管,公共端是1、6,公共端置0,则某段选线置1相应的段就亮。
公共端1控制左面的数码管;
公共端6控制右面的数码管。
正面看数码管的引脚、段选线和数据线的对应关系为,数码管封装图和数据线与数码管管脚连接关系
分别如图2-4和图2-5:
图2-4数码管封装图图2-5数据线与数码管管脚连接关系
段码是指在数码管显示某一数字或字符时,在数码管各段所对应的引脚上所加的高低电平按顺序排列所组成的一个数字,它与数码管的类型(共阴、共阳)和与数据线的连接顺序有关[2]。
8段LED的段码表见表2-2:
对应数据线
D7
D6
D5
D4
D3
D2
D1
D0
对应显示段
e
f
DP
g
c
d
b
a
显示数字
段码
0CFH
1
03H
2
5DH
3
5BH
4
93H
5
0DAH
6
0DEH
7
43H
8
0DFH
9
0DBH
表2-28段LED的段码表
2.7.2位码
位码也叫位选,用于选中某一位数码管[6]。
在实验图中要使第一个数码管显示数据,
应在公共端1上加低电平,即使P2.7口为0,而公共端6上加高电平,即使P2.6口为1。
位码与段码一样和硬件连接有关。
2.7.3拉电流与灌电流
单片机的I/O口与其他电路连接时,I/O电流的流向有两种情况:
一种是当该I/O口为高电平时,电流从单片机往外流,称作拉电流;
另一种是该I/O口为低电平时,电流往单片机内流,称为灌电流[7]。
一般I/O的灌电流负载能力远大于拉电流负载能力,对于一般的51单片机而言,拉电流最大4mA,灌电流为20mA。
一般在数码管显示电路中采用灌电流方式(用共阳数码管),可以得到更高的亮度。
本实验电路中采用拉电流方式(用共阴数码管)[2]。
2.7.4多位数码管的动态显示
在多位8段数码管显示时,为了简化硬件电路,通常将所有位的段选线相应地并联在一起,由一个单片机的8位I/O口控制,形成段选线的多路复用【8】。
而各位数码管的共阳极或共阴极分别由单片机独立的I/O口线控制,顺序循环地点亮每位数码管,这样的数码管驱动方式就称为“动态扫描”[2]。
在这种方式中,虽然每一时刻只选通一位数码管,但由于人眼具有一定的“视觉残留”,只要延时时间设置恰当,便会感觉到多位数码管同时被点亮了。
多位8段LED动态显示器电路,其中段选线占用一个8位I/O口,位选线占用一个8位I/O口,由于各位的段选线并联,段线码的输出对各位来说都是相同的。
因此,同一时刻,如果各位位选线都处于选通状态的话,8位LED将显示相同的字符。
若要各位LED能够显示出与本位相应的显示字符,就必须采用扫描显示方式,即在某一位的位选线处于选通状态时,其它各位的位选线处于关闭状态,这样,8位LED中只有选通的那一位显示出字符,而其它位则是熄灭的。
同样,在下一时刻,只让下一位的位选线处于选通状态,而其他的位选线处于关闭状态。
如此循环下去,就可以使各位“同时”显示出将要显示的字符。
由于人眼有视觉暂留现象,只要每位显示间隔足够短,则可造成多位同时亮的假象,达到显示的目的【8】。
三系统的软件设计
3.1数据与代码转换
由前述可知,从P2口输出位选码,从P0口输出段选码,LED就会显示出数字来。
但P0口的输出的数据是要BCD码,各存储单元存储的是二进制数,也就是和要显示出的字符表达的含义是不一致的。
可见,将要显示的存储单元的数据直接送到P0口去驱动LED数码管显示是不能正确表达的,必须在系统内部将要显示的数据经过BCD码行转换后,将各个单元数据的段选代码送入P0口,给CD4511译码后去驱动数码管显示。
具体转换过程如下:
我先将要显示的数据装入累加器A中,再将A中的数据转换成高低两位的BCD码,再放回A中,然后将A中的值输出。
如:
有一个单元存储了45这样一位数,则需转换成四位的BCD码:
(0100)(0101)然后放入A中。
A中BCD码,译码后就在两个LED中显示出来。
3.2主程序
本设计中,计时采用定时器T0中断完成,在主程序中通过设置计数器初值为0X06,使P0口输出周期为0.25毫秒的方波,即每0.25毫秒实时时钟产生一次中断,从而使系统转向相应的中断服务程序。
3.3显示子程序
数码管显示的数据存放在内存单元70H-75H中。
其中70H-71H存放秒数据,72H-73H存放分数据,74H-75H存放时数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出70H-75H某一地址中的数据,然后查得对应的显示用段码,并从P0口输出,P2口将对应的数码管选中供电,就能显示该地址单元的数据值。
3.4计时器T0中断服务程序
定时器TO用于时间计时,计时时溢出中断周期设为0.25ms,由于采用12MHz频率的晶体,计数速率为1MHz,机器周期为1us,通过计算得到T0的计数初值应该置为0X06,当到达计数值后产生下降沿中断,系统转入中断服务程序,在中断服务程序里实现数码管的动态显示和时间的变化以及存储。
数码管每20ms显示下一个,循环一次后在重复上述过程,秒每4000个中断周期加1,当加到60时秒置0,分加1,当分加到60是小时加1,分置0,当小时加到24时置0。
每次执行该中断服务程序时都对当前对当前时间进行动态存储。
T0中断服务程序流程图如图
Y
3.5调时功能程序
调时功能程序的设计方法时:
按下sp3键时触发P3.2口外部中断,系统进入小时调整中断服务程序,每按一下按键小时加1,加到24小时后自动置0。
按下sp2键时触发P3.3口外部中断,系统进入分钟调整中断服务程序,每按一下按键分加1,加到60小时后自动置0。
时按键按下?
开 始
3.6主程序框
计数单元清零
TH0,TL0装入初值
开中断,并允许T0中断
秒按键识别成功否?
SECOND加1
SECOND=60吗?
SECOND=0
显示数据处理
分按键识别成功否?
MINITE加1
MINITE=60吗?
MINITE=0
时按键识别成功否?
HOUR加1
HOUR=24吗?
HOUR=0
3.7数字钟源程序代码
#include<
AT89X51.H>
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsignedchardispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsignedchardispbuf[8]={0,0,16,0,0,16,2,1};
//初始化使显示时间的位全为12:
00,其他都不点亮;
当将dispbitcode[2]和dispbitcode[3]对应的16改为X(10~15中的一个),并将其指向dispcode[16]即0x00改为dispcode[X]即0x40。
时分秒的间隔就为“—”。
unsignedchardispbitcnt;
unsignedcharsecond;
unsignedcharminite;
unsignedcharhour;
unsignedinttcnt;
unsignedcharmstcnt;
unsignedchari,j;
voidmain(void)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
hour=12;
while
(1)
{
if(P0_0==0)
for(i=5;
i>
0;
i--)
for(j=248;
j>
j--);
second++;
if(second==60)
second=0;
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
while(P0_0==0);
if(P0_1==0)
minite++;
if(minite==60)
minite=0;
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
while(P0_1==0);
if(P0_2==0)
hour++;
if(hour==24)
hour=0;
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
while(P0_2==0);
}
voidt0(void)interrupt1using0
mstcnt++;
if(mstcnt==8)
mstcnt=0;
P3=0xff;
//关闭所有显示
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
dispbitcnt=0;
tcnt++;
if(tcnt==4000)
tcnt=0;
dispbuf[1