自动打铃系统课程设计.docx
《自动打铃系统课程设计.docx》由会员分享,可在线阅读,更多相关《自动打铃系统课程设计.docx(31页珍藏版)》请在冰豆网上搜索。
自动打铃系统课程设计
一、设计目的及方案论述………………………………………………………………………………………1
1.1作息时间控制钟系统概述……………………………………………………………………………………1
1.2本设计任务和主要内容…………………………………………………………………………………………1
二、系统硬件电路设计…………………………………………………………………………………………2
2.1单片机总体设计思路………………………………………………………………………………………………2
2.2各功能模块程序实现原理分析……………………………………………………………………………2
2.21七段式数码管驱动模块………………………………………………………………………………………2
2.22蜂鸣器驱动模块………………………………………………………………………………………………………2
2.23按钮控制模块……………………………………………………………………………………………………………3
2.3系统主要硬件电路………………………………………………………………………………………………………5
2.31七段式数码管驱动模块的硬件设计………………………………………………………………6
2.32蜂鸣器驱动模块的硬件设计………………………………………………………………………………7
三、系统软件设计………………………………………………………………………………………………………8
3.1系统软件设计的主要内容……………………………………………………………………………………8
3.2系统软件设计的流程图……………………………………………………………………………………………8
四、系统调试与测试结果分析………………………………………………………………………9
4.1系统调试………………………………………………………………………………………………………………………9
4.2仿真结果………………………………………………………………………………………………………………………10
五、设计心得……………………………………………………………………………………………………………………10
六、附录及参考文献………………………………………………………………………………………………11
6.1汇编程序清单………………………………………………………………………………………………………………11
6.2器材仪表…………………………………………………………………………………………………………………………25
6.3参考资料………………………………………………………………………………………………………………………25
自动打铃系统的设计
一、设计目的及要求
1.1设计目的
掌握自动打铃系统的设计原理和设计方法,并用89C51集成芯片实现。
1.2本设计要求
1、基本计时和显示功能(用12小时制显示)。
包括上下午标志,时、分的数字显示,秒信号指示。
2、能设置当前时间(含上、下午,时,分)
3、能实现基本打铃功能,规定:
上午6:
00起床铃:
打铃5秒、停2秒、再打铃5秒。
下午10:
30熄灯铃:
打铃5秒、停2秒、再打铃5秒。
铃声可用小喇叭播放,凡是用到铃声功能的均按此处理。
二、系统主要硬件电路设计
2.1单片机总体设计思路
(1)设计能正常工作的一个单片机最小硬件系统,外围电路包括设置键盘,LED显示屏;
(2)进行软件设计,利用单片机系统设计一个高精度的内部时钟系统,最小精确时间为期1秒;在秒计数器的基础上设计一个24小时时钟,并设计若干定时功能。
(3)设计打铃执行机构,完成自动打铃功能。
2.2各功能模块程序实现原理分析
模块组成框图如图2-1所示,该模块由蜂鸣器驱动模块、蜂鸣器驱动模块和按钮控制模块三部分组成。
且三部分都通过AT89C51来实现。
2.21七段式数码管驱动模块
采用动态扫描方式,通过一组单片机端口驱动并联在一起的LED发光管的一端(共阴或共阳端),LED发光管的另一脚接通用I/O口,控制其亮灭。
该方法能驱动较多的LED,控制方式较灵活,而且节省单片机的资源。
2.22蜂鸣器驱动模块
采用压电式蜂鸣器,压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5-15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
2.23按钮控制模块
四个按钮的一端分别接地,另一端接单片机一个端口的四个引脚,当某一个按钮按下的时候,其对应的引脚就由高电平变成低电平,然后通过单片机扫描读取引脚的电平来判断按钮是否按下。
2.3AT89C51单片机性能介绍
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
引脚说明:
VCC:
供电电压。
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.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
89C51各部分引脚图如下:
P1.0140Vcc
P1.1239P0.0
P1.2338P0.1
P1.3437P0.2
P1.4536P0.3
P1.5635P0.4
P1.6734P0.5
P1.7833P0.6
RST/Vpd932P0.7
RXDP3.01031EA/Vpp
TXDP3.11130ALE/-P
INT0P3.21229PSEN
INT1P3.31328P2.7
T0P3.41427P2.6
T1P3.51526P2.5
WRP3.61625P2.4
RDP3.71724P2.3
X21823P2.2
X11922P2.1
GND2021P2.0
图2-289C51引脚图
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
为使该模块化自动打铃系统具有更加方便和灵活性,我们对系统的硬件做了精心设计。
硬件电路包括七段式数码管驱动模块、蜂鸣器驱动模块、按钮控制模块等三大模块。
2.3系统主要硬件电路
系统主要硬件电路作为驱动整个打铃系统的电路又分为七段数码显示电路和蜂鸣器驱动电路。
由显示七段数码显示电路和蜂鸣器驱动电路组成的系统硬件主要电路如下:
图2-3:
系统主要硬件电路
该系统通过按钮控制(系统使用4只按键,3只按键用来调整时间,另一只为强制打铃按钮;调整选择键SET_KEY:
P1.0通过选择键选择调整位,选中位闪烁;增加键ADD_KEY:
P1.1按一次使选中位加1;减少键DEC_KEY:
P1.2按一次使选中位减1;如果长按ADD_KEY或DEC_KEY,识别后则进行调时快进,此时停止闪烁)AT89C51的计时和定时,在七段数码管上显示出来(实现24小时制电子钟,8位数码管显示,显示时分秒),再通过蜂鸣器(BEEP:
P3.7)来实现打铃。
2.31七段式数码管驱动模块的硬件设计
LED数码管显示器内部有七个条形发光二极管和一个小圆点发光二极管组成,其结果图如下所示:
com
A
B
C
D
E
F
G
图2-4:
七段数码显示管
因而它的控制原理和发光二极管的控制原理是相同的。
根据各管接线的形式,可分成共阴极型和共阳极型。
2.2.3蜂鸣器驱动模块的硬件设计
本设计中的蜂鸣器驱动模块用到了蜂鸣器(SPEAKER)、三极管、100欧姆的电阻。
将蜂鸣器的一段接地,另一端接三极管的发射极,三极管的基极通过100欧姆的电阻接在三极管的P3.7引脚,三极管的集电极接+5V的电源。
其电路图如下图所示:
图2-5:
蜂鸣器驱动电路图
三、系统软件设计
软件是该LED显示屏控制系统的重要组成部分,在系统的软件设计中我们也才用了模块化设计,将系统的各部分功能编写成子模块的形式,这样增强了系统软件的可读性和可移植性。
3.1系统软件设计的主要内容
系统软件设计由三个模块编程组成:
蜂鸣器打铃编程,七段显示管显示编程,按键编程。
3.2主程序流程设计
主程序初始化,并打开中断,然后执行中断服务程序。
实现24小时制电子钟,8位数码管显示,显示时分秒显示格式:
23-59-59(小时十位如果为0则不显示) 到预定时间启动蜂鸣器模拟打铃,蜂鸣器BEEP:
P3.7打铃方式分起床、熄灯铃和上、下课铃两种系统使用4只按键,3只按键用来调整时间,另一只为强制打铃按钮 调整选择键SET_KEY:
P1.0;通过选择键选择调整位,选中位闪烁增加键ADD_KEY:
P1.1;按一次使选中位加1减少键DEC_KEY;P1.2;按一次使选中位减1,如果长按ADD_KEY或DEC_KEY,识别后则进行调时快进,此时停止闪烁。
主程序流程设计图:
图3.1
如图所示主程序开始初始化后,就跳转到中断服务程序,如正常走时,则往下进行打铃时间的比较,继续向下执行对打铃的判断程序;如不正常走时,则直接转到显示程序。
这以后,继续执行按键的检测,若有键按下,则取值打铃;反之,则返回到中断服务程序的开始继续执行
3.3汇编程序清单:
BEEPEQUP3.7;定义蜂鸣器(电铃)控制信号输出口
ORG0000H;程序入口地址
LJMPSTART
ORG000BH;定时器0中断入口地址
LJMPTIMER_0
ORG0100H
;/*****程序开始,初始化*****/
START:
SETBBEEP;关闭蜂鸣器(电铃)
SETB48H;使用一个bit位用于调时闪烁标志
SETB47H;使用一个bit位用于产生脉冲用于调时快进时基
CLR45H;关闭响铃方式1标志
CLR44H;关闭响铃方式2标志
MOVR1,#0;调整选择键功能标志:
0正常走时、1调时、2调分、3调秒
MOV20H,#00H;用于控制秒基准时钟源的产生
MOV21H,#00H;清零秒寄存器
MOV22H,#00H;清零分寄存器
MOV23H,#00H;清零时寄存器
MOV24H,#00H;用于控制调时闪烁的基准时钟的产生
MOVR2,#00H;强制打铃标志
MOVR3,#00H;强制打铃时长标志
MOVIP,#02H;IP,IE初始化
MOVIE,#82H
MOVTMOD,#01H;设定定时器0工作方式1
MOVTH0,#3CH
MOVTL0,#0B0H;赋定时初值,定时50ms
SETBTR0;启动定时器0
MOVSP,#40H;重设堆栈指针
;/*****主程序*****/
MAIN:
CJNER1,#00H,MAIN1;是否为正常走时状态
LCALLBIJIAO1;调用起床、熄灯打铃比较子程序
LCALLBIJIAO2;调用上、下课打铃比较子程序
LCALLDALING1;调用响铃方式1执行子程序
LCALLDALING2;调用响铃方式2执行子程序
LCALLDALING3
MAIN1:
LCALLDISPLAY;调用显示子程序
LCALLKEY_SCAN;调用按键检测子程序
JZMAIN;无键按下则返回重新循环
LCALLSET_KEY;调用选择键处理子程序
JB46H,MAIN;如果已进行长按调整(调时快进),则不再执行下面的单步调整
LCALLADD_KEY;调用增加键处理子程序
LCALLDEC_KEY;调用减少键处理子程序
LCALLDALING_KEY;处理强制打铃/强制关闭铃声键
LJMPMAIN;重新循环
;/*****定时中断服务程序*****/
TIMER_0:
PUSHACC
PUSHPSW;保护现场
MOVTH0,#3CH
MOVTL0,#0B0H;重新赋定时初值
CPL47H;产生脉冲用于调时快进时基
INC24H
MOVA,24H
CJNEA,#10,ADD_TIME;产生0.5秒基准时钟,用于调时闪烁
CPL48H;取反调时闪烁标志位
MOV24H,#00H
ADD_TIME:
INC20H
MOVA,20H
CJNEA,#20,RETI1;产生1秒基准时钟
MOV20H,#00H;一秒钟时间到,清零20H
CJNER2,#01H,ADD_M
INCR3
ADD_M:
MOVA,21H
ADDA,#01H
DAA;作十进制调整
MOV21H,A
CJNEA,#60H,RETI1
MOV21H,#00H;一分钟到
MOVA,22H
ADDA,#01H
DAA
MOV22H,A
CJNEA,#60H,RETI1
MOV22H,#00H;一小时到
MOVA,23H
ADDA,#01H
DAA
MOV23H,A
CJNEA,#24H,RETI1
MOV23H,#00H;到24点,清零小时
RETI1:
POPPSW
POPACC;恢复现场
RETI;中断返回
;/*****显示处理*****/
DISPLAY:
MOVA,21H;秒
ANLA,#0FH
MOV2FH,A;转换出秒个位,存入2FH
MOVA,21H
ANLA,#0F0H
SWAPA
MOV2EH,A;转换出秒十位,存入2EH
JB46H,MIN;如果长按按键(调时快进),则跳过闪烁处理
CJNER1,#3,MIN;如果R1为3,闪烁秒位待调整
JB48H,MIN
MOV2FH,#0AH;使该位为10,查表得到使该位不显示的输出
MOV2EH,#0AH
MIN:
MOVA,22H;分
ANLA,#0FH
MOV2DH,A;转换出分个位,存入2DH
MOVA,22H
ANLA,#0F0H
SWAPA
MOV2CH,A;转换出分十位,存入2CH
JB46H,HOUR;如果长按按键(调时快进),则跳过闪烁处理
CJNER1,#2,HOUR;如果R1为2,闪烁分位待调整
JB48H,HOUR
MOV2DH,#0AH;使该位为10,查表得到使该位不显示的输出
MOV2CH,#0AH
HOUR:
MOVA,23H;时
ANLA,#0FH
MOV2BH,A;转换出时个位,存入2BH
MOVA,23H
ANLA,#0F0H
SWAPA
MOV2AH,A;转换出时十位,存入2AH
JB46H,DISP;如果长按按键(调时快进),则跳过闪烁处理
CJNER1,#1,DISP;如果R1为1,闪烁时位待调整
JB48H,DISP
MOV2BH,#0AH;使该位为10,查表得到使该位不显示的输出
MOV2AH,#0AH
;/*****数码管动态扫描显示*****/
DISP:
MOVDPTR,#TABLE
MOVA,2FH
MOVCA,@A+DPTR
MOVP0,A
CLRP2.7
LCALLDELAY
SETBP2.7;显示秒个位
MOVA,2EH
MOVCA,@A+DPTR
MOVP0,A
CLRP2.6
LCALLDELAY
SETBP2.6;显示秒十位
MOVA,#40H
MOVP0,A
CLRP2.5
LCALLDELAY
SETBP2.5;显示“-”
MOVA,2DH
MOVCA,@A+DPTR
MOVP0,A
CLRP2.4
LCALLDELAY
SETBP2.4;显示分个位
MOVA,2CH
MOVCA,@A+DPTR
MOVP0,A
CLRP2.3
LCALLDELAY
SETBP2.3;显示分十位
MOVA,#40H
MOVP0,A
CLRP2.2
LCALLDELAY
SETBP2.2;显示“-”
MOVA,2BH
MOVCA,@A+DPTR
MOVP0,A
CLRP2.1
LCALLDELAY
SETBP2.1;显示时个位
MOVDPTR,#TABLE1;该位使用TABLE1以消除前置0
MOVA,2AH
MOVCA,@A+DPTR
MOVP0,A
CLRP2.0
LCALLDELAY
SETBP2.0;显示时十位
RET
;/*****按键检测子程序*****/
KEY_SCAN:
CLR46H;关闭长按调整(调时快进)标志
MOVP1,#0FFH;将P1口设置成输入状态
MOVA,P1
CPLA
ANLA,#0FH;P1口低4位连接4个按键,只判断该4位
JZEXIT_KEY;无键按下则返回
LCALLDELAY;延时去抖动
MOVA,P1;重新判断
CPLA
ANLA,#0FH
JZEXIT_KEY;键盘去抖动
MOVR5,A;临时将键值存入R5
MOVR4,#00H;用于控制调时快进速度
;设置为00H是为了在进入长按处理前加长延时区分用户的长按与短按,防止误快进
LOOP:
;进入长按处理
LCALLDISPLAY;使长按时显示正常
MOVA,P1
CPLA
ANLA,#0FH
JB47H,LOOP1
INCR4;调时快进间隔时间基准加1
LOOP1:
CJNER1,#03H,LOOP2;如果调秒时长按,则不处理
LJMPLOOP3
LOOP2:
CJNER4,#99H,LOOP3
MOVR4,#70H;确认用户长按后,重新设定起始值,加快调时快进速度
SETB46H;长按调整(调时快进)标志
LCALLADD_KEY
LCALLDEC_KEY
LOOP3:
JNZLOOP;等待键释放
MOVA,R5;输出键值
RET
EXIT_KEY:
RET
;/*****延时子程序*****/
DELAY:
MOVR7,#150
DJNZR7,$
RET
;/*****选择键处理子程序*****/
SET_KEY:
CJNER5,#01H,EXIT;选择键键值
INCR1;调整选择功能标志加一
SETBBEEP
CJNER1,#4,EXIT
MOVR1,#0
MOV24H,#00H;调时闪烁基准清零
RET
;/*****增加键处理子程序*****/
ADD_KEY:
CJNER5,#02H,EXIT;增加键键值
CJNER1,#01H,NEXT1;选择键功能标志为1,调时,否则跳出
MOVA,23H
ADDA,#01H
DAA
MOV23H,A
CJNEA,#24H,EXIT
MOV23H,#00H
NEXT1:
CJNER1,#02H,NEXT2;选择键功能标志为2,调分,否则跳出
MOVA,22H
ADDA,#01H
DAA
MOV22H,A
CJNEA,#60H,EXIT
MOV22H,#00H
NEXT2:
CJNER1,#03H,EXIT;选择键功能标志为3,调秒,否则跳出
MOV21H,#00H;如增加键按下直接清零秒
RET
;/*****减少键处理子程序*****/
DEC_KEY:
CJNER5,#04H,EXIT;减少键键值
CJN