基于AT89C51单片机定时闹钟设计Word格式.docx
《基于AT89C51单片机定时闹钟设计Word格式.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机定时闹钟设计Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
3系统硬件设计
3.1单片机AT89C51简介
AT89C51是一个低电压,高性能CMOS型8位单片机,片内含4KB的可反复擦写的Flash只读程序存储器(ROM)和128B的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的AT89C51为用户提供了许多高性价比应用场合,可灵活应用于各种控制领域。
AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
主要特性:
·
与MCS-51兼容
4K字节可编程闪烁存储器
寿命:
1000写/擦循环
数据保留时间:
10年
全静态工作:
0Hz-24Hz
三级程序存储器锁定
128×
8位内部RAM
32可编程I/O线
两个16位定时器/计数器
5个中断源
可编程串行通道
低功耗的闲置和掉电模式
片内振荡器和时钟电路
引脚使用说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当
P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下所示:
管脚……备选功能:
P3.0……RXD(串行输入口)
P3.1……TXD(串行输出口)
P3.2……/INT0(外部中断0)
P3.3……/INT1(外部中断1)
P3.4……T0(记时器0外部输入)
P3.5……T1(记时器1外部输入)
P3.6……/WR(外部数据存储器写选通)
P3.7……/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
ST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度.
图2是单片机AT89C51的引脚图:
图3-1单片机AT89C51引脚图
3.2数码管显示电路
单片机中通常使用7段LED,LED是发光二极管显示器的缩写。
LED显示器由于结构简单,价格便宜,体积小,亮度高,电压低,可靠性高,寿命长,响应速度快,配置灵活,与单片机接口方便而得到广泛应用。
LED显示器是由若干个发光二极管组成显示字段的显示部件,当发光二极管导通时,相应的一个点或一个笔划发光,控制不同组合的二极管导通,就能显示出各种字符。
LED显示器有多种形式,如:
“米”字型显示器,点阵显示器和七段数码显示器等,在单片机系统中使用最多的是七段数码显示器。
本系统利用7SEG-MPX6-CC-BLUE数字显示器,7SEG-MPX6-CC-BLUE数字显示器的1-6引脚连接AT89C51单片机P2.0–P2.5接口,其他8个引脚分别与AT89C51单片机的P0.0-P0.7和共阳极管RESPACK-8排阻的2-9引脚分别连接。
因为共阴极的LED数码管它的驱动电流是分开的,在单片机进行动态扫描的时候不会影响彼此的电流,故该系统中的6位LED数码管均用共阴极的数码管。
6位数码管的引脚图如图3-2所示:
图3-26位数码管的引脚
3.3时钟电路
单片机的时钟产生方法有两种:
内部时钟方式和外部时钟方式。
本系统中AT89C51单片机采用内部时钟方式。
最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。
振荡晶体可在1.2MHz~12MHz之间。
电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。
AT98C51单片机的时钟电路。
如图3-3所示:
图3-3时钟电路图
上拉电阻:
RESPACK-8
控制按键:
BUTTONACTIVESPSTPushButton
本系统要进行时间的调整和定时,因此用4个手动按键对其进行控制。
3.4喇叭:
SPEAKER
由P3.7口控制喇叭,使其定时时间到能发出报警声。
如图3-4所示:
图3-4喇叭引脚图
4系统软件设计
4.1系统软件设计说明
该系统软件程序主要有主程序模块,定时中断服务程序,中断等待服务程序,键盘服务程序,显示子程序服务程序等六大模块组成。
在AT89C51外围的一个17管脚即P3.7管口上加喇叭器,通过软件与硬件的结合可实现定时报警功能。
图中按键从上往下设定为S1,S2,S3,S4,S1与p1.4相连,S2与p1.3相连,S3与p1.2相连,S4与p1.1相连。
当需要设定当前时间时,按一下S4键,进入时间设定状态,按一下S2,分钟加1;
按一下S3,小时加1。
如此反复来设定当前时间。
调好时间后按S1退出当前时间设定状态;
当要设定定时时间时,按下S3,进入定时时间设定状态,按一下S2,小时加1;
按一下S4,分钟加1。
如此反复来设定要设定的定时时间。
设好后,按下S1退出定时时间设定状态。
4.2程序调试
1)将程序输入到伟福的环境下;
2)用单步运行和断点运行方式调试程序;
3)调试T0中断服务程序,首先在记数单元39H、3AH、3BH、3CH单元中预置数,调试秒单元向分单元进位及分单元向时单元的进位,最后将T0中断服务程序统调通过;
4)在39H、3AH、3BH、3CH单元中预置数,调试显示程序;
5)调试主程序,使闹钟走时系统工作正常。
4.3程序流程图
本设计程序流程图如4-1所示:
图4-1程序流程图
4.3仿真步骤
第一步:
用伟褔软件对程序进行编译,编译通过后,会自动生成HEX文件。
第二步:
在Proteus的元件库中找到AT89C51以及相应的元件,按照硬件设计中的说明把各部件连接起来组成一个定时闹钟的硬件系统。
第三步:
把在伟福环境调试下生成的.HEX文件装入到AT89C51里,点击运行符号就可以使软硬件的配套设施在Proteus的环境下仿真实现。
第四步:
验证系统能否实现所要求的功能,并检验错误。
4.4仿真结果
通过S1、S2、S3和S4四个按键,对时间进行修改和闹钟的设置。
定时时间到能发出报警声,使用伟福软件编辑程序然后进行proteus进行仿真,其仿真图如下:
开始仿真时,显示如图4-2所示:
图4-2
(1)设定当前时间
调好时间后按S1退出当前时间设定状态。
先按S4,再按S2时,如图4-3所示:
图4-3
先按S4,再按S2,再按S3时,如图4-4所示:
图4-4
如图4-5:
设定当前时间是01:
02:
15
图4-5
(2)设定定时时间
如图4-6所示图:
设定定时时间为01:
06
图4-6
如图4-7所示当到达时间01:
06时,喇叭发出报警声。
图4-7
结论
通过这次设计让我更深入了解在设计程序之前,务必要对所学单片机课程的内容有一个系统的了解,知道单片机片内片外的内容及其功能。
设计程序采用什么编程语言并不是非常重要,关键要有一个清晰的思路和一个完整的软件流程图。
在设计程序时,不能妄想一次就将整个程序设计好,"
反复修改,不断改进"
是程序设计的必经之路。
程序刚开始编好时,一般情况下会存在很多错误,要不断地修改,不断的改进才能达到预期的目的,编写程序的时间并不是很长,主要是修改程序会花很多时间。
总之,通过这次设计让我更深入了解单片机基本电路、如何控制和定时器和中断编程的基本方法,从而锻炼了我学习、设计和开发软、硬件的能力。
并且使我巩固了本课程所学的基本知识,还使我具有了撰写设计报告的初步训练能力,我相信这些能力在我以后的工作或者是再学习中一定会起到不小的作用,看到自己几周的小成果,感觉一切的辛苦和艰难都是值得的。
参考文献
[1].余发山主编,单片机原理及应用技术,中国矿业大学出版社2003.12
[2]康华光.数字电子技术.北京:
高等教育出版社,2003
[3]吴金戌.8051单片机实践与应用.北京:
清华大学出版社,2003
[4]楼然苗.51系列单片机设计实例.北京:
北京航空航天出版社,2004
[5]黄仁欣.单片机原理及应用技术.
北京:
清华大学出版社,2005
[6]何立民.单片机高级教程.第1版.北京:
北京航空航天大学出版社,2001[7]赵晓安.MCS-51单片机原理及应用.天津:
天津大学出版社,2001.3
[8]夏继强.单片机实验与实践教程.北京:
北京航空航天大学出版社,2001
[9]凌玉华,单片机原理及应用系统设计[M],长沙:
中南大学出版社,2006
[10]李全利、迟荣强,单片机原理及接口技术[M],北京:
高等教育出版社,2004
[11]胡汉才,单片机原理及应用[M],北京:
清华大学出版社,2004
[12]凌阳科技。
凌阳16位单片机开发实例。
北京航空航天大学出版社。
2006年
[13]
徐江海。
单片机实用教程。
机械工业出版社。
2007年
[14]余发山编著.单片机原理及应用技术.中国矿业大学出版社,2003
[15]陈建泽编著。
MCS-51单片机应用设计.哈尔滨工业大学出版社,2006
附录A系统整体电路
系统电路图
附录B全部程序清单
ORG0000H
LJMPMAIN
ORG000BH
LJMPTIME
;
×
主程序部分:
ORG0100H
MAIN:
MOVSP,#50H
MOV20H,#00H;
秒钟 BIN
MOV21H,#00H;
分钟 BIN
MOV22H,#00H;
小时 BIN
MOV23H,#01H
MOV24H,#01H
MOV25H,#00H
MOV30H,#00H
MOV31H,#00H
MOV32H,#00H
MOV33H,#00H
MOV34H,#00H
MOV35H,#00H
MOV36H,#01H
MOV37H,#00H
MOV38H,#01H
MOV39H,#00H
MOVTMOD,#01H;
16位计数器
MOVTH0,#03CH;
赋计数初值
MOVTL0,#0B0H
MOVIE,#10000111B
SETBTR0;
T0启动计数
MOVR2,#14H
MOVP2,#0FFH
LOOP:
LCALLTIMEPRO
LCALLDISPLAY1
JBP1.1,M1
LCALLSETTIME;
调用设定时间程序
LJMPLOOP
M1:
JBP1.2,M2
LCALLSETATIME;
M2:
JBP1.4,M4
LCALLLOOKATIME;
调用设定闹钟时间程序
M4:
LJMPLOOP
DELAY:
MOVR4,#030H;
延时时间
DL00:
MOVR5,#0FFH
DL11:
MOVR6,#9H
DL12:
DJNZR6,DL12
DJNZR5,DL11
DJNZR4,DL00
RET
设定时间程序:
SETTIME:
L0:
LCALLDISPLAY1;
调用时间允许程序
MM1:
JBP1.2,L1
MOVC,P1.2
JCMM1
LCALLDELAY1;
调用延时
MSTOP1:
JNCMSTOP1;
判断P1.2是否释放?
释放则继续
JNCMSTOP1
INC22H;
小时增加1
MOVA,22H
CJNEA,#18H,GO12;
判断小时是否到24时?
未到继续循环
小时复位
MOV34H,#00H
LJMPL0
L1:
JBP1.3,L2
MOVC,P1.3
JCL1
延时
MSTOP2:
JNCMSTOP2;
判断P1.3是否释放?
JNCMSTOP2
INC21H;
分钟增加一
MOVA,21H
CJNEA,#3CH,GO11
分钟复位
MOV32H,#00H
MOV33H,#00H
GO11:
MOVB,#0AH;
将A中的内容分成高低两部分
DIVAB
MOV32H,B
MOV33H,A
GO12:
MOVB,#0AH
MOV34H,B
MOV35H,A
L2:
JBP1.4,L0
MOVC,P1.4
JCL2
STOP1:
MOVC,P1.4;
判断按键P1.4是否释放?
JNCSTOP1
设置闹钟时间×
SETATIME:
LCALLDISPLAY2;
调用时间运行
N0:
LCALLDISPLAY2
MM2:
JBP1.3,N1;
判断P1.3是否按下?
JCMM2
LCALLDELAY1
MSTOP3:
MOVC,P1.3;
JNCMSTOP3
INC24H;
设定小时增加1
MOVA,24H
CJNEA,#24,GO22
MOV24H,#00H;
时钟复位
MOV38H,#00H
LJMPN0
N1:
JBP1.1,N2;
判断P1.1是否按下?
MOVC,P1.1
JCN1
MSTOP4:
MOVC,P1.1;
判断P1.1是否释放?
JNCMSTOP4
INC23H;
设定闹钟分钟增加1
MOVA,23H
CJNEA,#60,GO21;
判断A是否到60分?
MOV23H,#00H;
MOV36H,#00H
GO21:
MOV36H,B
MOV37H,A
GO22:
MOV38H,B
MOV39H,A
N2:
JBP1.4,N0;
判断P1.4是否按下?
JCN2
STOP2:
判断P1.4是否释放?
JNCSTOP2
TIMEPRO:
MOVA,21H
MOVB,23H
CJNEA,B,BK;
判断分钟是否运行到设定的闹钟的分钟?
MOVB,24H
判断时钟是否运行到设定的闹钟的时钟?
SETB25H.0
MOVC,25H.0
JCXX
XX:
LCALLTIMEOUT;
调用时间闹钟响应程序
BK:
RET
TIMEOUT:
X1:
LCALLBZ;
调用喇叭响应程序
LCALLDISPLAY2
CLR25H.0
JBP1.4,X1;
LCALLDELAY
CLR25H.0
LJMPDISPLAY1
BZ:
CLRP3.7;
喇叭