基于51单片机的自动打铃系统文档格式.docx

上传人:b****4 文档编号:17527093 上传时间:2022-12-07 格式:DOCX 页数:30 大小:313.18KB
下载 相关 举报
基于51单片机的自动打铃系统文档格式.docx_第1页
第1页 / 共30页
基于51单片机的自动打铃系统文档格式.docx_第2页
第2页 / 共30页
基于51单片机的自动打铃系统文档格式.docx_第3页
第3页 / 共30页
基于51单片机的自动打铃系统文档格式.docx_第4页
第4页 / 共30页
基于51单片机的自动打铃系统文档格式.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

基于51单片机的自动打铃系统文档格式.docx

《基于51单片机的自动打铃系统文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的自动打铃系统文档格式.docx(30页珍藏版)》请在冰豆网上搜索。

基于51单片机的自动打铃系统文档格式.docx

4.2主程序设计 

10

4.3显示子程序的设计 

12

五、调试及性能分析 

5.1调试步骤 

13

5.2性能分析 

六、心得体会 

参考文献 

附录1系统硬件电路图 

15

附录2 

程序清单 

16

一、设计任务和性能指标

1.1设计任务

用单片机器件为主体,设计一台自动打铃系统。

(一)基本要求

1、基本计时和显示功能(用12小时制显示)。

包括上下午标志,时、分的数字显示,秒信号指示。

2、能设置当前时间(含上、下午,时,分)。

3、能实现基本打铃功能,规定:

上午6:

00起床铃:

打铃5秒、停2秒、再打铃5秒。

下午10:

30熄灯铃:

铃声可用小喇叭播放,凡是用到铃声功能的均按此处理。

(二)发挥部分

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,因为振荡频率较低,也可以不接电容,对计时精度影响不大。

图3.2 

DS1302写数据的程序框图

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程序流程图

主程序流程图

定时中断程序流程图

显示程序流程图

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:

default:

}

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);

Show=BCD_to_Text((*ShowAddress)/10);

Show=BCD_to_Text((*(ShowAddress+1))%10);

case3:

Show=BCD_to_Text((*(ShowAddress+1))/10);

case4:

Show=BCD_to_Text((*(ShowAddress+2))%10);

P2=0xff;

switch(FlagBit)

P0=Show;

//设分闪动

if(RayFlag2&

&

(ShowBit==0||ShowBit==1))P0=0x40;

elseP0=Show;

//设时闪动

(ShowBit==2||ShowBit==3))P0=0x40;

//设上下午闪动

ShowBit==4)P0=0x40;

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<

reg52.h>

#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();

//----------------------主程序-----------------------------------------------

//---------------------DS1302-------------------------------

#ifndef_DS1302_H_

#define_DS1302_H_

#defineTime_12_Hour 

0x00 

//24时制控制 

#defineTime_Start 

//开始走时

#defineTime_Stop 

0x80 

//停止走时

#defineDS1302_SECOND 

//DS1302各寄存器操作命令定义

#defineDS1302_MINUTE 

0x82

#defineDS1302_HOUR 

0x84

#defineDS1302_WEEK 

0x8A

#defineDS1302_DAY 

0x86

#defineDS1302_MONTH 

0x88

#defineDS1302_YEAR 

0x8C

#defineDS1302_WRITE 

0x8E

#defineDS1302_POWER 

0x90

#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)

1;

ACC7=DS1302_IO;

return(ACC);

//写DS1302,ucAddr:

DS1302地址,ucData:

要写的数据

voidWrite1302(unsignedcharucAddr,unsignedcharucDa)

DS1302_RST=0;

DS1302_RST=1;

DS1302InputByte(ucAddr);

//地址,命令

DS1302InputByte(ucDa);

//写1Byte数据

//读取DS1302某地址的数据

unsignedcharRead1302(unsignedcharucAddr)

unsignedcharucData;

DS1302InputByte(ucAddr|0x01);

ucData=DS1302OutputByte();

//读1Byte数据

return(ucData);

//读取时间函数

voidDS1302_GetTime(SYSTEMTIME*Time)

unsignedcharReadValue;

ReadValue=Read1302(DS1302_SECOND);

Time->

Second=BCD2DEC(ReadV

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1