单片机设计电子打铃器.docx
《单片机设计电子打铃器.docx》由会员分享,可在线阅读,更多相关《单片机设计电子打铃器.docx(21页珍藏版)》请在冰点文库上搜索。
单片机设计电子打铃器
摘要0
引言0
第一章设计简介及方案论述1
第二章设计思路与方案1
2.1单片机总体设计思路1
2.2各功能模块程序实现原理分析2
2.3AT89C51单片机性能介绍2
第三章电子打铃系统硬件设计5
3.1系统主要硬件电路5
3.3蜂鸣器驱动模块的硬件设计7
第四章系统软件设计7
4.1系统软件设计的主要内容8
4.2主程序流程设计8
第五章系统调试与测试结果分析10
5.1系统调试10
5.2调试现象及分析10
5.3仿真结果10
第六章、心得体会12
参考文献:
12
附录:
13
摘要
本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动,由三块LED数码管构成的显示系统,与传统的基于8/16位普通单片机的LED显示系统相比较,本系统在不显着地增加系统成本的情况下,可支持更多的LED数码管稳定显示。
设计采用AT98C51单片机,使用5V电源供电,并且在按键的作用下可以进行调时,调分,复位功能。
计时数据的更新在计算机C语言的驱动下每秒自动进行一次,但不需程序干预其输出状态。
关键词:
AT89C51;数码管;LED
引言
本设计是根据我们所学习的单片机课程,按照大纲要求对我们进行的一次课程检验,是进行单片机课程训练的必要任务,也对我们掌握单片机应用有很大的帮助。
掌握单片机技术是一门不可或缺的技术,对我们将来的工作以及生活和学习都有很密切的联系。
近年来,随着电子技术和微机计算机的迅速发展,单片机的档次不断提高,其应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到了广泛的应用,成为现代电子系统中最重要的智能化的核心部件。
当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未有的速度被单片机智能控制系统所取代。
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。
学习单片机的最有效的方法就是理论与实践并重,本文用AT89C51单片机设计的一个电子打铃系统。
第一章设计简介及方案论述
1.1作息时间控制钟系统概述:
本设计是一个具有打铃功能的作息时间控制钟。
它利用89C51单片机的2Hz时基计时,进行年历计算,并用的蜂鸣器驱动模块将它打出来;在进行时间计算,分每加一时,都与规定的作息时间比较,如果相等则进行相应的控制或动作。
由七段显示驱动模块、蜂鸣器驱动模块和按钮控制模块三部分组成,四个按键用于报时及校正时间。
现代机关企业,特别是学校要求对时间加以控制,要按时打铃及播放广播,以保证学习与工作的正常运行。
本设计实现了这些功能,给学校及其他机关企业带来方便,整体性好,人性化强、可靠性高,实现了对时间控制的智能化。
1.2设计要求:
1利用单片机组成一个电子打铃器。
2按照学校上下课铃声次序设定定时间
3用一个蜂鸣器模拟电铃,响铃10s。
4周六周日不打铃
5通过“周”“时”键和“分”键分别校正周、时和分,每按一次对应+1。
第二章设计思路与方案
2.1单片机总体设计思路
(1)设计能正常工作的一个单片机最小硬件系统,外围电路包括设置键盘,LCD或LED的显示屏;
(2)进行软件设计,利用单片机系统时钟先设计一个高精度的内部时钟系统,最小精确时间为期1秒;
(3)在秒计数器的基础上设计一个24小时时钟,并设计若干定时功能;
(4)设计打铃执行机构,完成自动打铃功能。
2.2各功能模块程序实现原理分析
图2-1
模块组成框图如图2-1所示,该模块由蜂鸣器驱动模块、蜂鸣器驱动模块和按钮控制模块三部分组成。
且三部分都通过AT89C51来实现。
七段式数码管驱动模块
采用动态扫描方式,通过一组单片机端口驱动并联在一起的LED发光管的一端(共阴或共阳端),LED发光管的另一脚接通用I/O口,控制其亮灭。
该方法能驱动较多的LED,控制方式较灵活,而且节省单片机的资源。
蜂鸣器驱动模块
采用压电式蜂鸣器,压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5-15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
按钮控制模块
四个按钮的一端分别接地,另一端接单片机一个端口的四个引脚,当某一个按钮按下的时候,其对应的引脚就由高电平变成低电平,然后通过单片机扫描读取引脚的电平来判断按钮是否按下。
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禁止,置位无效。
为使该模块化自动打铃系统具有更加方便和灵活性,我们对系统的硬件做了精心设计。
硬件电路包括七段式数码管驱动模块、蜂鸣器驱动模块、按钮控制模块等三大模块。
第三章电子打铃系统硬件设计
3.1系统主要硬件电路
系统主要硬件电路作为驱动整个打铃系统的电路又分为七段数码显示电路和蜂鸣器驱动电路。
由显示七段数码显示电路和蜂鸣器驱动电路组成的系统硬件主要电路如下:
图3-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)来实现打铃。
3.2七段式数码管驱动模块的硬件设计
LED数码管显示器内部有七个条形发光二极管和一个小圆点发光二极管组成,其结果图如下所示:
com
A
B
C
D
E
F
G
图3-4:
七段数码显示管
因而它的控制原理和发光二极管的控制原理是相同的。
根据各管接线的形式,可分成共阴极型和共阳极型。
其八个接口对应的字形如下表:
表一:
数码管字型码表
显示字形
dp
g
f
e
d
c
b
a
共阴极字型码
共阳极字型码
0
0
0
1
1
1
1
1
1
0x3F
0xC0
1
0
0
0
0
0
1
1
0
0x06
0xF9
2
0
1
0
1
1
0
1
1
0x5B
0xA4
3
0
1
0
0
1
1
1
1
0x4F
0xB0
4
0
1
1
0
0
1
1
0
0x66
0x99
5
0
1
1
0
1
1
0
1
0x6D
0x92
6
0
1
1
1
1
1
0
1
0x7D
0x82
7
0
0
0
0
0
1
1
1
0x07
0xF8
8
0
1
1
1
1
1
1
1
0x7F
0x80
9
0
1
1
0
1
1
1
1
0x6F
0x90
A
0
1
1
1
0
1
1
1
0x77
0x88
B
0
1
1
1
1
1
0
0
0x7C
0x83
C
0
0
1
1
1
0
0
1
0x39
0xC6
D
0
1
0
1
1
1
1
0
0x5E
0xA1
E
0
1
1
1
1
0
0
1
0x79
0x86
F
0
1
1
1
0
0
0
1
0x71
0x8E
3.3蜂鸣器驱动模块的硬件设计
本设计中的蜂鸣器驱动模块用到了蜂鸣器(SPEAKER)、三极管、100欧姆的电阻。
将蜂鸣器的一段接地,另一端接三极管的发射极,三极管的基极通过100欧姆的电阻接在三极管的P3.7引脚,三极管的集电极接+5V的电源。
其电路图如下图所示:
图3-5:
蜂鸣器驱动电路图
第四章系统软件设计
软件是该LED显示屏控制系统的重要组成部分,在系统的软件设计中我们也才用了模块化设计,将系统的各部分功能编写成子模块的形式,这样增强了系统软件的可读性和可移植性。
4.1系统软件设计的主要内容
系统软件设计由三个模块编程组成:
蜂鸣器打铃编程,七段显示管显示编程,按键编程。
4.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,识别后则进行调时快进,此时停止闪烁。
主程序流程设计图:
图4.1
如图所示主程序开始初始化后,就跳转到中断服务程序,如正常走时,则往下进行打铃时间的比较,继续向下执行对打铃的判断程序;如不正常走时,则直接转到显示程序。
这以后,继续执行按键的检测,若有键按下,则取值打铃;反之,则返回到中断服务程序的开始继续执行。
主程序清单见附录。
第五章系统调试与测试结果分析
5.1系统调试
根据系统设计方案,本系统的调试共分为三大部分:
硬件调试,软件调试和软硬件联调。
由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试:
LED驱动模块的调试,数据存储模块的调试,PC机通信模块的调试等,最后将各模块组合后进行整体测试。
5.2调试现象及分析
进入调试状态后应该在关键的地方设置断点然后按步运行,同时观察参数的变化,通过变化来判断程序运行的过程即可找出程序中混乱的部分,进行改正,这需要对软件熟练的掌握和对语言程序的很好的理解,实验板搭建成功后,我们就进入了程序的设计和调试阶段,开始编写程序时很顺利,但是后来在调试过程中出现了很多的错误,比如定时器准确度的设置,子程序的调用问题,最困难的就是对没步程序执行顺序的分析,由于程序中一些语句的错误理解和执行顺序的判断失误,让我掉进了误区,耽误了很长时间,最后在同学的帮助下终于找到了错误的关键点,更正成功了。
看来对程序的调试能力我还需要加强,程序的调试需要耐心,而且需要熟练掌握软件的跟部分功能。
5.3仿真结果
此系统的仿真效果很好,能实现设计要求和目的所规定的内容。
下面是两幅仿真结果图:
图5-1
图5-2
第六章、心得体会
本系统被广泛用企事业单位,设计比较简单。
经过一学期的学习,使我对单片机有了初步的认识,了解了一些软件编程的技巧。
经过这次的课程设计,使我学会了课堂上学不到的知识,颇有一番感受,对于单片机更加的了解了,对各种器件的使用方法更加熟悉,学会了电路的基本设计思路和原理,掌握单片机设计步骤,知道这门课程在工作中的重要性。
由于知识点不够精通,所以经常出现问题,在程序设计中我太过马虎,导致第一次制作出来的打铃器不正常工作,仔细检查后我发现程序有错误,然后经过仔细排查我修改了错误。
在电路调试过程中我发现了电路的一些问题,但在老师和同学们的同共努力下都得到解决,。
这些教训使我领悟到了科学是严谨的,不能有一点马虎,所以我们在对待科学的态度上应该要一丝不苟。
最终看到了成果。
另外,如果在工作中遇到困难,就要及时虚心向他人请教,提早解决问题,这样才不至于延误工作。
课程设计加深了学生对所学课程理论的理解,扩展了教学中的实验内容和要求,积累了实践体验和经验,让我们提前感受到毕业设计的大致过程,进而能顺利进入毕业设计,提高毕业设计质量和学生实际应用能力。
参考文献:
《电子技术基础:
模拟部分》北京高等教育出版社康华光1999
《单片机原理及接口技术》北京航空航天大学出版社李朝青2005
《单片机课程设计指导》北京航空航天大学出版社楼然苗2007
《单片机实验与实践教程》北京航空航天大学出版社何立民2004
附录:
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodesegcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//0,1,2,3,4,5,6,7,8,9,-
ucharcodedispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选码
uintcodexshijianbiao[]={10500,75000,80000,84500,85500,94000,100000,104500,105500,114000,150000,154500,155500,164000,165000,173500,193000,213000};//夏季时间
uintcodedshijianbiao[]={11000,75000,80000,84500,85500,94000,100000,104500,105500,114000,143000,151500,152500,160500,161500,170000,190000,210000};//冬季时间
ucharbuffer[]={1,1,0,0,0,0,0,0};
uintzhou,hour,min,sec,shijian;
uintstatus;
sbitspot=P0^7;
sbitled=P3^7;
sbitdxxz=P1^0;
//函数声明
voiddelayMS(uintt);
voidkeyprocess(unsignedcharkey);
voiddisplay();
voidtimer0();
voidshanl();
//延时函数
voiddelayMS(uintt)//晶振频率12M
{
uinti;
while(t--)
for(i=0;i<125;i++);
}
//比较打铃函数
voidcompare()
{
uinti;
shijian=hour*10000+min*100+sec;
for(i=0;i<18;i++)
{
if(dxxz==1)
{
if(dshijianbiao[i]==shijian&&zhou!
=6&&zhou!
=7)
{
uinti;
for(i=0;i<235;i++)
{
display();
led=0;
delayMS(20);
led=1;
}
}
}
else
{
if(xshijianbiao[i]==shijian&&zhou!
=6&&zhou!
=7)
{
uinti;
for(i=0;i<235;i++)
{
display();
led=0;
delayMS(20);
led=1;
}
}
}
}
}
//按键处理函数
voidkeyprocess(unsignedcharkey)//键值处理,正常计时,设置时分秒
{
switch(key)
{
case0xB0:
if(zhou<7)
zhou++;
elsezhou=1;
break;
case0xe0:
if(hour<23)
hour++;//小时加1
elsehour=0;break;
case0xd0:
if(min<59)min++;
//分钟加1
elsemin=0;break;
break;
default:
break;
}
}
//数码管显示函数
voiddisplay()
{
uchari;//正常计时显示
buffer[0]=zhou;
buffer[1]=hour/10;//显示时的十位
buffer[2]=hour%10;//显示时的个位
buffer[3]=min/10;//显示分的十位
buffer[4]=min%10;//显示分的个位
buffer[6]=sec/10;//显示秒的十位
buffer[7]=sec%10;//显示秒的个位
for(i=0;i<8;i++)
{
if(i==0||i==2||i==4)
{
P0=segcode[buffer[i]];//赋于段选值
{
if(sec%2==0)
spot=0;
else
spot=1;
}
P2=dispbit[i];//赋于位选值
}
else
{
P0=segcode[buffer[i]];
P2=dispbit[i];
}
delayMS
(1);//防止数码管显示的时候闪动
P2=0x0;
}
}
//定时器0中断函数
voidtimer0()interrupt1using2
{
staticuintcount;
TH0=(65536-1000)/256;//定时器0设置初始值1ms中断初始值
TL0=(65536-1000)%256;
TR0=1;
count++;//正常计时
if(count>=1000)//定时1S到,以下为时钟的正常走钟逻辑
{
count=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)
{
hour=0;
zhou++;
if(zhou>=7)
{
zhou=1;
}
}
}
}
}
}
main()//主函数
{
bi