基于单片机控制的教学打铃系统的设计与实现.docx
《基于单片机控制的教学打铃系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的教学打铃系统的设计与实现.docx(38页珍藏版)》请在冰点文库上搜索。
基于单片机控制的教学打铃系统的设计与实现
微机控制系统应用方向学年设计任务书
学院
计算机与信息工程学院
专业
计算机科学与技术
课程名称
微机控制系统应用方向
题目
基于单片机控制的教学打铃系统的设计与实现
完成期限
2021年7月3日—2021年8月29日共8周
内
容
及
任
务
一、工程的目的
1.利用单片机设计简单的教学打铃系统;
2.掌握设计文档的撰写技巧。
二、工程任务的主要内容和要求
1.能够用7段数码管或者LCD显示时间;
2.能够对当前的时间设置进行校正;
3.能够按照学校当前的作息时间进行打铃;
4.完成系统设计说明文稿。
三、工程设计〔研究〕思路
1.7月3号到7月8号这段时间组织组员讨论和分析本系统所需的功能,所需的硬件器件,并搭建电路;
2.7月9号到8月21号这段时间进行本系统的程序设计,完成该系统所需的功能模块;
3.8月22号到8月27号这段时间完成整个系统程序并进行系统测试;
编写学年设计报告文档。
四、具体成果形式和要求
1.本系统是在proteus仿真软件里进行测试;
2.能通过7段数码管显示当前时间;
3.能利用蜂鸣器按照学校当前的作息时间进行打铃;
4.通过按键可以进行当前时间的校正以及作息时间的修改。
进
度
安
起止日期
工作内容
排
1
2021年7月3日—2021年7月8日
全组人讨论硬件环境设计的思路以及软件设计的思路
2
2021年7月9日—2021年7月15日
能够在数码管中显示电子钟并且到一定时间时自动打铃
2
2021年7月16日—2021年8月21日
实现能够对当前时间进行校正以及对作息时间进行修改
3
2021年8月22日—2021年8月27日
完成整个打铃程序的运行
4
2021年8月28日—2021年8月29日
编写学年设计文档
主
要
参
考
资
料
[M].北京:
高等教育出版社,1995.
[M].北京:
电子工业出版社,2021.
[3]孙江宏.Protel99电路设计与应用[M].北京:
机械工业出版社,2001.
[4[J].电脑编程技巧与维护,2021,1〔17〕:
23-26.
[5[J].科学技术与工程,2021,11〔31〕:
204-207.
[6[J].湖南农机,2021,4〔5〕:
85-86.
[7]于永.51单片机C语言常用模块与综合系统设计实例精讲[M].北京:
电子工业出版社,2007.
指导教师
意见
〔签字〕:
×年×月×日
系〔教研室〕主任意见
〔签字〕:
×年×月×日
基于单片机控制的教学打铃系统的设计与实现设计说明书
〔封面〕
学院名称:
滁州学院
班级名称:
计算机科学与技术专业10级〔2〕班
学生姓名:
方纪锋、贝兴芝、陈文君、陈丹丹、陈竞
学号:
2021211081、2021211066、2021211073、2021211068、2021211070
题目:
基于单片机控制的教学打铃系统的设计与实现
指导教师
姓名:
姚光顺
起止日期:
2021年7月3日—2021年8月29日
基于单片机控制的教学打铃系统的设计与实现
第一局部:
正文局部
一、绪论
1设计背景
目前自动打铃系统广泛应用于生活、工作等方方面面,在人们的日常生活中起到重要作用。
例如,在学校生活中,每天上下课都离不开打铃器的使用。
打铃器可以为上下课的学生和老师们提供时间提醒,同时,也可作为一个提醒学生们作息时间的时间表,让大家有一个时间意识,形成规律的生物钟,对自身的健康也有很大的好处的。
对于那些上课精力过于集中、知识面拓展比拟广的老师的拖堂现象也给了一个下课时间提醒,以免耽误学生们下一节课的上课时间。
最原始的打铃器是人工根据时间通过敲钟来提醒,随着技术的开展,开始有了机械式打铃器。
随着二十世纪电子技术的开展和二十一世纪半导体技术和集成电路的开展,电子技术开始渗入到各行各业,打铃器也更多的向着智能型转变。
设备的智能化离不开单片机的使用。
基于以上原因,本学年设计了一款基于单片机的自动打铃系统,使用简单方便。
2主要工作和方法
本系统主要完成以下工作:
⑴能够通过7段数码管显示时间;
⑵能够通过按键对当前的时间设置进行校正;
⑶能够按照学校当前的作息时间进行打铃;
⑷能够通过按键对学校当前的作息时间进行修改。
3本文结构
本文第1局部绪论主要说明了本文的设计背景、主要工作和实现方法。
第2局部相关知识介绍了单片机的概念、结构,数码管的相关知识,蜂鸣器的相关知识。
第3局部系统设计,阐述了需求分析、系统硬件设计和系统工作流程设计。
第4局部系统实现介绍了系统各个功能模块。
第5局部系统测试与数据分析,介绍了所用元件和调试过程。
二、相关知识
1单片机介绍
⑴单片机概念
本系统采用AT89C51系列单片机。
AT89C51是一种带4K字节FLASH存储器〔FPEROM—FlashProgrammableandErasableReadOnlyMemory〕的低电压、高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
⑵单片机结构
AT89C51的结构如图2-1所示:
图2-1AT89C51管脚图
AT89C51的管脚说明如下:
1VCC:
供电电压。
2GND:
接地。
3P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
4P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
5P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1〞时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1〞时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能存放器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
6P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1〞后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流〔ILL〕这是由于上拉的缘故。
P3口同时为闪烁编程和编程校验接收一些控制信号。
P3口也可作为AT89C51的一些特殊功能口,如表2-1所示:
表2-1AT89C51特殊功能表
管脚
备选功能
RXD〔串行输入口〕
TXD〔串行输出口〕
/INT0〔外部中断0〕
/INT1〔外部中断1〕
T0〔计时器0外部输入〕
T1〔计时器1外部输入〕
/WR〔外部数据存储器写选通〕
/RD〔外部数据存储器读选通〕
7RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
8ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
9/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
10/EA/VPP:
当/EA保持低电平时,那么在此期间外部程序存储器〔0000H-FFFFH〕,不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源〔VPP〕。
11XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入;XTAL2:
来自反向振荡器的输出。
2显示器件简介
本系统的显示时间功能是按照一般电子表的显示进行设计的,让其显示6为数字时间信息即显示时、分、秒,再加上本钱等因素,所以我们选择用7段数码管进行显示。
一般的七段数码管拥有八个发光二极管用以显示十进制0至9的数字,也可以显示英文字母,包括十六进制和二十进制中的英文A至F〔a至f〕。
七段数码管由四个直向、三个横向及上右下角一点的发光二极管组成,由以上向条发光体组合出不同的数字。
除七段数码管外,还有十四及十六划的显示器,但现时已被点阵显示器所取代。
七段数码管分为共阳极及共阴极,共阳极的七段数码管的正极〔或阳极〕为八个发光二极管的共有正极,其他接点为独立发光二极管的负极〔或阴极〕,使用者只需把正极接电,不同的负极接地就能控制七段数码管显示不同的数字。
3蜂鸣器简介
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于电子产品中作发声器件。
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
压电式蜂鸣器工作原理:
当接通电源后〔1.5~15V直流工作电压〕,多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声
。
电磁式蜂鸣器工作原理:
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。
振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
三、系统设计
1需求分析
⑴设计任务
1能够通过7段数码管显示时间;
2能够通过按键对当前的时间设置进行校正;
3能够按照学校当前的作息时间进行打铃;
4能够通过按键对学校当前的作息时间进行修改。
⑵根本要求
该系统具备以下几点根本要求:
1根本计时和显示功能〔用24小时制进行显示〕。
2能够设置当前时间。
3能够实现根本打铃功能,按照表3-1显示的时间进行打铃。
表3-1作息时间表
上午
下午
晚上
7:
50
预备铃
14:
10
预备铃
19:
20
预备铃
8:
00
第一节课上
14:
20
第五节课上
19:
30
第九节课上
8:
45
第一节课下
15:
05
第五节课下
20:
15
第九节课下
8:
55
第二节课上
15:
15
第六节课上
20:
25
第十节课上
9:
40
第二节课下
16:
00
第六节课下
21:
10
第十节课下
10:
00
第三节课上
16:
20
第七节课上
10:
45
第三节课下
17:
05
第七节课下
10:
55
第四节课上
17:
15
第八节课上
11:
40
第四节课下
18:
00
第八节课下
⑶性能指标
该系统具备以下性能指标:
1时钟:
时〔2位〕、分〔2位〕、秒〔2位〕,时分秒用“--〞分开。
2校对键:
设置键,左移/右移键,加减键,确定/取消键,添加键。
3响铃:
蜂鸣器。
2系统硬件电路设计
分析完单片机教学打铃系统原理及特点后,设计了以下硬件系统。
⑴总体方案设计
本系统是基于单片机AT89C51的教学打铃系统。
系统硬件电路包括:
AT89C51单片机的最小系统硬件电路、时钟电路、显示电路、打铃电路。
本系统的结构框图如图3-1所示:
图3-1系统结构图
⑵硬件电路图
该系统的硬件电路如图3-2所示:
图3-2硬件电路图
⑶按键电路
本系统接有8个按键,按键的一端接地。
另一端分别单片机的P1.0~P1.7口。
按键从上到下的功能分别是:
设置按键、加按键、减按键,左移按键、右移按键、确定按键、取消按键和修改闹铃按键。
按键电路模块如图3-3所示:
图3-3按键电路模块图
⑷显示电路
根据设计要求,该系统采用共阴极数码管,其公共端接单片机的P0口。
数码管显示电路使用AT89C51的动态显示功能,数码管的八段〔a、b、c、d、e、f、g、dp〕接入单片机的P2口,数码管分别显示:
“时〞、“—〞、“分〞、“—〞、“秒〞。
数码管显示电路如图3-4所示:
图3-4显示电路图
⑸打铃电路
打铃电路〔接P3.7〕:
当前时间与程序设定时间相同时,P3.7端输出高电平的方波,即打铃。
打铃电路模块如图3-5所示:
图3-5打铃电路图
3软件设计流程图
图3-6主程序流程图
4显示程序设计
利用12MHz中断做时钟源进行计时,每20次中断秒加1。
流程图如图3-7所示:
s
图3-7定时中断程序流程图
5按键设定程序设计
本系统接有8个按键从上到下的功能分别是:
设置按键、加按键、减按键,左移按键、右移按键、确定按键、取消按键和修改闹铃按键。
当P1口输出低电平时,按键被按下,执行校正时钟操作和修改作息时间操作。
⑴校正时钟程序流程图
图3-8校正时钟程序流程图
⑵修改作息时间流程图
图3-9修改作息时间流程图
四、系统实现
1功能模块
⑴时钟显示模块设置
确定时钟是利用定时器T0溢出中断方式,通过设置T0参数确定计时的基数,再对基数的计数确定出秒数,分钟数和时数。
再用数码管将时间显示出来,其模块程序如下:
///////////////////////////////////////////电子钟中断处理函数
voidtime()interrupt1{//定时器0中断
TH0=(65536-50000)/256;//设置T0参数,定时50ms
TL0=(65536-50000)%256;
if(temp>19){//定时20次,50ms*20=1s
temp=0;second++;//秒加加
if(second>59){
second=0;minute++;//分加加
if(minute>59){
minute=0;hour++;//时加加
if(hour>23)
hour=0;
}}}
else
temp++;}
///////////////////////////////////////////////////数码管显示函数
voidshow(){
P0=dis[0];P2=dis1[second%10];delay(40);//显示秒
P0=dis[1];P2=dis1[second/10];delay(40);
P0=dis[2];P2=dis1[10];delay(40);
P0=dis[3];P2=dis1[minute%10];delay(40);//显示分
P0=dis[4];P2=dis1[minute/10];delay(40);
P0=dis[5];P2=dis1[10];delay(40);
P0=dis[6];P2=dis1[hour%10];delay(40);//显示时
P0=dis[7];P2=dis1[hour/10];delay(40);
}
中断处理函数采用方式1,最大能计时65536次,所以在该函数中最大能定时50ms;由于显示是按秒进行显示的,所以需要定时20次才能到达1s。
然后再显示函数中显示当前时间,其中P0口是用来选择用哪个数码管显示,P2口是用来显示当前数码管的数值。
⑵时钟校正模块设置
当数码管显示的时间与实际时间不符时,可对其数码管显示的时间进行校正,点击设置键进入时间调整的状态,可用加减键,左移右移键对秒,分,时进行调整。
最后点击确定或取消键完成时间校正。
其模块程序如下:
////////////////////////////////////////////////////加时间
voidadd(){
if(setflag>0){
if(lr==0){//修改秒的个位
second++;
if(second>=60)second=0;
}
if(lr==1){//修改秒的十位
second=second+10;
if(second>=60)second=0;
}
if(lr==3){//修改分的个位
minute++;
if(minute>=60)minute=0;
}
if(lr==4){//修改分的十位
minute=minute+10;
if(minute>=60)minute=0;
}
if(lr==6){//修改时的个位
hour++;
if(hour>=24)hour=0;
}
if(lr==7){//修改时的十位
hour=hour+10;
if(hour>=24)hour=0;
}}
}
//////////////////////////////////////////////////减时间
voidreduce(){
if(setflag>0){
if(lr==0){//修改秒的个位
second--;
if(second<0)second=0;
}
if(lr==1){//修改秒的十位
second=second-10;
if(second<0)second=0;
}
if(lr==3){//修改分的个位
minute--;
if(minute<0)minute=0;
}
if(lr==4){//修改分的十位
minute=minute-10;
if(minute<0)minute=0;
}
if(lr==6){//修改时的个位
hour--;
if(hour<0)hour=0;
}
if(lr==7){//修改分的十位
hour=hour-10;
if(hour<0)hour=0;
}}
}
时钟校正的核心技术也就是对选择的时间进行加减来实现校正。
为了方便对时、分、秒的校正,本模块设计了左移、右移的功能,通过按键选择要修改的时、分、秒。
⑶作息时间修改模块设置
当需要修改某个作息时间时,可选择某个作息时间进行修改,先点击修改键进入作息时间修改的状态,再点击左移右移键选择修改哪个作息时间,然后点击设置键对作息时间进行调整,可用加减键,左移右移键对秒,分,时进行调整。
最后点击确定或取消键完成作息时间修改。
其模块程序如下:
switch(key_code){//判断选择哪个按钮
case0xfe:
set();break;//点击设置按钮
case0xfd:
add();break;//加时间
case0xfb:
reduce();break;//减时间
case0xf7:
lr++;if(lr>7)lr=0;break;//左移加
case0xef:
lr--;if(lr<0)lr=7;break;//右移减
case0xdf:
cancel();break;//取消时间的校正
case0xbf:
save();break;//保存时间的校正
}
voidupdate(){
TR0=0;//停止计时
secondu=second;minuteu=minute;houru=hour;hour=bell_hour[chance];
minute=bell_minute[chance];
second=0;
}
此模块中当点击设置键、加减键以及左移右移键的程序实现同作息时间修改模块设置里的设置键、加减键以及左移右移键的程序实现。
⑷打铃模块设置
将当前的时间与设置的打铃时间进行比照,假设两个时间相同时那么开始打铃,假设时间不相同那么不打铃,其模块程序如下:
////////////////////////////////////////////定时器1控制打铃的时间
voidbellTime()interrupt3{
TH1=(65536-50000)/256;//设置定时器1的初始参数
TL1=(65536-50000)%256;
SPK=!
SPK;//给蜂鸣器赋值,让其响,实现打铃。
if(++time_count==400){//响铃时间
time_count=0;
Bell_Time=0;//到时间后关闭响铃
}
}
///////////////////////////////////////////////////电子钟中断处理
voidtime()interrupt1{//定时器0中断
uchari;
flag1=0;flag2=0;flag3=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(temp>19){//定时20次
temp=0;
second++;
if(second>59){
second=0;minute++;
if(minute>59){
minute=0;hour++;
if(hour>23)hour=0;
}
}
}
else
temp++;
if(second==0)//用于判断该时间是否为打铃时间
flag1=1;
if(t==0){//找到第一个打铃的时间
for(i=t;i<23;i++){//找到第一个打铃的时间
if(minute==bell_minute[i])//判断当前的时间与目前打铃的时间是否相等
flag2=1;
if(hour==bell_hour[i])
flag3=1;
if(flag2==1&&flag3==1){
t=i;//得到第一个打铃时间在数组里的位置
break;}
}}
if(t>0){//找到第一个闹铃后其他的闹铃按如下处理
if(bell_minute[t]==0&&bell_hour[t]==0){kk=1;}
if(minute==bell_minute[t])
flag2=1;
if(hour==bell_hour[t])
flag3=1;
}
if(flag1==1&&flag2==1&&fl