课程设计报告自动打铃系统.docx
- 文档编号:7586575
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:28
- 大小:227.39KB
课程设计报告自动打铃系统.docx
《课程设计报告自动打铃系统.docx》由会员分享,可在线阅读,更多相关《课程设计报告自动打铃系统.docx(28页珍藏版)》请在冰豆网上搜索。
课程设计报告自动打铃系统
目录
一、设计任务和性能指标2
1.1设计任务2
1.2性能指标2
二、设计方案2
三、系统硬件设置3
3.1、单片机最小系统3
3.2时钟电路DS13024
3.3、显示电路的设计5
3.4、键盘接口的设计6
3.5打铃电路的设计6
四、系统软件设计7
4.1程序流程图7
4.2主程序设计10
4.3显示子程序的设计12
五、调试及性能分析12
5.1调试步骤13
5.2性能分析13
六、心得体会13
参考文献13
附录1系统硬件电路图15
附录2程序清单16
一、设计任务和性能指标
1.1设计任务
用单片机器件为主体,设计一台自动打铃系统。
(一)基本要求
1、基本计时和显示功能(用12小时制显示)。
包括上下午标志,时、分的数字显示,秒信号指示。
2、能设置当前时间(含上、下午,时,分)。
3、能实现基本打铃功能,规定:
上午6:
00起床铃:
打铃5秒、停2秒、再打铃5秒。
下午10:
30熄灯铃:
打铃5秒、停2秒、再打铃5秒。
铃声可用小喇叭播放,凡是用到铃声功能的均按此处理。
(二)发挥部分
1、增加整点报时功能,整点时响铃5秒,要求有控制启动和关闭功能。
2、增加调整起床铃、熄灯铃时间的功能。
3、增设上午4节课的上下课打铃功能,规定如下:
7.30上课,8.20下课:
8.30上课,9.20下课;9.40上课,10.30下课;10.40上课,11.30下课;每次铃声5秒。
4、特色和创新自选。
1.2性能指标
1.时钟:
上下午(1位)、时(2位)、分(2位)
2.校对键:
确认键/设置键、右移键/灭铃键、加键、减键
3.响铃:
蜂鸣器二.设计方案
二、设计方案
按照系统设计的功能的要求,初步确定设计系统由主控模块、时钟模块、显示模块、键扫描接口电路共四个模块组成,电路系统构成框图如图1.1所示通过内部定时产生中断,从而驱动电铃打铃。
电路系统构成框图如图1.1所示。
主控芯片使用51系列AT89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。
它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。
时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片DS1302。
采用DS1302作为主要计时芯片、可以做到计时准确。
更重要的是,DS1302可以在很小的电流的后备电源(2.5~5.5V电源,在2.5V时耗电小于300nA)下继续计时,并可编程选择多种充电电流对后备电源进行慢速充电,可以保证后备电源基本不耗电。
采用串行数据传输,与单片机硬件连接简单,如果使用时钟芯片DS12887,将采用并行数据传输,占用更多的硬件资源。
因此为节省单片机端口,时钟芯片采用DS1302。
电铃
1.1硬件电路设计
设定51单片机工作在定时器工作方式1,每100ms产生一次中断,利用软件将基准100ms单元进行累加,当定时器产生10次中断就产生1S信号,这时秒单元加1。
同理,对分单元时单元和上下午单元计数,从而产生秒,分,时,上下午的值,通过五位七段显示器进行显示。
由于动态显示法需要数据锁存等硬件,接口较复杂,考虑显示只有五位,且系统没有其他复杂的处理任务,所以采用动态扫描实现LED的显示。
本系统采用四个按键,1键为功能键,另外三个做控制键。
按一下1键进入时间设置,接着按2键选择需要调整的位,然后按3和4键进行时调整,按3键进行加数,按4键进行减数,按两下1键调整结束时钟继续走动。
当时钟时间与设置时间一致时,驱动电路动作进行打铃,按时间点不同打铃规则不同,此时按2键强制灭铃。
三、系统硬件设置
3.1单片机最小系统
单片机最小应用系统的设计电路原理图,如图3.1所示。
本次设计我们选用了AT89C52单片机。
该单片机要求电源电压为+5V,所以40号引脚接+5V电源,20号脚接地。
因为AT89C52单片机的片内ROM为4KB,128位RAM,根据初步分析,本设计程序应该小于4KB,故无须外扩的ROM,所以单片机应直接访问片内程序存储器,单片机的31号脚接高电平。
AT89C52单片机是一种时序逻辑电路,必须有脉冲信号才能正常工作,而时钟脉冲是由振荡电路提供的,时钟可以由内部方式或外部方式产生,内部振荡方式,只要接上两个微调电容和一个晶振即可,其中微调电容选用33pF其作用是稳定振荡频率,快速起振。
本次毕业设计我们采用内部振荡方式,外接晶振为11.0592MHz,振荡周期=1/11.0592μs,时钟周期=2/11.0592μs,机器周期=12/11.0592μs,指令周期=1~4μs。
AT89C52在开机时需复位,以便CPU及其它功能部件都处于确定的初始状态,有利于进行下一步操作。
MCS-51系列单片机的有效复位信号两个机器周期以上的高电平。
其复位的实现通常可以采用开机上电复位和外部手动复位两种方式。
图中采用的是开机上电复位,复位电路由10μF的电解电容和8.2K电阻组成,其时间常数为T=RC,T=10μf×8.2k,T=82ms大于10ms,所以单片机能够有效复位,单片机只要保持82ms以上的高电平就能使单片机有效复位
图3.1单片机最小应用系统
3.2时钟电路DS1302
(1)性能特性
实时时钟可对秒,分,时等进行计数,存在高速数据暂存的31*8位RAM,最少引脚的串行I/O口;2.5~~5.5V电压工作范围;2.5V耗电小于300nA;用于时钟或RAM数据读/写的单字节或多字节数据传送方式;简单的3线接口;可选的慢速充电的能力。
DS1302时钟芯片包括实时时钟和31字节的静态RAM,它经过一个简单的串行接口与微处理器通信,实时时钟提供秒,分,时等信息,时钟运行可以采用24H,或带AM/PM的12H格式,采用三线接口与CPU进行同眇通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302有主电源/后备电源双电源引脚;
(2)工作原理
DS1302在任何数据传送时必须先初始化,把RST引脚置为高电平,然后把8位地址和命令装入移位寄存器,数据在SCLK的上升沿被输入,无论是读周期还是写周期开始8位指定40个寄存器中哪个将被访问到,在开始8个时钟周期,把命令字节装入揿位寄存器之后,另外的时钟周期在闱时操作时输出数据,在写操作时写入数据,时钟脉冲的个数在单位字节下为8加8,在多字节方式下为8加字节数,最大可达248字节数。
为了提高对32个地址的寻址能力,可以把时钟或RAM寄存器规定为多字节方式,在多字节方式中,读或写从地址0的位0开始,必须管按数据传送的次序电先的8个寄存器。
但是当以多个字节写RAM时,为了传送数据不必写所有31字节,不管是否写了全部31字节,所写的每个字节都将传送至RAM。
时钟暂停:
秒寄存器的位7定义位时钟暂停位,当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时,停止振荡,当它为0时时钟将开始启动。
8051通过串口向DS1302写数据的程序框图如图3.2,其中,Px可以是8051单片机的任何一位I/O口,注意因为DS1302的数据发送或接收时序和8051的串行口不完全一致,因此,需要在TXD的输出端加反相器,另外,接收数据时,不能以串行口的接收方式接收,必须将串行口当作普通I/O口进行数据接收.
DS1302的晶振选用32.768KHZ,电容推荐值为6PF,因为振荡频率较低,也可以不接电容,对计时精度影响不大。
Vcc1
Vcc2
DS1302
RST
SCLK
I/OX2
图3.2DS1302写数据的程序框图
3.3显示电路的设计
显示部分采用普通的共阳数码管显示,采用动态扫描,以减少硬件电路,数码管分别为上下午,十时,时,十分,分显示,显示时采用串行口输出控制数码管,其中P2.2~P2.4口控制数码管的位选,低电平数码管显示,动态扫描显示中单片机P0口输出数码管的段码。
3.4键盘接口的设计
图3.4键盘电路
本次设计的控制电路是由4个按键组成的,用以实现时钟信息的调整。
其电路图如图3.4所示,按键与P1口的P1.0到P1.3相连。
由于P1口内有上拉电阻,所以该图中上拉电阻可以省去。
四个按键中,S1为数据+1键,S2为数据-1键,S3为数据选择键,S4为强制打铃或者强制关闭键。
3.5打铃电路的设计
本次设计打铃电路如图3.5所示,单片机通过P3.7控制蜂鸣器是否发出声响。
当时间与预定打铃时间相同时,单片机通过P3.7输出为1KHz的方波,使得蜂鸣器发出声响。
图中PNP三极管作用是电流放大,以保证蜂鸣器能正常发出声音。
图3.5打铃电路
四、系统软件设计
4.1程序流程图
调用控制子程序
主程序流程图
N
定时中断程序流程图
返回
显示程序流程图
4.2主程序设计
voidmain()
{
ucharNowKey;
ucharBeforKey=0xff;
ucharKeyCount=0;
uchari=0;
AlarmSingal=0;
RayFlag=1;
RayFlag2=1;
TMOD=0x10;//设置T1
EA=1;
ET1=1;
TH1=0x3c;
TL1=0xb0;
TR1=1;
while
(1)
{
D_Scan(TimeData,0);//动态扫描
//按键控制
if(KeyCount==2)
{
KeyCount=0;
NowKey=GetKey();
if(NowKey!
=BeforKey)
{
switch(NowKey)
{
case1:
TimeSet();
break;
case2:
AlarmSingal=0;
break;
default:
break;
}
}
BeforKey=NowKey;
}
elseKeyCount++;
}
}
4.3显示子程序的设计
voidD_Scan(uchar*ShowAddress,ucharFlagBit)
{
ucharShowBit;
ucharShow;
for(ShowBit=0;ShowBit<5;ShowBit++)
{
if(FlagBit!
=5)
{
switch(ShowBit)
{
case0:
Show=BCD_to_Text((*ShowAddress)%10);break;
case1:
Show=BCD_to_Text((*ShowAddress)/10);break;
case2:
Show=BCD_to_Text((*(ShowAddress+1))%10);break;
case3:
Show=BCD_to_Text((*(ShowAddress+1))/10);break;
case4:
Show=BCD_to_Text((*(ShowAddress+2))%10);break;
}
}
P2=0xff;
switch(FlagBit)
{
case0:
P0=Show;break;
case1:
//设分闪动
if(RayFlag2&&(ShowBit==0||ShowBit==1))P0=0x40;
elseP0=Show;
break;
case2:
//设时闪动
if(RayFlag2&&(ShowBit==2||ShowBit==3))P0=0x40;
elseP0=Show;
break;
case3:
//设上下午闪动
if(RayFlag2&&ShowBit==4)P0=0x40;
elseP0=Show;
break;
}
P2=GetClockBit(ShowBit);
Delay
(1);
}
}
五、调试及性能分析
5.1调试步骤
进入调试状态后应该在关键的地方设置断点然后按步运行,同时观察参数的变化,通过变化来判断程序运行的过程即可找出程序中混乱的部分,进行改正,这需要对软件熟练的掌握和对语言程序的很好的理解,实验板搭建成功后,我们就进入了程序的设计和调试阶段,开始编写程序时很顺利,但是后来在调试过程中出现了很多的错误,比如定时器准确度的设置,子程序的调用问题,最困难的就是对没步程序执行顺序的分析,由于程序中一些语句的错误理解和执行顺序的判断失误,让我掉进了误区,耽误了很长时间,最后在同学的帮助下终于找到了错误的关键点,更正成功了。
看来对程序的调试能力我还需要加强,程序的调试需要耐心,而且需要熟练掌握软件的跟部分功能。
5.2性能分析
自动打铃系统在学校很工厂和日常生活中应用广泛,原理主要是通过单片机的计数器进行计时,同时通过定时器中断扫描定时时间点来判断是否到了打铃时间,到了打铃,同时可以手动灭铃,主要功能即计时和打铃,相当于闹钟,通过计时器DS1302的使用使电路在断电后依然有后备电源进行计数,设计很人性化。
还可以通过按键来设置时间,如果想深入设计,也可以通过键盘来设置闹钟时间,使系统更加方便。
六、心得体会
本系统被子广泛用企事业单位,设计比较简单。
经过一学期的学习,使我对单片机有了初步的认识,了解了一些软件编程的技巧。
经过这次的课程设计,使我学会了课堂上学不到的知识,颇有一番感受,对于单片机更加的了解了,对各种器件的使用方法更加熟悉,学会了电路的基本设计思路和原理,掌握单片机设计步骤,知道这门课程在工作中的重要性,因为需要大量的资料,所以我和我的合作者到图书馆查阅了大量的资料,也利用了互联网查找大量的资料,经过一番努力,第一周我们完成了电路图的设计,第二周我们领取了所需的元器件,开始了电路的装调,经过几天的努力,终于把电路装好了,但电路调试过程并不是那么的容易,但经过调试我们发现了电路的一些问题,但在老师和同学们的同共努力下都得到解决,最终看到了成果.我感谢老师,课程设计加深了学生对所学课程理论的理解,扩展了教学中的实验内容和要求,积累了实践体验和经验,让我们提前感受到毕业设计的大致过程,进而能顺利进入毕业设计,提高毕业设计质量和学生实际应用能力。
参考文献
〔1〕严仲兴,王熔熔:
《单片机原理与应用》,中国计划出版社,2001.7
〔2〕江力:
《单片机原理与应用技术》,清华大学出版社,2006.5
〔3〕徐爱钧,彭秀华:
《单片机高级语言C51windows环境编程与应用》,北京电子工业出版社,2001.7
〔4〕求是科技:
《单片机典型模块设计实例导航》,北京人民邮电出版社,2004.5
〔5〕康华光:
《电子技术基础:
模拟部分》,北京高等教育出版社,1999.6
〔6〕江太辉:
《MCS-51系列单片机原理与应用》.广州:
华南理工大学出版社,2004.6
(7)刘海宽单片机实验与实践教程东南大学出版社2009年1月出版
(8)杨易德模拟电路重庆大学出版社2006年10月出版
(9)廖先芸电子技术实践与训练高等教育出版社2005年6月出版
(10)郭勇EDA技术基础机械工业出版社2009年1月出版
附录1系统硬件电路图
附录2程序清单
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharTimeData[]={0,0,0};//时钟数据
ucharsec;//秒
uchari;
ucharcounter=0;//时钟变量
ucharRayFlag1=0;//秒闪标志1
sbitRayFlag=P3^3;//秒闪
sbitRayFlag2=P3^2;//秒闪标志2
sbitAlarmSingal=P3^7;//闹铃信号
ucharcodeBellData[]={
0,0,0,0,0,0,0,0,0,1
};//上下午标志
ucharcodeBellDataH[]={
6,7,8,8,9,9,10,10,11,10
};//时
ucharcodeBellDataL[]={
0,30,20,30,20,40,30,40,30,30
};//分
ucharBCD_to_Text(ucharData);
ucharGetClockBit(ucharShowBit);
voidDelay(uintcount);
voidD_Scan(uchar*ShowAddress,ucharFlagBit);
ucharGetKey();
voidTimeSet();
//----------------------主程序-----------------------------------------------
voidmain()
{
ucharNowKey;
ucharBeforKey=0xff;
ucharKeyCount=0;
uchari=0;
AlarmSingal=0;
RayFlag=1;
RayFlag2=1;
TMOD=0x10;//设置T1
EA=1;
ET1=1;
TH1=0x3c;
TL1=0xb0;
TR1=1;
while
(1)
{
D_Scan(TimeData,0);//动态扫描
//按键控制
if(KeyCount==2)
{
KeyCount=0;
NowKey=GetKey();
if(NowKey!
=BeforKey)
{
switch(NowKey)
{
case1:
TimeSet();
break;
case2:
AlarmSingal=0;
break;
default:
break;
}
}
BeforKey=NowKey;
}
elseKeyCount++;
}
}
//---------------------DS1302-------------------------------
#ifndef_DS1302_H_
#define_DS1302_H_
#defineTime_12_Hour0x00//24时制控制
#defineTime_Start0x00//开始走时
#defineTime_Stop0x80//停止走时
#defineDS1302_SECOND0x80//DS1302各寄存器操作命令定义
#defineDS1302_MINUTE0x82
#defineDS1302_HOUR0x84
#defineDS1302_WEEK0x8A
#defineDS1302_DAY0x86
#defineDS1302_MONTH0x88
#defineDS1302_YEAR0x8C
#defineDS1302_WRITE0x8E
#defineDS1302_POWER0x90
#defineBCD2DEC(X)(((X&0x70)>>4)*10+(X&0x0F))//用于将BCD码转成十进制的宏
#defineDEC2BCD(X)((X/10)<<4|(X%10))//用于将十进制转成BCD码的宏
sbitDS1302_CLK=P1^5;//实时时钟时钟线引脚
sbitDS1302_IO=P1^6;//实时时钟数据线引脚
sbitDS1302_RST=P1^4;//实时时钟复位线引脚
sbitACC0=ACC^0;
sbitACC7=ACC^7;
typedefstruct__SYSTEMTIME__//定义的时间类型结构体,全部数为十进制
{
unsignedcharSecond;
unsignedcharMinute;
unsignedcharHour;
unsignedcharWeek;
unsignedcharDay;
unsignedcharMonth;
unsignedcharYear;
}SYSTEMTIME;
//实时时钟写入一字节(内部函数)
voidDS1302InputByte(unsignedchard)
{
unsignedchari;
ACC=d;
for(i=8;i>0;i--)
{
DS1302_IO=ACC0;//相当于汇编中的RRC
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC>>1;
}
}
//实时时钟读取一字节(内部函数)
unsignedcharDS1302OutputByte(void)
{
unsignedchari;
for(i=8;i>0;i--)
{
ACC=ACC>>1;//相当于汇编中的RRC
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(ACC);
}
//写DS1302,ucAddr:
DS1302地址,ucData:
要写的数据
voidWrite1302(unsignedcharucAddr,unsignedcharucDa)
{
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr);//地址,命令
DS1302InputByte(ucDa);//写1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
}
//读取DS1302某地址的数据
unsignedcharRead1302(unsignedcharucAddr)
{
unsignedcharucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr|0x01);//地址,命令
ucData=DS1302OutputByte();//读1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
return(ucData);
}
//读取时间函数
voidDS1302_GetTime(SYSTEMTIME*Time)
{
unsignedcharReadValue;
ReadValue=Read1302(DS1302_SECOND);
Time->Second=BCD2DEC(ReadValue&0x7F);
ReadValue=Read1302(DS1302_MINUTE);
Time->Minute=BCD2DEC(ReadValue);
ReadValue=Read1302(DS1302_HOUR);
T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告 自动 打铃 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)