单片机c下的自动打铃系统Word文件下载.docx
《单片机c下的自动打铃系统Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机c下的自动打铃系统Word文件下载.docx(30页珍藏版)》请在冰豆网上搜索。
![单片机c下的自动打铃系统Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/12/5591d7f0-e27b-4774-b775-2744bfcb771c/5591d7f0-e27b-4774-b775-2744bfcb771c1.gif)
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。
学习单片机的最有效的方法就是理论与实践并重,本文用AT89C51单片机设计的一个自动打铃系统。
第一章设计简介及方案论述
1.1作息时间控制钟系统概述:
本设计是一个具有报时功能的作息时间控制钟。
它利用89C51单片机的2Hz时基计时,进行年历计算,并用的蜂鸣器驱动模块将它报出来;
在进行时间计算,分每加一时,都与规定的作息时间比较,如果相等则进行相应的控制或动作。
由七段显示驱动模块、蜂鸣器驱动模块和按钮控制模块三部分组成,四个按键用于报时及校正时间。
现代机关企业,特别是学校要求对时间加以控制,要按时打铃及播放广播,以保证学习与工作的正常运行。
本设计实现了这些功能,给学校及其他机关企业带来方便,整体性好,人性化强、可靠性高,实现了对时间控制的智能化。
1.2本设计任务和主要内容:
(1)设计任务
用可编程器件为主体,设计并制作一台自动打铃系统。
要求完成的作品必须固化软件,测试检查时上电即可工作,不允再用计算机下载。
实现能够显示当前的时间,同时能够在规定的时间点控制打铃装置打出预期的铃声。
另外增设四个按钮,通过分配以实现对时间的调整,包括对时钟、分钟的增加和减少,秒钟的清零;
以及强制打铃和关闭打铃。
(2)主要内容
1、基本计时和显示功能(用12小时制显示)。
包括上下午标志,时、分的数字显示,秒信号指示。
2、能设置当前时间(含上、下午,时,分)
3、能实现基本打铃功能,规定:
上午6:
00起床铃:
打铃5秒、停2秒、再打铃5秒。
下午10:
30熄灯铃:
铃声可用小喇叭播放,凡是用到铃声功能的均按此处理。
第二章系统主要硬件电路设计
2.1单片机总体设计思路
(1)设计能正常工作的一个单片机最小硬件系统,外围电路包括设置键盘,LCD或LED的显示屏;
(2)进行软件设计,利用单片机系统时钟先设计一个高精度的内部时钟系统,最小精确时间为期1秒;
(3)在秒计数器的基础上设计一个24小时时钟,并设计若干定时功能;
(4)设计打铃执行机构,完成自动打铃功能。
2.2各功能模块程序实现原理分析
图2-1
模块组成框图如图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:
七段数码显示管
因而它的控制原理和发光二极管的控制原理是相同的。
根据各管接线的形式,可分成共阴极型和共阳极型。
其八个接口对应的字形如下表:
表一:
数码管字型码表
显示字形
dp
g
f
e
d
c
b
a
共阴极字型码
共阳极字型码
1
0x3F
0xC0
0x06
0xF9
2
0x5B
0xA4
3
0x4F
0xB0
4
0x66
0x99
5
0x6D
0x92
6
0x7D
0x82
7
0x07
0xF8
8
0x7F
0x80
9
0x6F
0x90
0x77
0x88
0x7C
0x83
0x39
0xC6
0x5E
0xA1
0x79
0x86
0x71
0x8E
3.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只按键用来调整时间,另一只为强制打铃按钮
P1.0;
通过选择键选择调整位,选中位闪烁增加键ADD_KEY:
P1.1;
按一次使选中位加1减少键DEC_KEY;
P1.2;
按一次使选中位减1,如果长按ADD_KEY或DEC_KEY,识别后则进行调时快进,此时停止闪烁。
主程序流程设计图:
图3.1
如图所示主程序开始初始化后,就跳转到中断服务程序,如正常走时,则往下进行打铃时间的比较,继续向下执行对打铃的判断程序;
如不正常走时,则直接转到显示程序。
这以后,继续执行按键的检测,若有键按下,则取值打铃;
反之,则返回到中断服务程序的开始继续执行。
主程序清单见附录。
第四节系统调试与测试结果分析
4.1系统调试
根据系统设计方案,本系统的调试共分为三大部分:
硬件调试,软件调试和软硬件联调。
由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试:
LED驱动模块的调试,数据存储模块的调试,PC机通信模块的调试等,最后将各模块组合后进行整体测试。
4.11硬件调试
对各个模块的功能进行调试,主要调试各模块能否实现指定的功能。
4.12软件调试
软件调试采用单片机仿真器WAVE6000L及微机,将编好的程序进行调试,主要是检查语法错误。
4.13硬件软件联调
将调试好的硬件和软件进行联调,主要调试系统的实现功能。
4.2仿真结果
此系统的仿真效果很好,能实现设计要求和目的所规定的内容。
下面是两幅仿真结果图:
图4-1
图4-2
附录:
5.1汇编程序清单:
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
重新赋定时初值
CPL47H;
产生脉冲用于调时快进时基
INC24H
MOVA,24H
CJNEA,#10,ADD_TIME;
产生0.5秒基准时钟,用于调时闪烁
CPL48H;
取反调时闪烁标志位
MOV24H,#00H
ADD_TIME:
INC20H
MOVA,20H
CJNEA,#20,RETI1;
产生1秒基准时钟
一秒钟时间到,清零20H
CJNER2,#01H,ADD_M
INCR3
ADD_M:
MOVA,21H
ADDA,#01H
DAA;
作十进制调整
MOV21H,A
CJNEA,#60H,RETI1
一分钟到
MOVA,22H
ADDA,#01H
DAA
MOV22H,A
一小时到
MOVA,23H
MOV23H,A
CJNEA,#24H,RETI1
到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;
分
MOV2DH,A;
转换出分个位,存入2DH
MOV2CH,A;
转换出分十位,存入2CH
JB46H,