单片机课程设计定时闹钟的设计.docx
《单片机课程设计定时闹钟的设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计定时闹钟的设计.docx(19页珍藏版)》请在冰豆网上搜索。
单片机课程设计定时闹钟的设计
1概述
1.1设计目的
本设计是一个定时闹钟,它仅使用单片的40引脚单片机完成闹钟的全部功能。
设计目的是为了学习和巩固单片机知识,使对已学过的基础知识能有更深入的理解,学会独立思考、独立思考、独立工作,以及提高对所学应用基本理论分析和解决实际问题的能力。
1.2设计任务
本文设计的定时闹钟采用80c51芯片,用汇编语言进行编程,时、分、秒用6位LED数码管显示。
在电路中通过四个按键S1、S2、S3和S4来进行定时和调时,定时时间到通过喇叭发出报警声。
1.3设计系统的主要功能
·能显示时时-分分-秒秒。
· 能够设置定时时间、修改定时时间。
· 到定时时间能发出报警
2系统总体方案及硬件设计
2.1 系统总体方案
1)由于要显示数字时间,所以需要6位数码管。
2)时间的定时用时钟电路,修改时间和定时用手动按键控制,报警声通过喇叭发出。
3)80c51单片机加上外围器件(2个3位共阳数码管,8个限流电阻和一个蜂鸣器)和应用程序(ISIS7Professional软件和KEIL编译软件),构成相应的应用系统。
2.2系统设计方框图
2.3硬件设计
2.3.1芯片:
80c51
80c51芯片内不包含一个8位中央处理器cpu,4kb程序存储器ROM,128B随机存取存储器,RAM,4个8位并行I/O接口,1个全双工串行通信接口,2个16位定时器、计数器级及21个特殊功能寄存器。
外部具有64KB程序存储器寻址能力和64KB数据存储器寻址能力。
指令系统中增加了乘法指令,提高了运算及数据处理能力,且具有位操作能力。
由先进CMOS工艺制造并带有非易失性Flash程序存储器全部支持12时钟和6时钟操作P89C51X2和P89C52X2/54X2/58X2分别包含128字节和256字节RAM32条I/O口线3个16位定时/计数器6输入4优先级嵌套中断结构1个串行I/O口可用于多机通信I/O扩展或全双工UART以及片内振荡器和时钟电路。
此外,由于器件采用了静态设计,可提供很宽的操作频率范围,频率可降至0。
可实现两个由软件选择的节电模式,空闲模式和掉电模式,空闲模式冻结CPU但RAM定时器,串口和中断系统仍然工作掉电模式保存RAM的内容但是冻结振荡器导致所有其它的片内功能停止工作。
由于设计是静态的时钟可停止而不会丢失用户数据运行可从时钟停止处恢复。
80c51管脚说明:
VCC:
供电电压,接+5V.
GND:
接地。
P0口:
P0口是一个8位三态双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
P1口:
P1口是一个8位准双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
P2口:
P2口是一个具有内部上拉电阻的8位准双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:
P3口是一个具有内部上拉电阻的8位准双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。
在flash编程和校验时,P3口也接收一些控制信号。
P3口也可作为AT89S52的一些特殊功能口,如下表所示:
P3口管脚备选功能:
端口引脚
第二功能
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(外部数据存储器读选通)
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/PROG:
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在flash编程时,此引脚(PROG)也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。
这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。
否则,ALE将被微弱拉高。
这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN:
外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器
读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
在flash编程期间,EA也接收12伏VPP电压。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
2.3.2蜂鸣器
由P3.7口控制蜂鸣器,使其定时时间到能发出报警声。
2.3.3时钟电路
单片机的时钟产生方法有两种:
内部时钟方式和外部时钟方式。
本系统中单片机采用内部时钟方式。
最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。
振荡晶体可在1.2MHz~12MHz之间。
电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。
A
单片机的时钟电路。
如图3所示
图3
限流电阻:
8个220Ω电阻
控制按键:
本系统要进行时间的调整和定时,因此用4个手动按键对其进行控制。
2.3.4显示器模块的设计
利用2个七段数码管6个选位引脚连接C51单片机P2.5–P2.0接口,其他8个引脚分别通过限流电阻与C51单片机的P0.0-P0.7和共阳极数码管连接。
数码管:
单片机中通常使用7段LED,LED是发光二极管显示器的缩写。
LED显示器由于结构简单,价格便宜,体积小,亮度高,电压低,可靠性高,寿命长,响应速度快,颜色鲜艳,配置灵活,与单片机接口方便而得到广泛应用。
LED显示器是由若干个发光二极管组成显示字段的显示部件,当发光二极管导通时,相应的一个点或一个笔划发光,控制不同组合的二极管导通,就能显示出各种字符。
如图4所示
图4
3软件设计
3.1划分模块
根据设计要求,定时闹钟程序可分为以下几个模块:
1)显示时间的设置;
2)闹钟时间的设置:
4)定时时间的响应。
3.2程序流程图
图5程序流程图
3.3汇编程序
ORG0000H
LJMPSTART
ORG000BH
LJMPTIME
;;;;;;;;初始化;;;;;;;;
START:
MOVSP,#50H
MOV20H,#00H;定义秒
MOV21H,#00H;定义分
MOV22H,#00H;定义时
MOV23H,#01H;定义闹钟分钟
MOV24H,#01H;定义闹钟小时
MOV25H,#00H
MOV26H,#01H
MOV30H,#00H;BCDSECOND
MOV31H,#00H
MOV32H,#00H;BCDMINUTE
MOV33H,#00H
MOV34H,#00H;BCDHOUR
MOV35H,#00H
MOV36H,#01H
MOV37H,#00H
MOV38H,#01H
MOV39H,#00H
MOV50H,#00H;按键次数
MOVTMOD,#01H;16位计数器
MOVTH0,#03CH;赋初值
MOVTL0,#0B0H
MOVIE,#87H;中断允许
SETBTR0;启动T0
MOVR2,#14H
MOVP2,#0FFH
CLRP3.7
;;;;;;;;主程序;;;;;;;;;
MAIN:
LCALLTIMEPRO;调用闹钟判断
GB:
LCALLDISPLAY1;调用时间显示
JBP1.3,M1;P1.3=1时转移S4没有按下
LCALLSETTIME;调用SETTIME调时子程序
LJMPMAIN
M1:
JBP1.2,M2;P1g.2=1时转移 S3
LCALLSETATIME;调用SETATIME子程序
LJMPMAIN
M2:
JBP1.0,M4;P1.0=1时转移S1
LCALLLOOKATIME;调用LOOKATIME显示闹钟子程序
M4:
LJMPMAIN
;;;;;;;;延时子程序;;;;;;
DELAY:
MOVR4,#030H
DL00:
MOVR5,#0FFH
DL11:
MOVR6,#9H
DL12:
DJNZR6,DL12
DJNZR5,DL11
DJNZR4,DL00
RET
;;;;;;;时间调整;;;;;;;
SETTIME:
;设置时间
L0:
LCALLDISPLAY1
MM1:
JBP1.3,L1;P1.3=1时转移
MOVC,P1.3
JCMM1
LCALLDELAY1;延时
JCMM1
MSTOP1:
MOVC,P1.3;P1.3为0时转移
JNCMSTOP1
LCALLDELAY1;延时
MOVA,50H
INC50H
CJNEA,#00H,HJ1
LJMPL0
HJ1:
MOVC,P1.3
JNCMSTOP1
INC22H;小时自加一
MOVA,22H
CJNEA,#18H,GO12;小时计数循环
MOV22H,#00H;复位
MOV34H,#00H
MOV35H,#00H
LJMPL0
L1:
JBP1.1,L2;P1.1=1时转移
MOVC,P1.1
JCL1
LCALLDELAY1;延时
JCL1
MSTOP2:
MOVC,P1.1;P1.1=0时转移
JNCMSTOP2
LCALLDELAY1;延时
MOVC,P1.1
JNCMSTOP2
INC21H;分钟加一
MOVA,21H
CJNEA,#3CH,GO11;分钟计数循环
MOV21H,#00H;复位
MOV32H,#00H
MOV33H,#00H
LJMPL0
GO11:
MOVB,#0AH
DIVAB
MOV32H,B;将A的低4位存入32单元
MOV33H,A;将A的高4位存入33单元
LJMPL0
GO12:
MOVB,#0AH
DIVAB
MOV34H,B;将A的低4位存入34单元
MOV35H,A;将A的高4位存入35单元
LJMPL0
L2:
JBP1.0,L0;P1.0=1时转移
MOVC,P1.0
JCL2
LCALLDELAY1;延时
MOVC,P1.0
JCL2
STOP1:
MOVC,P1.0;P1.0=0时转移
JNCSTOP1
LCALLDELAY1;延时
MOVC,P1.0
JNCSTOP1
MOV50H,#00H
LJMPMAIN
;;;;;;设置闹钟;;;;;;;;
SETATIME:
LCALLDISPLAY2;调用DISPLAY2显示闹钟
N0:
LCALLDISPLAY2
MM2:
JBP1.2,N1;P1.2=1时转移
MOVC,P1.2
JCMM2
LCALLDELAY1;延时
JCMM2
MSTOP3:
MOVC,P1.2;P1.2=0时转移
JNCMSTOP3
LCALLDELAY1;延时
MOVA,50H
INC50H
CJNEA,#00H,HJ2
LJMPN0
HJ2:
MOVC,P1.2
JNCMSTOP3
INC24H;小时加一
MOVA,24H
CJNEA,#24,GO22;小时计数循环
MOV24H,#00H;复位
MOV38H,#00H
MOV39H,#00H
LJMPN0
N1:
JBP1.1,N2;P1.1=1时转移
MOVC,P1.1
JCN1
LCALLDELAY1;延时
JCN1
MSTOP4:
MOVC,P1.1;P1.1=0时转移
JNCMSTOP4
LCALLDELAY1;延时
MOVC,P1.1
JNCMSTOP4
INC23H;分钟加一
MOVA,23H
CJNEA,#60,GO21;分钟计数循环
MOV23H,#00H;复位
MOV36H,#00H
MOV37H,#00H
LJMPN0
GO21:
MOVB,#0AH
DIVAB
MOV36H,B;将A的低4位存入36单元
MOV37H,A;将A的高4位存入37单元
LJMPN0
GO22:
MOVB,#0AH
DIVAB
MOV38H,B;将A的低4位存入38单元
MOV39H,A;将A的高4位存入39单元
LJMPN0
N2:
JBP1.0,N0;P1.0=1时转移
MOVC,P1.0
JCN2
LCALLDELAY1;延时
MOVC,P1.0
JCN2
STOP2:
MOVC,P1.0
JNCSTOP2
LCALLDELAY1
MOVC,P1.0
JNCSTOP2
MOV50H,#00H
LJMPMAIN
TIMEPRO:
MOVA,21H
MOVB,23H
CJNEA,B,BK;判断定时闹钟的分钟
MOVA,22H
MOVB,24H
CJNEA,B,BK;判断定时闹钟的小时
SETB25H.0
MOVC,25H.0
LCALLTIMEOUT;调用TIMEOUT
BK:
RET
TIMEOUT:
X1:
LCALLBZ;调用喇叭响应程序
LCALLDISPLAY2;延时
CLR25H.0;调用喇叭响应程序结束
JBP1.0,X1;P1.0=1时转移
LCALLDELAY;延时
CLR25H.0
LJMPDISPLAY1
BZ:
CLRP3.7
MOVR7,#250;喇叭响应时间
T2:
MOVR6,#124
T3:
DJNZR6,T3
DJNZR7,T2
SETBP3.7
RET
LOOKATIME:
LCALLDISPLAY2
MM:
JNBP1.0,LOOKATIME
LCALLDELAY1
LJMPMAIN
DELAY1:
MOVR4,#14H;时间延时
DL001:
MOVR5,#0FFH
DL111:
DJNZR5,DL111
DJNZR4,DL001
RET
;***********定时**************
TIME:
PUSHACC;保护现场
PUSHPSW
MOVTH0,#03CH;初值
MOVTL0,#0B0H
DJNZR2,RET0
MOVR2,#14H
MOVA,20H
CLRC
INCA;秒自加一
CJNEA,#3CH,GO1;秒计数循环
MOV20H,#0;复位
MOV30H,#0
MOV31H,#0
MOVA,21H
INCA;分钟自加一
CJNEA,#3CH,GO2;分钟计数循环
MOV21H,#0H;复位
MOV32H,#0
MOV33H,#0
MOVA,22H
INCA;小时自加一
CJNEA,#18H,GO3;小时计数循环
MOV22H,#00H;复位
MOV34H,#0
MOV35H,#0
AJMPRET0
GO1:
MOV20H,A
MOVB,#0AH
DIVAB
MOV31H,A;将A的低4位存入31单元
MOV30H,B;将A的高4位存入30单元
AJMPRET0
GO2:
MOV21H,A
MOVB,#0AH
DIVAB
MOV33H,A;将A的低4位存入33单元
MOV32H,B;将A的高4位存入32单元
AJMPRET0
GO3:
MOV22H,A
MOVB,#0AH
DIVAB
MOV35H,A;将A的低4位存入35单元
MOV34H,B;将A的高4位存入34单元
AJMPRET0
RET0:
POPPSW;恢复现场
POPACC
RETI
;;;******显示子程序**********
DISPLAY1:
MOVR0,#30H
MOVR3,#0FEH
MOVA,R3
PLAY1:
MOVP2,A
MOVA,@R0;取要显示的数据
MOVDPTR,#DSEG1;指向字形段码首地址
MOVCA,@A+DPTR
CPLA;查表取字形段码
MOVP0,A;指向P0口
LCALLDL1
MOVP2,#0FFH
MOVA,R3;判断是否显示到最低位
RLA;左移一位
JNBACC.6,LD1
INCR0;缓冲器地址加一
MOVR3,A
LJMPPLAY1
LD1:
RET
DISPLAY2:
PUSHACC;保护现场
PUSHPSW
MOVR0,#36H
MOVR3,#0FBH
MOVA,R3
PLAY2:
MOVP2,A
MOVA,@R0;取要显示的数据
MOVDPTR,#DSEG1;指向字形段码首地址
MOVCA,@A+DPTR
CPLA;查表取字形段码
MOVP0,A;指向P0口
LCALLDL1;调用DL1
MOVP2,#0FFH
MOVA,R3;判断是否显示到最低位
RLA;左移一位
JNBACC.6,LD2
INCR0;缓冲器地址加一
MOVR3,A
LJMPPLAY2;调用PLAY2
LD2:
POPPSW
POPACC;恢复现场
RET
;;;;;;;DELAY;;;;;;;;
DL1:
MOVR7,#20H
DL:
MOVR6,#20H
DL6:
DJNZR6,$
DJNZR7,DL
RET
DSEG1:
DB3FH,06H,5BH,4FH,66H;七段码表
DB6DH,7DH,07H,7FH,6FH
END
4protell软件仿真
通过S1、S2、S3和S4四个按键,对时间进行修改和闹钟的设置。
定时时间到能发出报警声,使用KEIL软件编辑程序,生成HEX文件,然后用protel进行仿真,系统运行初始状态:
按下S1键显示闹钟,松开后显示时间;按下S4键进入时间修改模式,再按S4键时间的时加1,按S2分加1,调整结束后按下S1恢复正常显示;按下S3键进入闹钟修改模式,再按S3键闹钟的时加1,按S2分加1,调整结束后按下S1恢复正常显示。
5课程设计体会
课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在,作为二十一世纪的大学生来说掌握单片机的开发技术是十分重要的。
通过本次单片机原理及应用课程设计使我充分认认到了课程设计的理要性和必要性,本次设计使我对已学过的基础知识有了更深入的理解,学会了独立思考、独立工作以及对应用所学基本理论分析和解决实际问题的能力有了很大的提高。
另外,本次设计使我的实际操作技能得到了训练,同时也进一步培养了我严谨的科学作风。
回顾起此次单片机课程设计,从选题到定稿,从理论到实践,在整整两个星期的日子里,可以说得是苦多于甜,但是从中却学到很多很多的的东西,不但巩固了以前所学过的知识,而且对单片机原理课外知识也的到了拓展。
做的过程中,开始的确遇到了不少困难的问题,比如说芯片管脚不熟悉怎么放置,对单片机汇编语言掌握得不好等等,同时在这过程中也发现了自己的许多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
通过单片机课程设计之后,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我们还学会了如何去培养创新精神和严谨的科学作风,从而不断地战胜自己,超越自己。
更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。
参考文献
[1].何宏.单片机原理及接口技术教程.北京:
国防工业出版社,2008.4
[2].李广弟.单片机基础.北京:
北京航空航天大学出版社,1992
[3].何立民.单片机应用技术大全.北京:
北京航空航天大学出版社,1994
[4].张毅刚.单片机原理及接口