资源描述
目 录
第一部分 设计任务与调研 1
1、 设计任务 1
1.1设计内容与结构 1
1.2方案比较与选择 1
1.2.1 系统方案选择 1
第二部分设计说明 3
1 系统硬件电路 3
2 单片机电路 3
2.1单片机最小系统电路 3
图2-1最小单片机系统电路 4
3.1 时钟电路 4
3.1.1 DS1307简介 4
3.2 时钟电路设计 6
3.3 按键电路 6
3.4 显示电路 7
3.5 打铃电路 8
4系统软件设计 9
4.1 软件设计流程图 9
4.2 读取DS1307时间程序设计 9
4.3显示程序设计 11
4.4 按键设定程序设计 13
第三部分设计成果 14
1、 主电路图 14
见附录一 14
2、 源程序 14
见附录二 14
3、实物 14
第四部分总结 16
第五部分致谢 17
第六部分参考文献 18
附录 19
附录一:电路图 19
附录二:源程序 20
I
第一部分 设计任务与调研
1、 设计任务
设计一个能够实现上下班的自动打铃模拟系统,熟悉单片机的控制功用和系统原理应用。对系统设计与实用编程有进一步强化。了解设计产品的要求和产品工作要求、分析电路流程、分析电路设计程序流程、分析转换开关的工作原理、绘制电路图编译测试电路程序、测试电路程序工作是否正常、完善测试电路程序。
1.1设计内容与结构
本设计是以AT89S51单片机为核心的一款自动打铃系统,以时钟芯片来实现计时功能,然后单片机负责将时间送入显示电路显示,整个系统不是很复杂,其设计主要包括单片机控制模块、时钟电路和显示电路三个模块的设计,在设计前本人在学校图书馆看了很多关于单片机方面的书,也在网上查了不少资料,也查阅过跟此设计相似的论文或者期刊,得到了不少启发和经验,对本人的设计工作有很大的帮助,能很好的把握设计的整体方向和细节,设计的结构如下:
一、系统的设计方案,根据系统所要实现的功能,确定设计的基本方案。
二、系统的硬件设计,主要介绍了硬件的电路图,各模块电路的设计,硬件元器件的结构,特点,引脚功能等。
三、系统软件部分的设计,主要是对系统的主程序的结构图和流程图的解说。
四、系统的调试,主要是介绍下系统硬件和软件调试过程中的问题和解决方案,还有调试步骤的细节问题的说明。
1.2方案比较与选择
1.2.1 系统方案选择
方案一:采用数字电路来搭建,利用555时基电路构成振荡器产生100Hz频率的振荡电路,再通过分频器得到1Hz频率,即产生1秒计时时间,显示部分通过锁存器和驱动芯片将计时时间送入数码管显示。设计框图如图2-1所示。这种方案电路结构比较复杂,芯片使用比较多,灵活性不高,而且准确度不够精确,不利于系统的扩展。而且这种电路中需要使用独立式的数码管,每一个数码管都需要连接一个数据锁存器和数码管驱动芯片,连接线比较多,制作的过程中很容易出错。
NE555
时基电路
分频器
100Hz信号
数据
锁存器
1Hz信号
数码管驱动
数码管显示
图2-1 方案一设计框图
方案二:采用AT89S51单片机作为系统控制单元,通过时钟芯片来实现计时功能,单片机负责将时间送入显示电路显示。设计框图如图2-2所示。这种方案电路设计简单,时间精确,使用方便。而且单片机的强大功能使得系统方便扩展,有利于提高智能性。
时钟芯片
秒计时
单片机
液晶显示器显示
计时时间
图2-2 方案二设计框图
本设计系统框图如图2-3所示。系统以AT89S51单片机为控制器,通过DS1307来为系统提供标准时间,单片机读取DS1307时间后送液晶显示器显示,通过按键来设置打铃时间。当打铃时间到时,系统实现蜂鸣器和LED灯声光提示。系统设计框图如下:
时钟电路
按键设定打铃时间
单片机控制
显示电路
打铃电路
第二部分设计说明
1 系统硬件电路
根据系统设计框图,本设计硬件电路主要由时钟电路、按键设定电路、单片机电路、显示电路和打铃电路组成,电路原理图见附录一所示。
系统工作原理:系统时间由时钟芯片DS1307来提供,单片机通过P3口读取了DS1307的时间数据后,经过处理得到时间显示模式的时钟数据,并通过P2口送液晶显示器显示出来。再通过扫描P1口是否有按键按下,有按键按下时,通过液晶显示器显示来设置定时时间、打铃时间间隔,通过设定、移位、加数来实现。当到达打铃时间时,单片机引脚启动蜂鸣器和LED灯电路工作以声光形式实现打铃功能。
2 单片机电路
2.1单片机最小系统电路
单片机最小系统由晶振电路和复位电路组成。电路如图2-1 2-2所示。
晶振电路用于产生单片机工作时所需要的时钟信号,单片机的指令必须在时钟信号下按照时序执行。晶振电路通常用两种设计方式:内部振荡方式和外部振荡方式。内部振荡方式是在单片机的XTAL1和XTAL2引脚外接一个晶体振荡器,与单片机内部的振荡器组成时钟信号;外部振荡方式是在外部将已有的脉冲信号引入单片机内,一般用于使单片机的时钟与外部信号保持同步。本设计选用内部振荡方式,在XTAL1和XTAL2引脚之间连接一个12MHz的晶振,再分别外接30p的对地电容。
单片机在启动时需要复位,使系统各器件处于初始状态。复位引脚为RST,当系统上电后晶振电路稳定后,RST引脚有一个高电平且持续2个机器周期以上,单片机系统就可以实现复位功能。复位一般有手动复位和上电复位功能。手动复位是在RST引脚设置按键,当按键按下时,RST引脚会有高电平,即可实现复位功能;上电复位是在RST引脚连接一个电解电容接至电源,再接一个电阻接地,系统上电时,电容充电,只要电源的上升时间不超过1ms,就可以实现复位功能。本设计选用按键复位。
图2-1最小单片机系统电路
图2-2 单片机最小系统电路
3.1 时钟电路
3.1.1 DS1307简介
DS1307是I2C总线接口的日历时钟芯片,片内有8个特殊寄存器和56字节的非易失性RAM,是一种低功耗、BCD码的8引脚实时时钟芯片。它的主要特点:
可对秒、时、分、每月的天数、月份、每周的天数进行计数,并具有闰年补偿功能,记年上线为2100年;
56字节非易失性RAM;
两线串行接口;
可编程方波输出;
自动掉电检测和切换电路;
在电池备份模式下,功耗小于50nA;
工业级工作温度:-40℃-80℃;
8引脚DIP和SOIC封装。
DS1307的引脚排列如图3-1所示,引脚说明如下:
X1、X2:接入32.768kHz的石英晶振;
VBAT:+3V电源输入;
GND:地;
SDA:数据线,输入输出数据,需要外接上拉电阻;
SCL:时钟线,用来同步数据;
SQW/OUT:方波信号输出端,可输出供选择的频率方波,1Hz、4 KHz、8K Hz、32K Hz,需外接上拉电阻。VCC:+5V电源;
图3-1 DS1307引脚图
3.2.2 时钟电路设计
时钟电路如图3-2所示。时钟芯片的SCL引脚和SDA引脚分别由单片机的P3.1和P3.2引脚控制,单片机只需按照DS1307的工作时序来控制DS1307即可实现时间的写入和读取,其中DS1307的时钟端与数据端需外接上拉电阻,本设计选用5针排阻来充当上拉电阻。
图3-2时钟电路
3.3 按键电路
键盘是单片机应用中常用的一种输入器件,键盘的按键有触点式和非触点式之分,按接口原理有编码键盘和非编码键盘之分。编码键盘主要用硬件来实现对按键的识别,非编码键盘是由软件来实现键盘的定义与识别。常用的按键一般为触点式按键,根据按键所连接的单片机引脚的电平高低来判断其是否按下。按功能分,键盘有独立按键和矩阵按键之分,独立按键每一路按键就占用单片机的一个控制引脚,单片机直接获取其信息;矩阵按键将按键排成由行和列组成的行列式,通过确认按键的行号和列号来确定每一路按键,利用少的单片机引脚控制更多的按键。
本设计中按键电路如图3-3所示,由单片机的P1口控制按键电路。本设计中按键用于设定定时时间、打铃时间间隔,所以只需4路按键即可实现所需功能,采用独立式按键即可。由于按键是机械式触点,所以在断开或闭合时,一般都有抖动产生,虽然这个抖动时间在我们看来非常短,但是单片机执行指令的速度为微秒级别,很容易会读取这个时间而将其判断为真正的工作状态,从而引起误判。因此,在设计中必须考虑到按键抖动的影响。常用的去抖动的方法有两种:硬件方法和软件方法。硬件方法一般是加电容或者RS触发器;软件方法是在单片机在检测引脚所连接的按键的工作状态时加一个延时程序再次确认,通过2次的确认就可以确保按键的工作状态不受机械抖动的影响了。
图3-3 按键电路
3.4 显示电路
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,背光源负极。
本设计中显示电路如图3-4所示。单片机的P2口作为LCD1602的数据线端口,P3口控制LCD1602的使能端。单片机读取数据后,通过控制LCD1602的读写端、复位端和使能端将其设置为写入数据状态,再将数据通过P2口送入LCD1602实现显示功能。
3-4 显示电路图
3.5 打铃电路
打铃电路一般用声音或音乐作为提醒,本设计选用蜂鸣器和LED灯实现声光双重打铃功能,电路如图3-5所示。打铃时间到时,单片机P3.3引脚置高,三极管9013导通,继而蜂鸣器和LED灯导通,实现蜂鸣和灯亮打铃功能。
图3-5 打铃电路
4系统软件设计
4.1 软件设计流程图
系统软件设计流程图如图4-1所示。
图4-1 软件设计流程图
程序设计过程:首先要定义单片机的引脚,然后初始化器件,再利用DS1307的读写时序读取时间数据。再利用按键进入时间设定状态,设定完时间后单片机通过比较时间是否到达设定的时间来确定是否到打铃时间,如果达到打铃时间,则控制蜂鸣器响LED灯亮。
4.2 读取DS1307时间程序设计
DS1307中的时间寄存器地址编码为00H-07H,而具有掉电保护的RAM寄存器的地址编码为08H-3FH。当地址指针指向RAM的最后一个地址3FH时,若进行多字节操作,则地址指针将会复位而指向00H,这样原来存在00H的数据将会丢失。DS1307的各类时间数据均以BCD码的格式存储在相应的时间寄存器中,具体分配如表4-1所示:
表4-1 DS1307寄存器分配
00H
01H
02H
03H
04H
05H
06H
07H
秒
分
小时
星期
日期
月
年
控制字
单片机通过读取DS1307相应的寄存器字节,可以获取时钟和日历信息。时钟和日历信息以BCD码的形式存放在寄存器中,寄存器0的第7位为时钟停止位,振荡器停止工作。由于在初次上电时,所有寄存器的状态是不确定的,所以在初始化时必须将寄存器0中的第7位设为0。
DS1307可运行在12/24小时模式下,并由时间控制器中的相应位来进行控制。根据小时寄存器的第6位是0还是1,置为1时,是工作于12小时模式下,此时,小时寄存器的第5位为AM/PM标志。在24小时模式中,小时寄存器的第5位和第4位共同组成小时的十位数。时钟模块设计流程:单片机按如下顺序将数据写入到DS1307 寄存器或内部RAM 中:
1、START 信号
2、写SLA+W(0xd0)字节,DS1307 应答(ACK);
3、写1 字节内存地址(在以下第四步写入的第一字节将存入到DS1307 内该地址处,DS1307应答);
4、写数据(可写多个字节,每一字节写入后DS1307 内部地址计数器加一,DS1307 应答);
5、STOP 信号
单片机读取DS1307子程序流程图如图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控制指令表
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存储器地址
0
0
0
1
字符发生存储器地址
8
置数据存储器地址
0
0
1
显示数据存储器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
向CGRAM或DDRAM写数
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
LCD1602内部自带有80×8位的RAM缓冲区,RAM地址映射如表4-3所示。
00
01
02
03
04
05
06
07
08
09
40
41
42
43
44
45
46
47
48
49
0A
0B
0C
0D
0E
0F
10
……
27
4A
4B
4C
4D
4E
4F
50
……
67
表4-3 LCD1602的RAM地址映射表
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 单片机控制按键子程序流程图
第三部分设计成果
1、 主电路图
见附录一
2、 源程序
见附录二
3、实物
制作调试过程中所用仪器有:数字万用表、电烙铁,焊锡丝、焊锡膏、剥线钳、尖嘴钳、圆口钳、镊子,吸锡器等,另外准备尽量多的导线。
制作与调试过程如下:
1、按照元器件清单准备好所需要用到的元器件。
2、按照电路原理图焊接硬件电路板,先焊接芯片的底座,再焊接其外围电路。实物电路图如图5-1所示:
图5-1 实物电路图
3、编译软件程序,将生成的.hex文件烧写入单片机内。
4、给系统上电,液晶显示器显示时间,利用按键,可设置定时时间和打铃时间间隔。
图5-2 时间显示
5、当定时时间到时,蜂鸣器响,LED灯亮。
6、每隔设置的打铃时间间隔,蜂鸣器响,LED灯亮,实现打铃功能。
经上述调试,系统工作正常,实现设计要求的功能。
第四部分总结
经过这段时间的努力,毕业设计也接近了尾声。本文从选题目的及意义开始,介绍了系统的方案设计,其中提供了两种设计方案,经过互相之间的比较后选择了简单易行的一种方案,后面还列出了其他两种模块的设计方案,并经比较后选择了合适的方案,然后对系统的硬件设计进行了阐述,包括电路图和元器件的介绍,对它们实现的功能和内部结构都进行了说明,接着是软件部分的设计,这也是此设计的关键部分,有很详细的说明。
本设计是针对学校的作息时间而设计的一种自动打铃系统,但是它同样可以用于其他的场所,如工厂,生厂车间等等,它能很好的起到时钟提醒的作用,方便了人们的日常生活。在硬件设计部分,显示器件选的是液晶显示器,它具有功耗和工作电压低的特点,而且它的显示质量高,可视面积大,能很好的达到设计要求,还降低了软件的编程难度。
本设计的自动打铃系统还存在不足和缺点,主要表现在这些方面:虽然系统能够很好的实现打铃的要求,但是能够设定的打铃时间只有六个,这是因为想降低编程时的难度,在不影响其功能的前提下,降低了要求;还有就是其扩展性不强,后续的发展比较困难,制约了系统的升级,在商品竞争中没什么优势,需要进一步的研究和开发。
通过此次毕业设计,我对所学专业的知识有了很好的回顾和实践,提高了自己的动手和思考能力,这对我自身的发展有很大的帮助,同时在此期间我查阅了很多的书籍和资料,从中学到了很多课本上没有的知识,拓展了自己的知识面,如果没有前期的准备工作是没法很好的完成此次设计的,所以多学、多看、多想、多动手才是学好知识的必要素质,这对我未来的发展和进步有着至关重要的作用。
第五部分致谢
回顾这次毕业设计的过程,感慨良多,收获颇丰,首先要感谢我的导师。在这段时间里老师经常给提醒我们在做毕业设计过程中应当注意的事项,并在百忙之中特地抽出时间为我们讲课,讲解论文的排版及写作技巧,使我们受益不浅,还不忘督促我们按步骤完成每一项内容,可以说从毕业设计的开始到完成都能看见老师的身影,没有老师的辛勤辅导和对学生的责任心就没有我现在这样一篇毕业论文。同时我还要感谢大学四年所有教导过我的老师,是他们的谆谆教诲给了我大学四年的专业知识,在学习的道路上,他们就是我的领路人,真的非常感谢,还要感谢陪伴了我四年的每一个同学,因为他们,我的大学才不苍白,因为他们,我的大学才精彩,也是因为他们,我的大学才有意义。
毕业设计告一段落了,但是我的人生却迎来了另一个出发点,毕业并不意味着结束,它同时是一个新的开始,我会带着老师们的希冀,朋友们的祝福和友谊走得更远、更高、更坚定,谢谢你们
第六部分参考文献
[1]曾屹,刘辉.单片机原理与应用.—长沙:中南大学出版社,2009.5:244—263.
[2]刘传玺,毕训银,袁照平.传感器与检测技术.—北京:机械工业出版社,2011.8:30—169.
[3]刘文涛.单片机应用开发实列.—北京:清华大学出版社,2005.9:276—303.
[4]刘建辉,冀常鹏.单片机智能控制技术.—北京:国防工业出版社,2007.4:199—265.
[5]康华庚.电子技术基础.模拟部分:华中科技大学电子技术课程组编.—5版.—北京:高等教育出版社,2006.1(2011.11重印).
[6]康华庚.电子技术基础.数字部分:华中科技大学电子技术课程组编.—5版.—北京:高等教育出版社,2006.1(2011.11重印).
[7]周立功等.51单片机新技术[M].北京:北京航空航天大学出版社,2003:11-16.
[8]邱关源,罗先觉.电路.—5版.—北京:高等教育出版社,2006.5(2011.12重印).
[9]杨立.微型计算机原理与接口技术.—北京:中国水利水电出版社,2005(2008重印).
[10]赵文博,刘文涛.单片机语言C51程序设计[M].北京:人民邮电出版社,2005:1-10.
附录
附录一:电路图
附录二:源程序
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_EN=P3^5;
sbit LCD_RS=P3^7;
sbit LCD_RW=P3^6;
sbit sda=P1^2;
sbit sclk=P1^1;
sbit FMQ=P3^4;
#define LCD_DATA 1
#define LCD_COMMAND 0
#define LCD_PORT P2
uchar DISP_up[16];
uchar DISP_dw[16];
uchar LCD_NO;
uchar TBA[]={"0123456789"};
uchar temp5,count_1,temp6;
uchar D1307[3];
uchar flag;
uchar time_tab[24];
uchar t_count;
uchar key_board_t;
uchar key_count;
uchar save_data[8];
uchar opt_time;
void delay(uint tt)
uchar i;
for(;tt>0;tt--)
for(i=0;i<10;i++);
bit LCD_BUSY()
bit result;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
_nop_();
result=(bit)(LCD_PORT&0x80);
LCD_EN=0;
return result;
void LCD_Write(uchar dat,uchar type)
uchar i;
while((LCD_BUSY()&&i<100)){i++;}
if(i>99)LCD_NO=1;
LCD_RS=type;
LCD_RW=0;
LCD_EN=0;
void LCD_INITIALIZE()
LCD_Write(0x06,LCD_COMMAND);
LCD_Write(0x38,LCD_COMMAND);
LCD_Write(0x0c,LCD_COMMAND);
void LCD_Prints(uchar *dat,uchar add,uchar lens)
uchar i;
LCD_Write(add|0x80,LCD_COMMAND);
for(i=0;i<lens;i++)
LCD_Write(dat[i],LCD_DATA);
void INIT_DISP_up(void)
DISP_dw[11]=TBA[save_data[5]];
DISP_dw[12]=':';
DISP_dw[13]=TBA[save_data[6]];
DISP_dw[14]=TBA[save_data[7]];
DISP_dw[15]=' ';
void write_temp(uchar add,uchar dat)//向LCD写温度数据,并指定显示位置
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er是头文件规定的值0x80+0x40
write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码 write_1602dat(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码 }
时分秒显示子函数
void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er是头文件规定的值0x80+0x40
write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
年月日显示子函数
void write_nyr(uchar add,uchar dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数 {
uchar gw,sw;
gw=dat%10;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(yh+add);//设定显示位置为第一个位置+add
write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
void write_week(uchar week)//写星期函数
write_1602com(yh+0x0c);//星期字符的显示位置
switch(week)
case 1:write_1602dat('M');//星期数为1时显示
write_1602dat('O');
write_1602dat('N');
case 2:write_1602dat('T');//星期数据为2时显示
write_1602dat('U');
write_1602dat('E');
case 3:write_1602dat('W');//星期数据为3时显示
write_1602dat('E');
write_1602dat('D');
case 4:write_1602dat('T');//星期数据为4是显示
write_1602dat('H');
write_1602dat('U');
case 5:write_1602dat('F');//星期数据为5时显示
write_1602dat('R');
write_1602dat('I');
case 6:write_1602dat('S');//星期数据为6时显示
write_1602dat('T');
write_1602dat('A');
case 7:write_1602dat('S');//星期数据为7时显示
write_1602dat('U');
write_1602dat('N');
//****************键盘扫描有关函数**********************
void keyscan()
if(key1==0)//---------------key1为功能键(设置键)--------------------
delay(9);//延时,用于消抖动
if(key1==0)//延时后再次确认按键按下
buzzer=0;//蜂鸣器短响一次
delay(20);
buzzer=1;
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环
switch(key1n)
case 1: TR0=0;//关闭定时器 //
TR1=0;
write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标
write_1602com(0x0f);//设置光标为闪烁
temp=(miao)/10*16+(miao)%10;//秒数据写入
DS1302 write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80); break;
case 2: write_1602com(er+6);//按2次fen位置显示光标 //
write_1602com(0x0f);
case 3: write_1602com(er+3);//按动3次,shi //
write_1602com(0x0f);
case 4: write_1602com(yh+0x0e);//按动4次,week //
write_1602com(0x0f);
case 5: write_1602com(yh+0x0a);//按动5次,ri //
write_1602com(0x0f);
case 6: write_1602com(yh+0x07);//按动6次,yue //
write_1602com(0x0f);
case 7: write_1602com(yh+0x04);//按动7次,nian //
write_1602com(0x0f);
case 8: write_1602com(0x0c);//按动到第8次,设置光标不闪烁
TR0=1;//打开定时器
void init() //定时器、计数器设置函数
TMOD=0x11; //指定定时/计数器的工作方式为3
TH0=0; //定时器T0的高四位=0
TL0=0; //定时器T0的低四位=0
EA=1; //系统允许有开放的中断
ET0=1; //允许T0中断 TR0=1; //开启中断,启动定时器
//*******************主函数**************************//
void main()
lcd_init(); //调用液晶屏初始化子函数
ds1302_init(); //调用DS1302时钟的初始化子函数
init(); //调用定时计数器的设置子函数
led=0; //打开LCD的背光电源
buzzer=0;//蜂鸣器长响一次
while(1) //无限循环下面的语句:
keyscan(); //调用键盘扫描子函数
void timer0() interrupt 1 //取得并显示日历和时间
Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中
flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示
//读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
//显示温度、秒、时、分数据:
write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示
write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数) write_sfm(5,fen);//分,从第二行第5个字符后开始显示
write_sfm(2,shi);//小时,从第二行第2个字符后开始显示
//显示日、月、年数据:
write_nyr(9,ri);//日期,从第二行第9个字符后开始显示
write_nyr(6,yue);//月份,从第二行第6个字符后开始显示
write_nyr(3,nian);//年,从第二行第3个字符后开始显示
write_week(week);
25
展开阅读全文