找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18112|回复: 10
收起左侧

基于单片机的校园打铃系统设计论文

  [复制链接]
ID:208235 发表于 2017-6-5 23:34 | 显示全部楼层 |阅读模式

信息职业技术学院

毕业设计说明书(论文)

设计题目:基于单片机的校园打铃系统设计


专    业:应用电子技术

班    级:应电08-2              

学    号:

姓    名:

指导教师:


信息职业技术学院毕业设计(论文)任务书
学 生
姓 名

学号

班级
应电08-2
专业
应用电子技术
设计(或论文)题目
基于单片机的校园打铃系统设计
指导教师姓名
职  称
工作单位及所从事专业
联系方式
备 注

工程师
01

设计(论文)内容:利用单片机做为主控器件,设计一校园打铃系统的硬件部分:
1.实现打铃时间的设置和修改;
2.显示当前日期、时间;
3.掉电情况下计时工作正常进行、能保存以前设置的时刻。
基本要求:
1.正确选择元器件完成相应功能;  
2.设计整机电路、明晰系统工作原理;
3.系统仿真;                     
4.完成说明书撰写。
进度安排:
第3~6周:选题及查找相关资料主要查找与课题相关的资料;
第7周:相关资料的整理并对其进行理解;
第8周:对毕业论文的资料进行初步的整理;
第9周:期中检查;                                
第10周:对论文进行修改及进行仿真实验;
第11周:对毕业论文进行排版;                  
第12周:检查排版及内容;
第13周:加深对毕业论文的理解准备答辩;  
第14周:检查毕业设计论文的地方准备答辩;        
第15周:答辩。
主要参考文献、资料(写清楚参考文献名称、作者、出版单位):
[1]苏平.单片机原理与接口技术.北京:电子工业出版社,2003
[2]林伸茂.8051单片机彻底研究实习篇.北京:人民邮电出版社,2005
[3]韩志军.单片机应用系统设计.北京:机械工业出版社,2005
[4]陈坤.电子设计技术.成都:电子科技大学出版社,1997
[5]郑应光.模拟电子线路(一).南京:东南大学出版社,2005
[6]李秀忠.单片机应用技术.北京:人民邮电出版社,2007
教研室负责人:
年   月   日











备注:任务书由指导教师填写,一式二份。其中学生一份,指导教师一份。


目  录

摘 要.................................................................... 1

第1章 绪论.............................................................. 2

第2章 方案设计与论证.................................................... 3

2.1 系统方案选择与比较.................................................. 3

2.1.1 控制模块方案选择................................................ 3

2.1.2 显示模块方案选择................................................ 4

2.2.3 存储模块方案选择................................................ 4

2.2 总体方案设计思想.................................................... 5

第3章 硬件电路设计...................................................... 6

3.1 控制模块设计........................................................ 6

3.1.1 单片机AT89C51简介.............................................. 6

3.1.2 单片机时钟电路复位电路介绍...................................... 7

3.2 打铃模块............................................................ 8

3.3 存储模块............................................................ 8

3.3.1 实时时钟DS1302简介............................................. 8

3.3.2 存储器24C02C................................................... 10

3.4 键控模块........................................................... 12

3.4.1 独立式键盘介绍................................................. 12

3.4.2 键盘接口及键位的功能介绍....................................... 13

3.5 显示模块........................................................... 13

3.5.1 数码管的组成及工作原理......................................... 14

3.5.2 数码管的显示................................................... 14

第4章 整机原理......................................................... 16

4.1 整机原理图......................................................... 16

4.2 整机电路原理....................................................... 16

第5章 软件设计......................................................... 18

5.1 打铃系统流程图..................................................... 18

5.2 读时间日期显示流程图............................................... 18

5.3 LED显示流程图..................................................... 19

5.4 主程序流程图....................................................... 20

第6章 仿真和调试....................................................... 21

6.1 调试软件的介绍..................................................... 21

6.2 调试的操作步骤..................................................... 21

6.3 仿真软件对于本设计的仿真........................................... 22

结 论................................................................... 25

参考文献................................................................. 26

附录1  整机原理图....................................................... 27

附录2 元件明细表....................................................... 28

附录3  源程序........................................................... 29



摘 要

本设计以单片机AT89C51为控制核心,与DS1302、24C02C和LED等组成校园打铃系统,运用实时时钟芯片DS1302实现时间控制,同时运用LED七段数码管完成当前的年、月、日、时、分、秒和星期以及打铃时间的显示,再利用键盘可以对系统当前时间以及打铃时间进行调节、存储、清空操作,并且使用外部存储器24C02C完成打铃时间的存储。此设计在系统掉电状态下仍可以正常的打铃、时间设定、数据保持,整体性好、人性化强、可靠性高、功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点。

关键词 单片机;AT89C51;DS1302;24C02C打铃



第1章 绪论

校园打铃系统就是利用现代计算机、通讯等技术,以传统的铃声系统为基础,根据用户对铃声系统功能的要求,由单片机来控制、管理、播放的系统。

通过把播放的内容以数字形式存放在存储器中,然后单片机通过控制软件,按照学校设定的播放时间和内容控制单片机自动将存储器中的数字音乐文件播放出来。铃声控制系统整体由两部分组成:主控中心和终端电铃。主控中心以单片机为核心,包括控制电路、显示电路、键盘电路和存储电路。终端电铃为响应控制设备,通过其自身的控制系统可以获得清晰、响亮的声响。

单片机在电子产品中的应用已经越来越广泛,并且在很多电子产品中也将其用到校园铃声和广播控制。单片机又称单片微控制器,是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。 现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词—“智能型”,如智能型洗衣机等。

本次设计是实现一个单片机的校园打铃系统,能过设置打铃时间,同时要求能够在系统掉电时,时间能够继续,数据能够保持,能够实现打铃。



第2章 方案设计与论证2.1 系统方案选择与比较2.1.1 控制模块方案选择

校园打铃系统设计方案有多种,下面提出两种电路方案。

方案一:主要是由石英晶体振荡电路和分频器电路组成的脉冲发生器、校时电路、报时电路以及时、分、秒计数器和译码显示电路等电路组成,其中采用计数器74LS290、译码器74LS49、分频器和八段数码管显示器等器件组成的校园打铃系统,整个系统有控制简单,调试容易等优点,但是其显示功能单一、电路复杂。其组成方框图如下2-1所示:

image001.gif

图2-1 方案一组成方框图

方案二:采用ATC公司的单片机ATC89C51作为控制器。单片机运算能力强,软件编程灵活,自由度大。它是MCS-51系列单片机的派生产品,在指令系统、硬件结构和片内资源上与标准8051单片机完全兼容,使用时容易掌握;采用ATC89S52单片机稳定可靠、应用广泛、通用性强。

image002.gif

图2-2 方案二组成方框图

方案选择:采用方案一实现的校园打铃控制系统调试容易,价格相对较为便宜,但是电路结构复杂,控制单一,且整个系统性能不是很高,倒计时不是非常精确,功能不完整,如果要求系统调节打铃时间时不容易调整。采用方案二实现的校园打铃系统其电路结构简单,可实现多功能控制,计时精确,全自动化实现其所用功能,并且能在断电的情况下任能正常的实现打铃。因而对于完成此题目,方案二完全能实现设计要求,并且容易掌握,此方案是利用编程来实现,易于调整时间,且I/O接口很多,易于扩展外围电路,故选择方案二。

2.1.2 显示模块方案选择

该系统要求完成当下年、月、日、时、分、秒、星期的显示等功能。基于上述原因,考虑了三种方案。

方案一:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。

方案二:用七段LED数码管完成年、月、日、时、分、秒、星期显示,这种方案只能显示数字、英文字符及一些简单的数学符号,但价格相对便宜。

方案比较:相对比较而言,方案二比方案一更符合此设计要求,方案一采用点阵式LED显示的方法,而设计只要求年、月、日、时、分、秒、星期的显示输出。因此这种方案既软件工作量大,又价格相对较贵,因此权衡利弊,选择方案二。

2.2.3 存储模块方案选择

存储器是整个系统的“连接线”,它是系统稳定工作的保障,为使各个模块稳定工作,须有可靠存储器。下面考虑了两种电源方案。

方案一:采用单片机存储器。该方案的优点是存储方便,节约成本;缺点是断电后存储数据消失。

方案二:采用存储器24C02C。该方案保证设置的打铃时间数据在掉电时也不会丢失,同时实现在系统运行时能够修改打铃时间,采用开关电源作为整个系统的供电,它具有多路电源输出,缺点是价格较贵。

方案比较:方案一只采用单片机自身的存储是不行的,而方案二虽然要给另外购买,但却能在断电的情况下仍能存储数据并且继续计数。故选择第二种方案。

2.2 总体方案设计思想

根据校园打铃系统的设计,可将本系统分为四个模块,第一个模块是控制模块,主要负责整个系统工作的控制和运算,从而使各模块正常工作;第二个模块为显示模块,主要是对现时刻内年、月、日、时、分、秒和星期的直观显示;第三个模块是键控模块,它的主要作用是辅助控制模块,相当于输入装置,利用它可以对打铃时间进行调节;第四个模块是存储模块,它是整个系统的连接线,负责给各模块提供合适的信息,让各模块能稳定工作。其系统设计结构如图2-3所示。


图2-3 系统设计结构图



第3章 硬件电路设计3.1 控制模块设计

AT89C51在此设计中起到非常重要的作用,它就像一个人的大脑,控制着整个设计的所有系统。此设计的控制模块由单片机、复位电路、时钟电路组成的。

3.1.1 单片机AT89C51简介

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPER-OM-Flash Programmable and Erasable Read Only Memory)的低电压。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种商效微控制器,AT89C51是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

image004.gif

图3-1 AT89C51引脚图

AT89C51单片机引脚分布如图3-1所示。

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口作为第八位地址接收。

P3.0(RXD):串行输入口

P3.1(TXD):串行输出口

3.1.2 单片机时钟电路复位电路介绍

1.时钟电路模块

单片机的时钟信号用来为单片机芯片内部的各种操作提供时间基准。

时钟电路为单片机产生时钟脉冲序列,作为单片机工作的时间基准,典型的晶体管振荡频率为12MHz。

AT89C51单片机内有时钟振荡电路,只要在单片机的XTAL1和XTAL2引脚外接石英晶体和微调电容,就构成了自激振荡器并在单片机内部产生时钟脉冲信号,具体电路设计如图3-2所示。图中电容C1和C2的作用是稳定频率和快速起振,其值为5~30pF,在此选择30pF;晶振X1的振荡频率范围在1.2~12MHz之间选择。

image006.gif image007.gif

图3-2 单片机时钟、复位电路

2.复位电路模块

复位电路使单片机或系统中的其他部件处于某种确定的状态。

当在单片机的RST引脚处引入高电平并保持2个机器周期,单片机内部就执行复位操作。实际应用中,复位操作有两种基本形式:一种是上电复位,另一种是按键复位。在单片机运行期间,可以利用此按键完成复位操作。具体电路设计如上图3-2所示。

3.2 打铃模块

电铃工作在交流电220V下,单片机工作电压为直流电+5V,所以单片机引脚不能直接控制电铃工作,因此我们使用单片机控制电铃工作电路的通断。由于单片机驱动能力有限,因而需要硬件将单片机输出的高、低电平变成控制电铃通断的电路,能够具体实现该功能的电路有多种。常见的方式是采用将单片机输出信号放大后驱动继电器,用继电器的触头控制电铃电路的接通和断开,如图3-3所示。

三极管在电路当中起开关作用,管型为PNP型。单片机的P1.7通过三极管驱动继电器,当P1.7脚输出高电平时,给三极管基极送入高电压。此时,三极管呈截止状态,继电器不吸合电铃停止打铃;当P1.7脚输出低电平时,给三极管基极送入的是低电压。此时,三极管呈导通状态,促使继电器吸合,电铃打铃。

继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。当输入量达到规定值时,使被控制的输出电路导通或断开的电器。继电器线圈在断电时会产生一个很大的反感生电动势,这个电压会损失继电器或者电路中的元件,在继电器线圈上反向并联一个二极管,可将产生的反感生电动势通过二极管回路释放掉、保护继电器线圈和电路中的电子元件不受高压损坏。

image008.jpg

图3-3 声音控制电路图

3.3 存储模块3.3.1 实时时钟DS1302简介

    它可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

1.引脚功能及结构

image009.gif

图3-4 DS1302引脚图

如图3-4所示,DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过RST输入高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),SCLK始终是输入端。

2.实时时钟DS1302的控制字节

DS1302的控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

3.数据输入输出(I/O)

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

4.实时时钟DS1302的寄存器

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字。

此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

5.引脚连接图

image010.gif

图3-5 DS1302引脚连接图

在学校正常上课中,不可能保证学校随时都有电,为了不影响学校的正常运转,同学们能够正常的上、下课。所以就采用能在学校停电时借助电池也能工作的芯片,而DS1302能够在学校掉电时,Vcc2无法给实时时钟DS1302供电,只有通过干电池B1给实时时钟DS1302的Vcc1提供电量让DS1302继续工作,系统能够继续计时。而这时的其它电路停止工作,但存储器中的打铃时间不会因为没有电而丢失。其与单片机连接方式如上图3-5所示。

3.3.2 存储器24C02C

要保证设置的打铃时间数据在掉电时也不会丢失,同时实现在系统运行时能够修改打铃时间,在本系统中采用I2C总线的串行存储器24C02C存储打铃数据。

1.存储器24C02C的引脚介绍

考虑到串口线、稳定性等方面,本系统采用串行数据传输存储器。其容量计算如下:若以打铃次数较多的校园为例,每天按12节课计算,每节课打铃2次,再加上起床和熄灯的次数,打铃大约在20次左右。这样每个信息单元占8个字节,存储时均按照非压缩型BCD码存储,则需要存储空间大约在160个字节左右,选用256字节的存储器就能够满足容量的要求,可以采用ATMEL公司的24C02C。根据硬件电路的设计可得24C02C的I2C硬件地址为:0A2H/0A3H。

(1)行数据(SDA)引脚

串行数据引脚为双向引脚,用于把地址和数据输入/输出期间。该引脚为漏极开路。因此,SDA总线要求在该引脚与VCC之间接入上拉电阻(通常频率为100KHz时该电阻阻值为10K,频率为400KHz和1MHz时,阻值为2K)。

对于正常的数据传输,只允许在SCL为低电平期间改变SDA电平。而SDA电平在SCL高电平期间若发生变化,表明起始和停止条件产生。

(2)写保护(WP)引脚

该引脚必须连接到VSS或者VCC。如果连接到VSS,写操作使能。如果连接到VCC,写操作被禁止,但读操作不受影响

2.引脚连接方法

引脚采用I2C总线连接方法,这种方法能够节约I/O输出端口。它主要的特点有:

(1)总线只有两根线,即串行时钟线和串行数据线,这在设计中大大简化了硬件接口;

(2)每个连接到总线上的器件地址同时由芯片内部硬件电路和外部地址引脚决定,避免了片选线的线连接方法,并建立简单的主从关系,主器件既可以作为发送器,又可作为接收器;

(3)它是一个真正的多主总线,带有竞争监测和仲裁电路,多个主机可以任意发送而不破坏总线上的数据;

(4)同步时钟可以作为停止或重新启动串行口发送的握手方式;

(5)连接到同一总线的集成电路数量只受400pF最大总线电容的限制。

学校设定的系统时间和打铃时间存储在24C02C中。24C02C的三个地址端口A0、A1、A2都接地,因而其存储地址为A000H-A6FFH,共1KB的存储空间。其中,WP是24C02C的写保护控制引脚,WP为低电平时,串行存储器可以正常地读/写;WP为高电平时,对串行存储器内部的数据进行写保护。在系统掉电时不会丢失其中的内容,保证了设置的打铃时间不会因系统掉电而需要重新设置。如图3-6所示。

image011.jpg

图3-6 24C02C引脚连接图

3.4 键控模块

键盘是一组按键的组合,它是各种仪表中最常用的输入设备。操作人员可通过键盘输入数据或命令,实现简单的人机对话。在单片机应用系统中,有的是单个按键,有的是矩阵式的按键,即行列式按键。按键是一种常开型按钮开关,常态时按键的两个触点处于断开状态,按下键时它们才闭合。根据本设计本的要求,我们选用独立式键盘实现整个功能。

3.4.1 独立式键盘介绍

image012.gif

图3-7 独立式按键结构

独立式键盘的按键相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他按键的工作状态。这种按键软件程序简单,但占用I/O口线较多(一根口线只能接一个键),适用于键盘应用数量较少的系统中。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。独立式按键结构图如图3-7所示。

3.4.2 键盘接口及键位的功能介绍

按键功能介绍:

模式按键:它的主要功能就是选择时钟芯片里的年、月、日、时、分、秒,当按下模式这个键时,它从年到月依次往后的选中,这时按调节按钮就能从当前的时间往上调。

调节按键:它的主要功能就是想改变当前的系统时间首先要按模式键,选中要修改的时间,再按调节键就能控制当前系统时间递增。

存入按键:它的主要功能就是把系统不正确的时间修改后按下存入键,系统的时间就为按下那瞬间的时间。

清空按键:它的主要功能就是当学校要重新输入打铃时间的时候,就先按下清空键,再输入新的时间。

通过上述每个按键的功能介绍,实现对打铃系统的打铃时间设置。与单片机具体链接图,如图3-8所示。

image013.jpg

图3-8 键盘的接口连接
3.5 显示模块

在本系统中因为要显示年、月、日、星期、时、分、秒,如果用发光二极管不能具体的显示出来,所以采用了七段数码显示管来作为显示元件。

3.5.1 数码管的组成及工作原理

数码管由8个发光二极管构成,可以用来显示数字、字符等它在家电及工业控制中有着很广泛的应用。数码管实际上是由7个发光管组成“8”字形构成的,加上小数点就是8个。这些段分别由字母a、b、c、d、e、f、g、dp来表示。数码管的引脚结构如图3-9 所示,其中COM引脚为公共端,用来控制数码管显示的打开或关闭,既起到“使能”作用。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样。

根据公共端接法方式的不同,数码管又分为共阴极和共阳极两种结构的二极管,分别如下:

共阳极就是将8个LED的阳极连接到一起组成公共端COM,接到正极,当相应字段为低电平“0”时,可以点亮该字段;但相应字段为高电平“1”时,该字段不亮。

共阴极就是将8个LED的阴极连接到一起组成公共端COM,接负极,当相应字段为高电平“1”时,可以点亮该字段;当相应字段为低电平“0”时,该字段不亮。

image014.gif

图3-9 LED数码管引脚

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。

3.5.2 数码管的显示

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。

image015.gif

图3-10 数码管动态显示电路

动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划“a、b、c、d、e、f、g、dp”的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。数码管动态显示连接,如图3-10所示。



第4章 整机原理4.1 整机原理图

image016.gif image019.jpg

图4-1 整机原理图

4.2 整机电路原理

电路中采用I2C总线的串行存储器24C02C,在系统掉电时不会丢失其中的内容,保证了设置的打铃时间不会因系统掉电而需要重新设置。24C02C的三个地址端口A0、A1、A2都接地,因而其存储地址为A000H-A6FFH,共1KB的存储空间。其中,WP是24C02C的写保护控制引脚,WP为低电平时,串行存储器可以正常地读/写;WP为高电平时,对串行存储器内部的数据进行写保护。

实时时钟芯片DS1302采用3V的电池作为后备电源,使DS1302内部的时钟不会因为系统掉电而停止。在系统正常供电时,DS1302通过内部的涓流充电电阻给后备电池充电,能保证系统电池的长时间工作。

掉电情况下:由BAT1干电池通过DS1302的引脚VCC1供电,系统时间不会因为没有电而停止工作,显示电路、键盘电路、存储电路、声音控制电路因为AT89C51没有电,所以停止工作。来电时,数码管上显示的系统时间不会是停电时刻的时间,系统继续工作。

正常情况下:按键按钮通过AT89C51的P1.3、P1.4、P1.5、P1.6脚进行调节、存入、清空系统当前时间和打铃时间和模式选择。当前系统时间在数码管上显示系统时间和打铃时间,学校设置的打铃时间存储在外部存储器24C02C中。DS1302时钟芯片为单片机提供实时时间并与24C02C中的打铃时间进行比较来控制AT89C51的P1.7脚输出高、低电平。如果当前系统与打铃时间不一致,AT89C51中的P1.7脚就输出高电平,三极管Q1截止,继电器断开,电铃电路不导通。如果当前系统时间与打铃时间一致,AT89C51中的P1.7脚就输出低电平,三极管Q1导通,继电器闭合,电铃电路导通打铃。


第5章 软件设计

本系统中软件部分应承担日期时间显示、按键扫描、系统状态设置、打铃时间判断等功能。

5.1 打铃系统流程图

打铃系统程序打铃是是调用存储器中存储的打铃时间,把闹铃值与计时值的时、分单元比较,看是否相等,如果不相等就不打铃,如果相等就启动闹铃,闹铃延时时间为12秒。程序流程图如图5-1所示。


图5-1 打铃系统流程图(附件中刚有图片)

5.2 读时间日期显示流程图

读时间日期显示程序是先对时间日期进行初始化,再对是显示年月日还是显示时分秒进行判断,并利用总线加以显示。程序流程图如图5-2所示。


图5-2 读时间日期显示流程图

5.3 LED显示流程图

显示子程序采用动态扫描法实现三位数码管的数值显示。测量数据在显示时需转换成10进制BCD码放在24C02C存储器中,再转换成十进制进过总线输出,经由单片机控制LED显示。程序流程图如图5-3所示。




image021.gif

图5-3 LED显示的流程图

5.4 主程序流程图

主程序比较简单,初始化完成后,调用按键扫描程序,取得键值,并根据当前系统状态调用相应的子程序。这里有五个基本的子程序供调用,分别对应系统的各种功能状态。分别是打铃时间设置子程序、当前时间显示子程序、键盘模块子程序、打铃校准子程序等。程序流程图如图5-4所示。


图5-4 控制模块的流程图


第6章 仿真和调试

下面用keil与porteus仿真软件实现校园打铃的仿真与调试。

6.1 调试软件的介绍

Keil软件是目前最流行开发MCS-51系列单片机的软件,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。

Keil C51 µVision2集成开发环境是Keil Software,Inc/Keil Elektronik GmbH开发的基于80C51内核的微处理器软件开发平台,内嵌多种符合当前工业标准的开发工具,可以完成从工程建立到管理、编译、链接、目标代码的生成、软件仿真、硬件仿真等完整的开发流程尤其是C编译工具在产生代码的准确性和效率方面达到了较高的水平,而且可以附加灵活的控制选项,在开发大型项目时非常理想。

Proteus是目前最好的模拟单片机外围器件的工具,它不仅能仿真单片机CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。可以仿真51系列、AVR,PIC等常用的MCU及其外围电路(如LCD,RAM,ROM,键盘,马达,LED,AD/DA,部分SPI器件,部分IIC器件)。

6.2 调试的操作步骤

1.在uVision集成开发环境中创建新项目(Project),扩展文件名为UV2,并为该项目选定合适的单片机CPU器件。

2.用uVision的文本编辑器编写源文件,可以是汇编文件(.ASM),也可以使C语言文件(扩展名.C),并将该文件添加到项目中去。一个项目文件可以包含多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件。

3.通过uVision2的相关选择项,配置编译环境、连接定位器以及Debug调试器的功能。

4.对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文件,如果出现编译连接错误则返回到第2步,修改源文件中的错误后重构整个项目。

5.对没有语法错误的程序进行仿真调试,调试成功后将HEX文件写入到单片机应用系统的ROM中。

6.下一步就可以在Proteus软件中将HEX文件烧入单片机。

6.3 仿真软件对于本设计的仿真

通过以上步骤,来实现校园打铃系统设计的仿真:

状态1:LED数码管对年、月、日显示的仿真效果如图6-1所示。

image022.gif

图6-1 当前年、月、日的显示

状态2:LED数码管对时、分、秒和星期显示的仿真效果如图6-2所示。

image023.gif

图6-2 当前年、月、日的显示

Proteus的ISIS是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。

表6-1 器件库及所选器件

器件库
器件名称
Microprocessor ICs
89C51
Memory ICs
24C02C
Switches&Relays
BUTTON
Memory ICs
DS1302
Optoelectronics
7SEG-MPX8-CA
Optoelectronics
LAMP
Resistors
MINRES200R
Diodes
1N4148
Transistors
2N2905
Switches&Relays
RELAY
Miscellaneous
BATTERY
Terminals Mode
POWER

操作步骤如下:

1.进入proteusISIS集成环境,在工作前,在systerm菜单下设置界面的颜色、图形界面大小等项目,我采用了系统默认值。

2.通过工具栏中的P(从库中选择元件命令)命令,在pickdevices窗口中选择电路所需的元件,放置元件到编辑区并调整其相对位置,进行元件参数设置,元器件间连线。器件库如表6-1所示。



结 论

本次是通过51单片机实现校园打铃系统的设计,设计的目的是能过通过按键系统的功能对打铃时间的更改、存储、清除等操作,能通过数码管显示低昂前系统的时间,并显示具体的打铃时间。单片机的存储容量小,所以采用了I2C总线的串行存储器24C02C,并通过始终芯片DS1302进行时钟控制,最后经过三极管的开关性能控制继电器进而控制铃声。

通过本次设计,巩固了单片机原理及应用这门课的所学的知识与技能,更加了解单片机的功能及应用,最开始拿到这个课题的时候,脑袋里只是白茫茫的一片,说不懂吧,好像又有点懂,说全懂吧,好像又有些不懂。其实这次设计说难也不是很难,但也不会简单哪里去。只是要把以前学的东西融合起来变成自己需要的东西。这次毕业设计我认为不仅仅是一次简单的设计,同时也教会我们学以致用的道理,很多知识我们学过却没有应用到实践中,很可能就荒废了,但通过这次设计让我加深知识的理解,真正将知识与实践结合,达到了理论的升华,同时也是一次熟悉知识、改正错误、提升自己的机会。

这次毕业设计提高了我的查阅资料的能力,同时也使我的能力也得到了提升,提高是有限的但提高也是全面的,正是这一次设计让我积累了无数实践经验,使我的头脑更好的被知识武装了起来。同时我也学会了仅凭个人的知识是有限的,需要多思多问。这也是学习需要的效果。也必然会让我在未来的工作学习中表现出更高的应变能力、更强的沟通力和理解力。

这次设计是我第一次用单片机运用到实际生活当中,所以在很多地方都有不足之处。希望各位老师给我更多的建议,以便我在将来的设计中做的更好,诚心希望老师的指点。



参考文献

[1] 苏平主编.单片机原理与接口技术.北京:电子工业出版社,2003

[2] 林伸茂主编.8051单片机彻底研究实习篇.北京:人民邮电出版社,2005

[3] 韩志军主编.单片机应用系统设计.北京:机械工业出版社,2005

[4] 陈坤.电子设计技术.成都:电子科技大学出版社,1997

[5] 李秀忠主编.单片机应用技术.北京:人民邮电出版社,2007

[6] 肖洪兵主编.跟我学单片机.北京:北京航空航天大学出版社,2002

[7] 张国锋主编.单片机原理及应用.北京:机械工业出版社,2009

[8] 张旭涛.单片机原理及应用.北京:北京理工大学出版社,2007

[9] 张伟.单片机原理及应用.北京:机械工业出版社,2005



附录1  整机原理图
image024.gif

附录2 元件明细表


项目
代号
名称、型号、规格
数量
备注
更改

AT89C51
单片机芯片
1


12MHz
晶振
1


7SEG
LED显示器
1


LS1
扬声器
1


200
电阻
9


30pF
瓷片电容
2


10pF
电解电容
1


3V
电池
1


24C02C
外部存储器
1


DS1302
时钟芯片
1


2N2905
三极管
1


1N4148
二极管
1


220V
继电器
1


220V
灯泡
1


BUTTON
按键
4



旧底图






















更改标记
数量
更改单号
签名








底图号
拟制

基于
单片
机的
校园
打铃
系统
设计


审校

日期





等级标记
第1张
共1张
签名
标准化




梁雪英
批准
























附录3  源程序


  1. #include "REGX51.H"
  2. #include "DS1302.H"
  3. #include "M24XX.H"
  4. #define uchar unsigned char
  5. #define LED_abc P0
  6. #define LED_123 P2
  7. sbit key_mode=P1^3;
  8. sbit key_change=P1^4;
  9. sbit key_Wr_2402=P1^5;
  10. sbit key_clr_2402=P1^6;
  11. sbit L_OUT=P1^7;                     
  12. //数码管显示:       0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F  
  13. uchar code dis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
  14. //                0.   1.   2.   3.   4.   5.   6.   7.   8.   9.   A.   B.   C.   D.   E.   F.                  0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e,
  15. //                 Y    L    J    黑  全亮    点    -
  16.                   0x91,0xc7,0xe1,0xFF,0x00,  0x7f, 0xbf};
  17. uchar disp_buf[8];     //显示缓冲区
  18. uchar time[7];        //时间缓冲区
  19. //延时子程序
  20. void delay(unsigned int a)
  21. {
  22.   while(--a);
  23. }
  24. //显示子程序
  25. void display()
  26. {  uchar i;     uchar ik;                           //赋初值
  27. ik=0x01;                                         //初始化为1
  28.     for(i=0;i<8;i++)
  29.     {
  30.         LED_abc=dis[disp_buf[i]];                    //显示数码管数字
  31.         LED_123=ik;   delay(100);                  //选择数码管位数  延时
  32.         LED_123=0x00;                            //赋值为0
  33. ik<<=1;                                         //右移一位
  34.     }  
  35. }                                 
  36. uchar BCD_INC(uchar a)                            //BCD加1,不判断进位
  37. {
  38.     uchar temp;
  39.     temp=(a>>4)*10+(a&0x0F)+1;                    //变成16进制并加1
  40.     temp=temp/10*0x10+temp%10;                   //转回BCD码
  41.     return temp;                                    //退出
  42. }
  43. bit yh;                                  //显示标志,0=时分钞星期,1=年月日
  44. uchar mode_N=0;   //工作模式,0=常态,1=校分,2=校时,3=星期,4=校日,5=校月,6=校年
  45. void TimeToDisplay()                     //读时间日期送显示缓
  46. {
  47.     time[0]=Read_DS1302(year);          //年year
  48.     time[1]=Read_DS1302(month);         //月month
  49.     time[2]=Read_DS1302(date);          //日date
  50.     time[3]=Read_DS1302(week);          //星期week
  51.     time[4]=Read_DS1302(hour);          //时hour
  52.     time[5]=Read_DS1302(minute);            //分minute
  53.     time[6]=Read_DS1302(second);        //秒second
  54.     if(yh || mode_N>3)
  55.     {
  56.         disp_buf[0]=0x02;                    //显示年月日
  57.         disp_buf[1]=0x00;
  58.         disp_buf[2]=time[0]/0x10;
  59.         disp_buf[3]=time[0]%0x10|0x10;
  60.         disp_buf[4]=time[1]/0x10;
  61.         disp_buf[5]=time[1]%0x10|0x10;
  62.         disp_buf[6]=time[2]/0x10;
  63.         disp_buf[7]=time[2]%0x10;      
  64.     }
  65.     else
  66.     {
  67.         disp_buf[0]=time[4]/0x10;               //显示时分钞星期
  68.         disp_buf[1]=time[4]%0x10|0x10;
  69.         disp_buf[2]=time[5]/0x10;
  70.         disp_buf[3]=time[5]%0x10|0x10;
  71.         disp_buf[4]=time[6]/0x10;
  72.         disp_buf[5]=time[6]%0x10;
  73.         disp_buf[6]=0x23;
  74.         disp_buf[7]=(time[3]-1)%0x10;
  75.     }
  76. }
  77. //分析是否打铃
  78. bit Dll_OK()
  79. {
  80.     uchar i,j,k[2];
  81.     RW24XX(&i,1,0,0xa1, M2402);              //读指针
  82.     for(j=1;j<i;j+=2)
  83.     {
  84.         RW24XX(k,2,j,0xa1, M2402);
  85.         if(time[4]==k[0]&&time[5]==k[1]) return 1;
  86.     }      
  87.     return 0;
  88. }
  89. //主函数
  90. void main(void)
  91. { uchar temp,count20=0,count100=0,Qtime=0;  //工作模式:0=正常时钟;1=校分;2=校时
  92.    bit Dll_Symbolize=0;                      //打铃标志
  93. //写保护Write_eabled:0x00可写,0x80保护;充电Trickle(如:0xa5);年year;月month;日date;星期week;时hour;分minute;秒second
  94.    if(Read_DS1302(second)>0x60)             //如果秒大于60,执行初始化
  95.    {  Write_DS1302(Write_eabled,0);          //0
  96.        Write_DS1302(Trickle,0xA5);           //年显示20
  97.        Write_DS1302(year,0x10);             //年显示10
  98.        Write_DS1302(month,0x010);           //月10
  99.        Write_DS1302(date,0x20);             //日20
  100.        Write_DS1302(week,4);                //星期4
  101.        Write_DS1302(hour,0x12);             //时12
  102.        Write_DS1302(minute,0);              //分0
  103.        Write_DS1302(second,0);              //秒0
  104.        Write_DS1302(Write_eabled,0x80);      //8
  105. }
  106.    while(1)
  107.    {                                      //模式键-
  108.       if(!key_mode)                           // 键是否按下
  109.       { delay(100);                            //延时1ms
  110.         if(!key_mode)                          //键是否按下
  111.         { mode_N++;                          //按键次数加
  112.           if(mode_N==7) mode_N=0;             //按键次数等于7次数清零
  113.           while(!key_mode) display();             //键是否按下   延时
  114.         }
  115. }                              
  116.       if(!key_change)                           //调整键------
  117.       { delay(100);                             //延时1ms
  118.         if(!key_change)                         //调整键键是否按下
  119.         { Write_DS1302(Write_eabled,0);           //写允许
  120.            switch(mode_N)                      //判断按键次数
  121.            { case 1:                              //校分
  122.                 temp=BCD_INC(time[5]);
  123.                 if(temp>=0x60) temp=0;
  124.                 Write_DS1302(second,0);
  125.                Write_DS1302(minute,temp);break;
  126.               case 2:                            //校时
  127.                 temp=BCD_INC(time[4]);
  128.                 if(temp>=0x24) temp=0;
  129.                 Write_DS1302(hour,temp);break;
  130.               case 3:                            //校星期
  131.                 temp=BCD_INC(time[3]);
  132.                 if(temp>=0x08) temp=1;  
  133. Write_DS1302(week,temp);break;
  134.               case 4:                             //校日
  135.                 temp=BCD_INC(time[2]);
  136.                 if(temp>=0x32) temp=1;
  137.                Write_DS1302(date,temp);break;
  138.               case 5:                               //校月
  139.                 temp=BCD_INC(time[1]);
  140.                 if(temp>=0x13) temp=1;
  141.                Write_DS1302(month,temp);break;
  142.               case 6:                               //校年
  143.                 temp=BCD_INC(time[0]);
  144.                 if(temp>=0x30) temp=0;
  145.                Write_DS1302(year,temp) }
  146.                Write_DS1302(Write_eabled,0x80);       //写禁止
  147.            while(!key_change) display();
  148.           }
  149. }                 
  150.       TimeToDisplay();
  151.       if(count20<4)                                //显示模式----
  152.       { switch(mode_N)
  153.           {case 1:
  154. disp_buf[2]=0x23;disp_buf[3]=0x23;break;
  155. case 2:
  156. disp_buf[0]=0x23;disp_buf[1]=0x23;break;
  157. case 3:
  158. case 4:
  159. disp_buf[6]=0x23;disp_buf[7]=0x23;break;
  160. case 5:
  161. disp_buf[4]=0x23;disp_buf[5]=0x23;break;
  162. case 6:
  163. disp_buf[0]=0x23;disp_buf[1]=0x23;disp_buf[2]=0x23;
  164. disp_buf[3]=0x23;break;
  165. }
  166.       if(count20>=20)                              //主循环计次-------
  167.       { count20=0;
  168.          if(count100>=40)
  169.          {count100=0; }
  170.          else
  171.          {++count100; }     }
  172.       else
  173.       {++count20;  }
  174.       if(mode_N==0)
  175.       { yh=count100<20?1:0; }
  176.       else
  177.       {yh=0; }              //"清空"存储器--首字节为计数,其余为打铃时间点.
  178.       if(!key_clr_2402)
  179. {display();display();display();display();display();display();
  180.             if(!key_clr_2402) //键确认
  181.            {uchar i,k;
  182.              k=0xFF;
  183.              for(i=0xFF;i>0;i--)
  184.                 {RW24XX(&k,1,i,0xa0, M2402);}
  185.             k=0;RW24XX(&k,1,0,0xa0, M2402);
  186.            while(!key_clr_2402)display(); }  }           //写入显示时间为打铃点-
  187. if(!key_Wr_2402) {display();display();display();display();display();display();
  188. if(!key_Wr_2402)
  189.            {uchar i;
  190. RW24XX(&i,1,0,0xa1, M2402);                  //读指针
  191. if(i<=252)
  192. {RW24XX(&time[4],2,(i+1),0xa0, M2402);     //写入时间,2字节
  193. i+=2; RW24XX(&i,1,0,0xa0, M2402);           //修改指针
  194. }
  195. while(!key_Wr_2402)display();
  196. }
  197. }
  198. //打铃--------------------------------------------
  199.           if(Qtime!=time[5])
  200.       {                                 //分有更新,判断是否打铃
  201.           Qtime=time[5];                 //判断现在时间是否等于存储时间
  202.           if(Dll_OK())                   //如果相等
  203.           {
  204.             Dll_Symbolize=1;             //实现打铃
  205.           }
  206.           else                           //否则
  207.           {
  208.             Dll_Symbolize=0;              //不打铃



  209. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码

完整论文下载(word格式 可编辑 完整图片):
基于单片机的校园打铃系统设计.doc (638.13 KB, 下载次数: 149)

评分

参与人数 1黑币 +5 收起 理由
renjiuzhou + 5 绝世好帖!

查看全部评分

回复

使用道具 举报

ID:171106 发表于 2018-1-3 22:50 | 显示全部楼层
厉害厉害 学习学习~~~~
回复

使用道具 举报

ID:256738 发表于 2018-4-23 11:30 | 显示全部楼层
请问您还有打铃器的proteus仿真吗,跪求
回复

使用道具 举报

ID:329718 发表于 2018-6-11 16:07 | 显示全部楼层
请问这#include "DS1302.H"、#include "M24XX.H"两个头文件是什么呢?
回复

使用道具 举报

ID:390536 发表于 2018-8-27 18:59 | 显示全部楼层
正好需要
回复

使用道具 举报

ID:423807 发表于 2018-11-11 16:08 | 显示全部楼层
楼主辛苦了,感谢你的分享!
回复

使用道具 举报

ID:529357 发表于 2019-5-27 13:37 | 显示全部楼层

请问这#include "DS1302.H"、#include "M24XX.H"两个头文件是什么呢?
回复

使用道具 举报

ID:549278 发表于 2019-5-28 14:43 | 显示全部楼层
照着原理图连着是对的
回复

使用道具 举报

ID:550322 发表于 2019-5-29 16:35 | 显示全部楼层
没有头文件吗
回复

使用道具 举报

ID:315554 发表于 2019-7-17 12:50 | 显示全部楼层
学习一下24C02存储代码,高深,慢慢消化了,
回复

使用道具 举报

ID:714797 发表于 2020-3-24 15:09 | 显示全部楼层
想看下整体框图啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表