当前位置:首页 > 思想汇报 > 单片机自动打铃系统 [单片机自动打铃系统论文]
 

单片机自动打铃系统 [单片机自动打铃系统论文]

发布时间:2019-07-16 20:53:56 影响了:

钦 州 学 院

电子电路课程设计报告

数字万用表的设计

院 系 物理与电子工程学院

专 业 自动化

学 生 班 级 自动本101班

姓 名 _____韦永强________

指导教师单位 钦州学院

指导教师姓名 申康

指导教师职称 讲 师

2013年10月

在现如今快节奏的生活中,人们对于时间的要求越来越苛刻,很多时候都需要对时间进行规划,然后到时间点就要有时间提醒,这就必须用到时钟提醒装置,亦可称为打铃装置。打铃装置有很多种,比如手机的打铃系统,闹钟的机械打铃装置,广播打铃系统等等,但是日常生活中见得最多的还是校园的自动打铃系统。在学校生活中,每天上下课都离不开打铃系统的使用。打铃器可以为上下课的学生和老师们提供时间提醒,有利于师生对上课和学习的合理安排,同时,也可作为一个提醒学生们作息时间的时间表,让老师和学生都能有一个规律和科学的时间安排。因此,打铃系统的核心部分也是时钟部分,为系统提供时间基准。

本设计主要是针对适用于校园打铃系统要求的,其介绍了一种基于单片机的自动打铃系统的设计方法,系统以AT89C52单片机为控制器,以ISD4004时钟芯片为系统提供时间,并在液晶显示器上显示,通过按键可以设定定时打铃时间和打铃的时间间隔。系统软件设计采用C 语言来完成,C 语言语法简洁,使用方便,用于完成软件设计非常方便。本文提出的设计方法电路简单、成本低廉、实用性强。

关键字:打铃器、AT89C52单片机、ISD4004、液晶显示器

1 前言 . ....................................................................................................................................... 1

1.1 选题目的及意义 . ............................................................................................................................. 1

1.2 论文内容 . ......................................................................................................................................... 1

2 方案设计 . ............................................................................................................................... 2

2.1 方案比较与选择 . ............................................................................................................................. 2

2.1.1 系统方案选择 ....................................................................................................................... 2

2.1.2 时钟芯片选择 ....................................................................................................................... 2

2.1.3 显示器件选择 ....................................................................................................................... 3

2.2 设计方案 . ......................................................................................................................................... 3

3 系统硬件设计 . ....................................................................................................................... 4

3.1 硬件电路图 . ..................................................................................................................................... 4

3.2 时钟电路 . ......................................................................................................................................... 4

3.2.1 时钟电路设计 ....................................................................................................................... 4

3.3 按键电路 . ......................................................................................................................................... 5

3.4 单片机电路 . ..................................................................................................................................... 6

3.4.1 单片机简介 ........................................................................................................................... 6

3.4.2 单片机最小系统电路 ........................................................................................................... 9

3.5 显示电路 . ....................................................................................................................................... 10

3.6 打铃电路 . ....................................................................................................................................... 11

4 系统软件设计 . ..................................................................................................................... 12

4.1 软件设计流程图 . ........................................................................................................................... 12

4.2 读取ISD4004时间程序设计 . ....................................................................................................... 13

4.3 显示程序设计 . ............................................................................................................................... 14

4.4 按键设定程序设计 ........................................................................................................................ 17

5 系统调试 . ............................................................................................................................. 18

5.1 元件清单 . ....................................................................................................................................... 18

5.2 调试过程 . ....................................................................................................................................... 18

6 总结与展望 . ......................................................................................................................... 20

心得体会 . ................................................................................................................................. 20

参考文献 . ................................................................................................................................. 21

附录 . ......................................................................................................................................... 22

1 前言

1.1 选题目的及意义

随着现代科技的发展,管理水平的完善,具有自动提示功能的打铃器能够为企业节省人力资源,减少开支,对做到一体化管理具有很大的帮助。而且自动打铃系统不断影响着我们的学习和生活,它已被广泛应用于各个学校中,它能够实现学校的办公自动化,便于学校的管理。用单片机控制的自动打铃器,充分发挥了体积小,价格便宜,功耗低可靠性好等特点,而且具有可改性,用于学校作息,方便了广大师生。目前自动打铃系统的研究和使用已经非常普及,之所以选这个课题就是看在他的成熟性和普遍性。

打铃器可以为上下课的学生和老师们提供时间提醒,同时,也可作为一个提醒学生们作息时间的时间表,让大家有一个时间意识,形成规律的生物钟,对自身的健康也有很大的好处的。对于那些上课精力过于集中、知识面拓展比较广的老师的拖堂现象也给了一个下课时间提醒,以免耽误学生们下一节课的上课时间。

打铃器作为一个提醒人们时间的设备,自然离不开提供时间的系统,最原始的打铃器是人工根据时间通过敲钟来提醒,随着技术的发展,开始有了机械时打铃器。随着二十世纪电子技术的发展和二十一世纪半导体技术和集成电路的发展,电子技术开始渗入到各行各业,以电子表为主要基础提供时间基准的打铃器自然也是更新换代的更快,现在各种功能更多、使用更先进的打铃器层出不穷,有的还可以以音乐响铃代替传统的“呤呤”声,打铃器更多的向着智能型转变。设备的智能化离不开单片机的使用。单片机简单的说就是一款微型的计算机,包含中央处理器CUP 、随机存取存储器RAM 、只读存储器ROM 、I/O口、串行口等部分,可以作为一个系统的主控制器,将其他部分电路整合到一起组成一个系统,为控制提供智能化。

基于以上原因,本课题设计了一款基于单片机的自动打铃系统,使用简单方便、功能齐全。本次的设计重点在于实现自动打铃系统的基本功能之外,争取设计出亮点,出新意,对我本身是个不小的挑战,因此对这个课题的研究不管是对于我本身还是对此项目在科技方面的发展都是有很重要的意义

1.2 论文内容

本设计是以AT89C52单片机为核心的一款自动打铃系统,以时钟芯片来实现计时功能,然后单片机负责将时间送入显示电路显示,整个系统不是很复杂,其设计主要包括单片机控制模块、时钟电路和显示电路三个模块的设计,在设计前本人在学校图书馆看了很多关于单片机方面的书,也在网上查了不少资料,也查阅过跟此设计相似的论文

或者期刊,得到了不少启发和经验,对本人的设计工作有很大的帮助,能很好的把握设计的整体方向和细节。

2 方案设计

2.1 方案比较与选择

2.1.1 系统方案选择

方案一:采用数字电路来搭建,利用555时基电路构成振荡器产生100Hz 频率的振荡电路,再通过分频器得到1Hz 频率,即产生1秒计时时间,显示部分通过锁存器和驱动芯片将计时时间送入数码管显示。设计框图如图2-1所示。这种方案电路结构比较复杂,芯片使用比较多,灵活性不高,而且准确度不够精确,不利于系统的扩展。而且这种电路中需要使用独立式的数码管,每一个数码管都需要连接一个数据锁存器和数码管驱动芯片,连接线比较多,制作的过程中很容易出错。

图2-1 方案一设计框图

方案二:采用AT89S51单片机作为系统控制单元,通过时钟芯片来实现计时功能,单片机负责将时间送入显示电路显示。设计框图如图2-2所示。这种方案电路设计简单,时间精确,使用方便。而且单片机的强大功能使得系统方便扩展,有利于提高智能性。

图2-2 方案二设计框图 综上所述,本设计选用第二种设计方案。

2.1.2 时钟芯片选择

方案一:因为本文设计的数字钟只需要显示分钟和秒,因此可以直接采用单片机定时计数器提供秒信号,使用程序实现分、秒计数。采用此种方案虽然减少芯片的使用,

节约成本,但是,实现的时间误差较大,硬件就比较复杂,稳定性低,而且不易控制。所以不采用此方案。

方案二:采用ISD4004时钟芯片实现时钟。ISD4004,它是I2C 总线接口实时时钟芯片,可以独立于CPU 工作,不受CPU 主晶振及其电容的影响,且计时准确,月累积误差一般小于10秒。芯片还具有主电源掉电情况下的时钟保护电路,ISD4004的时钟靠后备电池维持工作,拒绝CPU 对其读出和写入访问。同时还具有备用电源自动切换控制电路,因而可在主电源掉电和其它一些恶劣环境场合中保证系统时钟的定时准确性。同时,ISD4004芯片内部还集成有一定容量、具有掉电保护特性的静态RAM ,可用于保存一些关键数据。所以采用ISD4004作为时钟芯片。

2.1.3 显示器件选择

为了能以十进制数码直观地显示数字系统的运行数据,目前广泛使用了七段字符显示器,或称做七段数码管。这种字符显示器由七段可发光的线段拼合而成。常见的七段字符显示器有半导体数码管和液晶显示器两种。

半导体数码管的每个线段都是一个发光二极管(Light Emitting Diode,简称LED ),因而也把它叫作LED 数码管或LED 七段显示器。半导体数码管不仅具有工作电压低、体积小、寿命长、可靠性高等优点,而且响应时间短(一般不超过0.1us ),亮度也比较高,但是只能显示数字,显示内容比较受到限制,又过多的占用单片机的I/O口。

液晶显示器简称LCD ,液晶是一种既具有液体的流动性又具有光学特性的有机化合物,它的透明度和呈现的颜色受外加电场的影响,利用这一特点便可以做成字符显示器。液晶显示器最大的优点是功耗极小,每平方厘米的功耗在1uW 以下。它的工作电压也很低,在1V 以下仍能工作。而且显示内容比数码管要丰富。因此,液晶显示器在电子表以及各种小型、便携式仪器、仪表中得到了广泛的应用。

综上所述,本设计中选用液晶显示器作为显示单元器件。

2.2 设计方案

本设计系统框图如图2-3所示。系统以AT89C52单片机为控制器,通过ISD4004来为系统提供标准时间,单片机读取ISD4004时间后送液晶显示器显示,通过按键来设置打铃时间。当打铃时间到时,系统实现蜂鸣器和LED 灯声光提示。系统设计框图如下:

3 系统硬件设计

3.1 硬件电路图

根据系统设计框图,本设计硬件电路主要由时钟电路、按键设定电路、单片机电路、显示电路和打铃电路组成,电路原理图见附录一所示。

系统工作原理:系统时间由时钟芯片ISD4004来提供,单片机通过P3口读取了ISD4004的时间数据后,经过处理得到时间显示模式的时钟数据,并通过P2口送液晶显示器显示出来。再通过扫描P1口是否有按键按下,有按键按下时,通过液晶显示器显示来设置定时时间、打铃时间间隔,通过设定、移位、加数来实现。当到达打铃时间时,单片机引脚启动蜂鸣器和LED 灯电路工作以声光形式实现打铃功能。

3.2 时钟电路

3.2.1 时钟电路设计

时钟电路如图3-2所示。时钟芯片的SCL 引脚和SDA 引脚分别由单片机的P3.1和P3.2引脚控制,单片机只需按照ISD4004的工作时序来控制DS1307即可实现时间的写入和读取,其中ISD4004的时钟端与数据端需外接上拉电阻,本设计选用5针排阻来充当上拉电阻。

图3-1 时钟电路

3.3 按键电路

键盘是单片机应用中常用的一种输入器件,键盘的按键有触点式和非触点式之分,按接口原理有编码键盘和非编码键盘之分。编码键盘主要用硬件来实现对按键的识别,非编码键盘是由软件来实现键盘的定义与识别。常用的按键一般为触点式按键,根据按键所连接的单片机引脚的电平高低来判断其是否按下。按功能分,键盘有独立按键和矩阵按键之分,独立按键每一路按键就占用单片机的一个控制引脚,单片机直接获取其信息;矩阵按键将按键排成由行和列组成的行列式,通过确认按键的行号和列号来确定每一路按键,利用少的单片机引脚控制更多的按键。

本设计中按键电路如图3-2所示,由单片机的P1口控制按键电路。本设计中按键用于设定定时时间、打铃时间间隔,所以只需4路按键即可实现所需功能,采用独立式按键即可。由于按键是机械式触点,所以在断开或闭合时,一般都有抖动产生,虽然这个抖动时间在我们看来非常短,但是单片机执行指令的速度为微秒级别,很容易会读取这个时间而将其判断为真正的工作状态,从而引起误判。因此,在设计中必须考虑到按键抖动的影响。常用的去抖动的方法有两种:硬件方法和软件方法。硬件方法一般是加电容或者RS 触发器;软件方法是在单片机在检测引脚所连接的按键的工作状态时加一个延时程序再次确认,通过2次的确认就可以确保按键的工作状态不受机械抖动的影响了。

图3-2 按键电路

3.4 单片机电路

3.4.1 单片机简介

单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的CPU 、RAM 、ROM 、多种I/O口、中断系统和定时器/计时器功能集成到一块芯片上的完善的计算机系统,它最早是被用在工业控制领域。由于单片机在工业控制领域的广泛应用,为使更多的业内人士、学生和爱好者学习掌握这门技术,产生了单片机开发板。

早期的单片机是8位或4位的,其中最成功的是INTEL 的8031单片机,因简单可靠而获得了很大的好评。此后,在8031的基础上发展出了MCS51系列单片机,基于这一系统的单片机一直到现在还广泛应用着。随着工业控制领域要求的提高,开始出现了16位的单片机,因性价比不好并未得到广泛的应用。90年代后期随着消费电子产品的大发展,单片机技术得到了很大的提高,32位机迅速代替了16位机进入主流市场,传统的8位机的处理速度也提高了数百倍,而且价格也降低了很多,得到了广泛的应用。现在人们生活中几乎每个电子产品或机械产品都或多或少带有单片机控制系统,智能仪器仪表、医疗器械、家用电器、儿童玩具等等,汽车电子中单片机的应用也是非常广泛,一般汽车上配备有接近40多个单片机系统。

AT89C52是一种带4K 字节闪烁可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL 高密度非易失性存储器制造技术,与工业标准的MCS-51指令集和输出管脚相兼容。主要特性:

与MCS-51产品指令系统完全兼容;

4K 字节在系统编程(ISP )Flash 闪速存储器;

1000次擦鞋周期;

4.0-5.5V 的电压工作范围;

全静态工作模式:0Hz-33MHz ;

三级程序加密锁;

128*8字节内部RAM ;

32个可编程I/O口线(P1、P2、P3、P4);

2个16位定时/计数器,可通过编程实现4种工作方式;

1个具有6个中断源、4个优先级的中断潜嵌套结构;

全双工UART 通道;

低功耗空闲和掉电模式;

中断可从空闲模式唤醒系统;

看门狗(WDT )及双数据指针;

掉电标识和快速编程特性;

灵活的在系统编程(ISP 字节或页写模式)。

AT89C52单片机内部主要由9个部件组成:1个8位中央处理器;4KBFlash 存储器;128B 的数据存储器;32条I/O口线;2个定时器/计数器;1个具有6个中断源、4个优先级的中断嵌套结构;用于多处理机通信、I/O扩展或全双工UART 的串行口;特殊功能寄存器;1个片内振荡器和时钟电路。AT89S51系列单片机完全继承了MCS-51的指令系统,共有111条指令,按其功能可分为五大类:数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令、布尔操作。

中断技术是计算机中的重要技术之一,它既和硬件相关,也和软件相关,正因为有了“中断”才使得计算机的工作更加灵活、效率更高。所谓中断实际是一个处理时间的过程,这一过程一般是由计算机内部或外部某种紧急事件引起并向主机发出请求处理的信号,主机在允许情况下相应请求,暂停正在执行的程序,保存好“断点”处的现场,转去执行中断处理程序,处理完后自动返回到原断点处,继续执行原程序。引起中断的原因,或是能发出中断申请的来源,称为中断源。AT89C52提供5个中断源,即:

外部中断源/INT0:由P3.2输入;

外部中断源/INT1:由P3.3输入,I/O设备中断请求信号,或掉电故障异常事件中断请求信号都可以作为外部中断源连/INT0、/INT1。

定时器/计数器T0溢出中断:TF0做标志,由P3.4输出;

定时器/计数器T1溢出中断:TF1做标志,由P3.5输出;

片内串行口产生的中断:RX 、TX 。

I/O口分配:

P0口(P0.0~P0.7)为双向8位三态I/O口,当作为I/O口使用时,可直接连接外部I/O设备。它是地址总线低8位及数据总线分时服用口,可驱动8个TTL 负载。一般作为扩展时地址/数据总线口使用。

P1口(P1.0~P1.7)的每一位都可以分别定义为输入线和输出线(做输入时,锁存器必须置1),可驱动4个TTL 负载。P1口常用作通用I/O口,它是一个标准的准双向口。

P2口(P2.0~P2.7)为8位准双向I/O口,当作为I/O口使用时,可直接连接外部I/O设备。它是地址总线的高8位复用,可驱动4个TTL 负载。一般作为扩展地址总线

的高8为使用。

P3口(P3.0~P3.7)为8位准双向I/O口,是双功能复用口,可驱动4个TTL 负载,能够实现第一功能,可作为通用I/O口。P3口的第二功能定义如表3-1所示:

表3-1 P3口第二功能定义

引脚定义 P3.0-RXD P3.2-INT 0 P3.4-T0 P3.6-WR

功能 串行输入口 外部中断0 计时器0外部输入 外部数据存储器写选通

引脚定义 P3.1-TXD P3.3-INT 1 P3.5-T1 P3.7-RD

功能 串行输出口 外部中断1 计时器1外部输入 外部数据存储器读选通

RST :复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时间。 ALE/PROG:地址锁存允许信号输出。在CPU 访问外部程序存储器或外部数据存储器时,ALE 提供一个地址锁存信号,将低8位地址锁存在片外锁存器中。在与Flash 并行编程/校验期间,该引脚也是编程负脉冲的输入端。在正常操作状态下,该引脚端口输出恒定频率的脉冲。其频率为晶振频率的1/6,可用作外部定时或其他触发信号。如果需要,可通过SFR 的第0位置禁止ALE 操作,但ALE 的禁止位不影响对外部存储器的访问。

PSEN :片外程序存储器选通信号,低电平有效。当AT89S51执行来自外部程序存储器的指令代码时,PSEN/每个机器周期两次有效。在访问外部数据存储器时,PSEN/无效。

EA /VPP :EA 片外程序存储器访问允许信号,低电平有效。当EA 接地时,CPU 只执行片外存储器中的程序;当EA 接Vcc 时,CPU 首先执行片内程序存储器中的程序(0000H~0FFFH),然后自动转向执行片外程序存储器中的程序(1000H~FFFFH)。如果程序锁定位LB1被编程(P ),那么EA 值将在复位时由片内锁存。在与Flash 并行编程/校验期间,该引脚施加12V 的编程电压VPP 。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。

AT89S51引脚图如图3-3所示

3.4.2 单片机最小系统电路

单片机最小系统由晶振电路和复位电路组成。电路如图3-5所示。

晶振电路用于产生单片机工作时所需要的时钟信号,单片机的指令必须在时钟信号下按照时序执行。晶振电路通常用两种设计方式:内部振荡方式和外部振荡方式。内部振荡方式是在单片机的XTAL1和XTAL2引脚外接一个晶体振荡器,与单片机内部的振荡器组成时钟信号;外部振荡方式是在外部将已有的脉冲信号引入单片机内,一般用于使单片机的时钟与外部信号保持同步。本设计选用内部振荡方式,在XTAL1和XTAL2引脚之间连接一个12MHz 的晶振,再分别外接30p 的对地电容。

单片机在启动时需要复位,使系统各器件处于初始状态。复位引脚为RST ,当系统上电后晶振电路稳定后,RST 引脚有一个高电平且持续2个机器周期以上,单片机系统就可以实现复位功能。复位一般有手动复位和上电复位功能。手动复位是在RST 引脚设置按键,当按键按下时,RST 引脚会有高电平,即可实现复位功能;上电复位是在RST 引脚连接一个电解电容接至电源,再接一个电阻接地,系统上电时,电容充电,只要电源的上升时间不超过1ms ,就可以实现复位功能。本设计选用按键复位。

图3-4 单片机最小系统电路

3.5 显示电路

LCD1602为字符型液晶显示器,分为带背光和不带背光两种,主要技术参数: 显示容量,16×2个字符; 芯片工作电压,4.5V-5.5V ; 工作电流,2.0mA ; 模块最佳工作电压,5V ; 字符尺寸,2.95×4.35mm 。

LCD1602共有16个引脚,引脚说明如下: 1脚,VSS ,电源地;

2脚,VDD ,电源正极,接+5V;

3脚,VL ,液晶显示偏压,接正电源时对比度较弱,接地时对比度最高; 4脚,RS ,数据/命令选择,高电平时选择数据寄存器,低电平时选择指令寄存器; 5脚,R/W,读/写选择,高电平时进行读操作,低电平时进行写操作,当RS 和R/W共同为低电平时可以写入指令或者显示地址,当RS 为低电平R/W为高电平时可以读忙信号,当RS 为高电平R/W为低电平时可以写入数据;

6脚,E ,使能信号,当E 端由高电平跳变为低电平时,液晶块执行命令; 7-14脚,D0-D7,8位双向数据线; 15脚,BLA ,背光源正极; 16脚,BLK ,背光源负极。

单片机的P2口作为LCD1602的数据线端口,P3口控制LCD1602的使能端。单片机读取数据后,通过控制LCD1602的读写端、复位端和使能端将其设置为写入数据状态,再将数据通过P2口送入LCD1602实现显示功能。

3.6 打铃电路

打铃电路一般用声音或音乐作为提醒,本设计选用蜂鸣器和LED 灯实现声光双重打铃功能,电路如图3-7所示。打铃时间到时,单片机P3.3引脚置高,三极管9013导通,继而蜂鸣器和LED 灯导通,实现蜂鸣和灯亮打铃功能。

图3-5 打铃电路

4 系统软件设计

4.1 软件设计流程图

系统软件设计流程图如图4-1所示。

图4-1 软件设计流程图

程序设计过程:首先要定义单片机的引脚,然后初始化器件,再利用ISD4004的读写时序读取时间数据。再利用按键进入时间设定状态,设定完时间后单片机通过比较时间是否到达设定的时间来确定是否到打铃时间,如果达到打铃时间,则控制蜂鸣器响LED 灯亮。

4.2 读取ISD4004时间程序设计

ISD4004中的时间寄存器地址编码为00H-07H ,而具有掉电保护的RAM 寄存器的地址编码为08H-3FH 。当地址指针指向RAM 的最后一个地址3FH 时,若进行多字节操作,则地址指针将会复位而指向00H ,这样原来存在00H 的数据将会丢失。DS1307的各类时间数据均以BCD 码的格式存储在相应的时间寄存器中,具体分配如表4-1所示:

表4-1 ISD4004寄存器分配

00H 秒

01H 分

02H 小时

03H 星期

04H 日期

05H 月

06H 年

07H 控制字

单片机通过读取ISD4004相应的寄存器字节,可以获取时钟和日历信息。时钟和日历信息以BCD 码的形式存放在寄存器中,寄存器0的第7位为时钟停止位,振荡器停止工作。由于在初次上电时,所有寄存器的状态是不确定的,所以在初始化时必须将寄存器0中的第7位设为0。

ISD4004可运行在12/24小时模式下,并由时间控制器中的相应位来进行控制。根据小时寄存器的第6位是0还是1,置为1时,是工作于12小时模式下,此时,小时寄存器的第5位为AM/PM标志。在24小时模式中,小时寄存器的第5位和第4位共同组成小时的十位数。时钟模块设计流程:单片机按如下顺序将数据写入到ISD4004 寄存器或内部RAM 中:

1、START 信号

2、写SLA+W(0xd0)字节,DS1307 应答(ACK );

3、写1 字节内存地址(在以下第四步写入的第一字节将存入到DS1307 内该地址处,DS1307应答);

4、写数据(可写多个字节,每一字节写入后DS1307 内部地址计数器加一,ISD4004应答);

5、STOP 信号

单片机读取ISD4004子程序流程图如图4-2所示:

图4-2 单片机读取DS1307子程序流程图

4.3 显示程序设计

LCD1602的基本操作时序:

读状态:输入:RS=L,RW=H,E=H;输出:D0-D7=状态字。

写指令:输入:RS=L,RW=L,D0-D7=指令码,E=高脉冲;输出:无。 读数据:输入:RS=H,RW=H,E=H;输出:D0-D7=数据。

写数据:输入:RS=H,RW=L,D0-D7=数据,E=高脉冲;输出:无。

LCD1602初始化过程:延时15ms ;写指令38H (不检测忙信号);延时5ms ;写指令38H (不检测忙信号);延时5ms ;写指令38H (不检测忙信号);以后每次写指令、读/写数据操作均需要检测忙信号;写指令38H ,显示模式设置;写指令08H ,显示关闭;写指令01H ,显示清屏;写指令06H ,显示光标移动设置;写指令0CH ,显示开及光标设置。

LCD 有11条控制指令,如表4-2所示。

表4-2LCD1602控制指令表

序号 1 2 3 4 5 6 7

指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0

清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 置功能 置字符发生存储器地址

0 0 0 0 0 0 0

0 0 0 0 0 0 0

0 0 0 0 0 0 0

0 0 0 0 0 0 1

0 0 0 0 0 1

0 0 0 0 1 DL

0 0 0 1

0 0 1 D

0 1 I/D C * *

1 * S B * *

S/C R/L N

F

字符发生存储器地址

8 置数据存储器地址

0 0 1 显示数据存储器地址

9 读忙标志或地址 0 1

1 0

BF 计数器地址 要写的数据内容

10 向CGRAM 或

DDRAM 写数 11 从CGRAM 或

DDRAM 读数

1 1 读出的数据内容

LCD1602内部自带有80×8位的RAM 缓冲区,RAM 地址映射如表4-3所示。

表4-3 LCD1602的RAM 地址映射表

00 40 0A 4A

01 41 0B 4B

02 42 0C 4C

03 43 0D 4D

04 44 0E 4E

05 45 0F 4F

06 46 10 50

07 47

08 48

09 49 27 67

„„ „„

LCD1602写操作时序如图4-3所示。

图4-3 LCD1602写操作时序

向LCD1602写数据程序子程序流程图如图4-4所示:

图4-4 向LCD1602写数据程序子程序流程图

4.4 按键设定程序设计

单片机读取按键的方式有2种:查询方式和中断方式。

查询方式是利用单片机引脚不断查询是否有按键按下,如果有按键按下,利用延时程序去除抖动再次确认后,进入该按键对应的子程序执行命令。

中断方式是利用单片机的外部中断功能来检测是否有按键按下。利用中断功能可以不用在主程序中不断的执行查询命令,有中断产生即有按键按下时,再进入中断子程序中进行处理。

本设计选用查询方式处理按键设定程序。每个独立式按键直接接至单片机引脚,每个按键的键值与单片机端口的8个引脚的8位二进制码相对应。本设计为P1.0-P1.3引脚控制4路按键。

单片机控制按键子程序流程图如图4-5所示:

图4-5 单片机控制按键子程序流程图

5 系统调试

5.1 元件清单

本设计中的硬件制作中所用元器件如表5-1所示。

表5-1 元件清单

元器件名称 AT89S51单片机

LCD1602 1N4148二极管 9013三极管 发光二极管 22P 电容 10K 电阻 47Ω电阻 5针排阻

个数 1 1 1 1 1 2 2 1 1

元器件名称 DS1307 32.768KHz 晶振 5.1K 电阻 蜂鸣器 12MHz 晶振 10U 电解电容 10K 电位器 按键 万用板

个数 1 1 2 1 1 1 1 4 1

5.2 调试过程

制作调试过程中所用仪器有:数字万用表、电烙铁,焊锡丝、焊锡膏、剥线钳、尖嘴钳、圆口钳、镊子,吸锡器等,另外准备尽量多的导线。

制作与调试过程如下:

1、按照元器件清单准备好所需要用到的元器件。

2、按照电路原理图焊接硬件电路板,先焊接芯片的底座,再焊接其外围电路。实物电路图如图5-1所示:

图5-1 实物电路图

3、当定时时间到时,蜂鸣器响,LED 灯亮。

4、每隔设置的打铃时间间隔,蜂鸣器响,LED 灯亮,实现打铃功能。 经上述调试,系统工作正常,实现设计要求的功能。

6 总结与展望

经过这段时间的努力,毕业设计也接近了尾声。本文从选题目的及意义开始,介绍了系统的方案设计,其中提供了两种设计方案,经过互相之间的比较后选择了简单易行的一种方案,后面还列出了其他两种模块的设计方案,并经比较后选择了合适的方案,然后对系统的硬件设计进行了阐述,包括电路图和元器件的介绍,对它们实现的功能和内部结构都进行了说明,接着是软件部分的设计,这也是此设计的关键部分,有很详细的说明。

本设计是针对学校的作息时间而设计的一种自动打铃系统,但是它同样可以用于其他的场所,如工厂,生厂车间等等,它能很好的起到时钟提醒的作用,方便了人们的日常生活。在硬件设计部分,显示器件选的是液晶显示器,它具有功耗和工作电压低的特点,而且它的显示质量高,可视面积大,能很好的达到设计要求,还降低了软件的编程难度。

本设计的自动打铃系统还存在不足和缺点,主要表现在这些方面:虽然系统能够很好的实现打铃的要求,但是能够设定的打铃时间只有六个,这是因为想降低编程时的难度,在不影响其功能的前提下,降低了要求;还有就是其扩展性不强,后续的发展比较困难,制约了系统的升级,在商品竞争中没什么优势,需要进一步的研究和开发。

通过此次毕业设计,我对所学专业的知识有了很好的回顾和实践,提高了自己的动手和思考能力,这对我自身的发展有很大的帮助,同时在此期间我查阅了很多的书籍和资料,从中学到了很多课本上没有的知识,拓展了自己的知识面,如果没有前期的准备工作是没法很好的完成此次设计的,所以多学、多看、多想、多动手才是学好知识的必要素质,这对我未来的发展和进步有着至关重要的作用。

心得体会

回顾这次设计的过程,感慨良多,收获颇丰,首先要感谢我的导师,成凌飞老师。在这段时间里成老师经常给提醒我们在做毕业设计过程中应当注意的事项,并在百忙之中特地抽出时间为我们讲课,讲解论文的排版及写作技巧,使我们受益不浅,还不忘督促我们按步骤完成每一项内容,可以说从毕业设计的开始到完成都能看见老师的身影,没有老师的辛勤辅导和对学生的责任心就没有我现在这样一篇毕业论文。同时我还要感谢大学四年所有教导过我的老师,是他们的谆谆教诲给了我大学四年的专业知识,在学习的道路上,他们就是我的领路人,真的非常感谢,还要感谢陪伴了我四年的每一个同

学,因为他们,我的大学才不苍白,因为他们,我的大学才精彩,也是因为他们,我的大学才有意义。

毕业设计告一段落了,但是我的人生却迎来了另一个出发点,毕业并不意味着结束,它同时是一个新的开始,我会带着老师们的希冀,朋友们的祝福和友谊走得更远、更高、更坚定,谢谢,谢谢你们!!!

参考文献

[1] 张凤言. 电子电路基础. 北京高等教育出版社,1995.

[2] 戴佳,戴卫恒,刘博文等.51单片机C 语言应用程序设计实例精讲. 电子工业出版社,2008.

[3] 孙江宏等. Protel 99 电路设计与应用. 机械工业出版社,2001. [4] 阎石. 数字电子技术基础. 高等教育出版社,1998.

[5] 范风强,兰婵丽. 单片机语言C51应用实战集锦. 电子工业出版社,2001. [6] 张萌,和湘,姜斌等. 单片机应用系统开发综合实例. 清华大学出版社,2007. [7] 张义和. 例说51单片机(C 语言版),人民邮电出版社,2010. [10] 徐福成. 一款人性化的打铃器. 电子制作,2008,(2):36-37.

附录

源程序

#include #include"YUYIN3.H" //#include"match.H" #define uchar unsigned char #define uint unsigned int

#define keyinc 0xfb // P3^2 #define keydec 0xf7 // P3^3// #define flaginc 0xfe //P3^0// #define flagdec 0xfd

//P3^1///

uchar num; sbit rw=P0^6; sbit lcdrs=P0^7; sbit lcden=P0^5; sbit sda=P0^4; sbit scl=P0^3;

sbit warming=P0^0; //报警中断 /*sbit k1= P3^0; //加 sbit k2= P3^1; // sbit k3= P3^2; //加 sbit k4= P3^3; // 加 sbit k5= P3^4; // jian sbit k6= P3^5; // jian */

sbit k7= P0^1; // fen sbit k8= P0^2; // jian

sbit LED= P1^0; // jian uint year;

uchar s,hour,min,sec,week,mon,day,r,x=1,p=0,d=0,m;

uchar flag=0;

uchar code table[]={"0","1","2","3","4","5","6","7","8","9",":","-"};

//uint code table1[]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};

uchar code table1[]={"S","u","n","M","o","n","T","u","e","W","e","d","T","h","u","F","r","i","S","a","t"}; uchar code table2[]={"flag"};

uchar code fen[]={0x10,0x11,0x15,0x20,0x25,0x30,0x35,0x40,0x45,0x50,0x55}; //fendingshi

uchar code

shi[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23}; //fendingshi void delayus();

void write_add(uchar address,uchar date); delay(uint t) { }

void write_com(uchar com) { }

void write_data(uchar date) {

//延时函数

uint i,j; for(i=0;i

//写指令于lcd

for(j=0;j

rw=0; lcdrs=0; P2=com; delay(5); lcden=1; delay(5); lcden=0;

//写内容与lcd 显示

lcdrs=1;

}

delay(5); lcden=1; delay(5); lcden=0;

//初始化

void init() {

rw=0; lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80+0x10); sda=1; delayus(); scl=1; delayus();

write_add(0x00,0x00);// 00 write_add(0x01,0x00);// 00 write_add(0x02,0x50);// 57 秒钟 write_add(0x03,0x09);// 56 分钟 write_add(0x04,0x01);// 09 小时 write_add(0x05,0x13);//20 日期 write_add(0x06,0x07);// 04 星期 write_add(0x07,0x10);// 01 月 write_add(0x08,0x13);// 10 年

//write_add(0x02,0x00);// 秒设置

write_add(0x0A,0X22); //报警时间22小时 write_add(0x01,0x12); //报警生效

/* write_add(0x09,0X49);// 报警时间49分

}

/*void warming1() { //uchar p,d,m;

write_add(0x09,fen[p]);// 报警时间49分

write_add(0x0A,shi[d]); //报警时间22小时 write_add(0x01,0x12); //报警生效 {

if(p

if(k1==0)//被按下

if(k2==0) {

if(d

;LED=~LED;}

//shi

if(k3==0)

if(m

if(p>0x01){ else p=0x00; } if(k5==0) {

if(d>0x02) {d-- ;LED=~LED;} else p=0x01; } if(k6==0)

p-- ;LED=~LED;

}

if(m>0x02) {m-- ; LED=~LED;}

else p=0x01;

}

} */ void delayus() //延时微秒函数

{ ;

}

void start() //开始信号 { sda=1; delayus(); scl=1; delayus(); sda=0; delayus();

}

void stop() //停止 { sda=0; delayus(); scl=1; delayus(); sda=1; delayus();

}

void respons() //应答 { uchar i; scl=1; delayus();

while((sda==1)&&(i

}

delayus();

//写一个字节子函数

void write_byte(uchar date) { }

uchar read_byte() {

uchar i,temp; temp=date;

for(i=0;i

temp=temp

delayus();

//读一个字节函数

uchar i,k; scl=0; delayus(); sda=1; delayus(); for(i=0;i

{

scl=1;

delayus();

k=(k

scl=0;

delayus();

}

return k;

}

void write_add(uchar address,uchar date)

{

start();

write_byte(0xa2);

respons();

write_byte(address);

respons();

write_byte(date);

respons();

stop();

}

uchar read_add(uchar address)

{

uchar date;

start();

write_byte(0xa2);

respons();

write_byte(address);

respons();

start();

write_byte(0xa3);

respons();

date=read_byte();

stop();

return date;

//往一个单元里写内容函数 //读一个单元的内容

void read8563()

{

//write_add(0x09,0x49); //////报警

******************************************************

}

//***********************************************

key()

{

uchar temp; P3=0xff; temp=P3; if(!temp==0xff) //有一被按下 { } return(temp);

delay(10); P3=0xff; temp=P3; //按键扫描程序 sec=read_add(0x02); // 读秒地址 min=read_add(0x03); // 读分地址 hour=read_add(0x04); // 读小时地址 day=read_add(0x05); // 读日期地址 week=read_add(0x06); // 读星期地址 mon=read_add(0x07); // 读月份地址 year=read_add(0x08); // 读年地址 //min=read_add(0x09); //分报警 //将读出的数写入hour 与min 中 // hour=read_add(0x0A);//时报警 }

//*************************************************

key_date()

{

//按键执行子函数

num=key(); //p3=num if(num==flaginc)//p3.0被按下 { if(flag==7) { } else {flag++;} flag=0; //功能键的增加 #define flaginc 0xfe } //********************************************************** if(num==flagdec)//#define keydec 0xf7////P3.1被按下//功能键减 { if(flag==0) { } else {flag--;} flag=7;

}

//******************************************************************************************************

if(num==keyinc)//#define keyinc 0xfb//参数增加 p3.2被按下 { uchar ktemp; switch(flag) {

//秒 case 1:ktemp=0;write_add(0x02,ktemp);peak;

*************************************

case 2:ktemp=read_add(0x03)&0x7f; //分

*******************************

if(ktemp==0x59) {ktemp=0x00;} else { if(ktemp%16==0x09)

} else{ktemp++;} write_add(0x03,ktemp);peak;

case 3:ktemp=read_add(0x04)&0x3f; //时

**********************************

case 4:ktemp=read_add(0x06)&0x07; // 星期

********************************

case 5:ktemp=read_add(0x05)&0x7f; //日

************************************

case 6:ktemp=read_add(0x07)&0x7f; //月

************************************************

if(ktemp==0x23) {ktemp=0x00;} else { } write_add(0x04,ktemp);peak; if(ktemp%16==0x09) {ktemp+=0x07;} else{ktemp++;} if(ktemp==6) {ktemp=0;} else {ktemp++;} write_add(0x06,ktemp);peak; if(ktemp==0x31) {ktemp=0x00;} else {if(ktemp%16==0x09){ktemp+=0x06;}ktemp++;} write_add(0x05,ktemp);peak; if(ktemp==0x12) {ktemp=0x00;}

write_add(0x07,ktemp);peak;

case 7:ktemp=read_add(0x08); //年

*****************************************************

} } if(ktemp==0x99) {ktemp=0x00;} else {if(ktemp%16==0x09){ktemp+=0x06;}ktemp++;} write_add(0x08,ktemp);peak; default:peak; if(num==keydec) { uchar dtemp; switch(flag) { //#define keydec 0xf7 p 3.3 case 1:dtemp=0;write_add(0x02,dtemp);peak; case 2:dtemp=read_add(0x03)&0x7f; if(dtemp==0x00){dtemp=0x59;} else {if(dtemp%16==0x00){dtemp-=6;}dtemp--;} write_add(0x03,dtemp);peak; if(dtemp==0x00){dtemp=0x23;} else {if(dtemp%16==0x00){dtemp-=6;}dtemp--;} write_add(0x04,dtemp);peak; if(dtemp==0x00){dtemp=0x06;} else {dtemp--;} write_add(0x06,dtemp);peak; if(dtemp==0x00){dtemp=0x31;} else {if(dtemp%16==0x00){dtemp-=6;}dtemp--;} write_add(0x05,dtemp);peak; case 3:dtemp=read_add(0x04)&0x3f; case 4:dtemp=read_add(0x06)&0x07; case 5:dtemp=read_add(0x05)&0x7f;

} } } if(dtemp==0x00){dtemp=0x12;} else {if(dtemp%16==0x00){dtemp-=6;}dtemp--;} write_add(0x07,dtemp);peak; if(dtemp==0x00){dtemp=0x99;} else {if(dtemp%16==0x00){dtemp-=6;}dtemp--;} write_add(0x08,dtemp);peak; case 7:dtemp=read_add(0x08)&0xff; default:peak;

//*********************************************************************************

void display()

{

if(flag!=0) { write_com(0x06); switch(flag) { case 1: write_com(0x80+0x40+6); write_com(0x0f);delay(800);peak; write_com(0x0f);delay(800);peak; write_com(0x0f);delay(800);peak; write_com(0x0f);delay(800);peak; write_com(0x0f);delay(800);peak; write_com(0x0f);delay(800);peak; case 2: write_com(0x80+0x40+3); case 3: write_com(0x80+0x40+0); case 4: write_com(0x80+13); case 5: write_com(0x80+8); case 6: write_com(0x80+5);

} } write_com(0x0f);delay(800);peak; default:peak; /*write_com(0x06); write_com(0x80+0x00); write_com(0x0f); delay(1000);*/ write_com(0x80+0x00); write_data(table[2]); write_data(table[0]); write_com(0x80+0x02); write_data(table[year/16]); write_data(table[year%16]); write_data(table[11]); write_data(table[(mon&0x1f)/16]); write_data(table[(mon&0x1f)%16]); write_data(table[11]); write_data(table[(day&0x3f)/16]); write_data(table[(day&0x3f)%16]); write_com(0x80+0x0c); for(num=0;num

write_data(table[(sec&0x7f)%16]); write_com(0x80+0x49); write_data(table2[0]); write_data(table2[1]); write_data(table2[2]); write_data(table2[3]); write_data(table[10]); write_data(table[p]); write_data(table[d]);

/* write_data(table[flag/10]);

} write_data(table[flag%10]); */

////*********************************************************

void main() //主函数

{

LED=0; r=1; init(); while(1) // { if(k7==0) //分加 { if(p

//write_add(0x01,0x32); //**清除标志位 } //write_add(0x00,0x00);// 00 write_add(0x09,fen[p]);// 报警时间49分 write_add(0x0A,shi[d]); //报警时间22小时 write_add(0x01,0x12); //报警生效 display(); key_date(); read8563(); if((warming==0)) //到时间放音 { while(r) { isd_stopwrdn(); isd_powerup(); st_add=170;//送当前语音的起始地址 } else d=0; r=1; // write_add(0x01,0x10);// 00 key();

isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay 指令,从指定地址开始放音

}

} isd_play(); while(INT==1); //等待放音完毕的EOM 中断信号 isd_stop(); //放音完毕,发送stop 指令 //warming=1; r=0; } // DelayUs(5); write_add(0x01,0x08); //清除中断标志位。。 }

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3