基于89C52的带温度显示的多功能数字钟-总结报告_第1页
基于89C52的带温度显示的多功能数字钟-总结报告_第2页
基于89C52的带温度显示的多功能数字钟-总结报告_第3页
基于89C52的带温度显示的多功能数字钟-总结报告_第4页
基于89C52的带温度显示的多功能数字钟-总结报告_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 电子技术综合设计总结报告姓 名: 王丹 学 号:04101596 姓 名: 王硕 学 号:04101609 姓 名: 来航斐 学 号: 专业与班级: 信息 10-2 班 设计题目: 基于 89C52 的带温度显示的多功能数字钟 指导教师: 马草原 成 绩: 日 期: 第 页1目录1.前言.22.总体方案设计.22.1 设计方案 .22.2 方案比较 .23 系统器件的选择.33.1 温度传感器的选择.33.1.1 DS18B20 简单介绍:.33.1.2 DS18B20 内部结构.33.1.3 DS18B20 测温原理.43.2 DS1302 时钟芯片 .43.3 STC89C52 单片机芯

2、片 .53.4 液晶显示 LCD1602.54 软件设计与仿真.64.1 软件设计流程.64.2.1 温度采集流程.74.2.2 日期数据处理流程.74.3 PROTEUS仿真实验.85.PROTEL 电路原理图、PCB 板.95.1 原理图设计系统.95.2 印制电路板设计系统 .105.3 实物图.116系统调试.117总结与体会.128.参考文献.139.附录.131所需原件列表:.132程序:.14 第 页21.前言本次设计要达到的目的是:具有时间显示和手动校对功能,24 小时制;具有年、月、日显示和手动校对功能;具有显示当前星期的功能;具有环境温度采集功能;掉电后无需重新设置时间和日

3、期;系统不但接口设计简单、便于控制,而且具有很好的人机界面,可以对当前的时间进行调整。2.总体方案设计2.1 设计方案方案一:利用 QuartusII 软件设计一个数字钟,对设计电路进行功能仿真,并下载SOPC 实验系统中,可以完成 00:00:00 到 23:59:59 的计时功能,并在控制电路的作用下具有保持、清零、快速校时、快速校分、整点报时等功能。能进行正常的时、分、秒计时功能;锁死功能-锁死状态下时钟保持不变;清零功能-时钟计时电路和万年历电路;闹表功能-定时精确到分,闹钟设计响一分钟,可关闭。 方案二:采用单片机 STC89C52RC 芯片以及相关的芯片来实现多功能的数字钟。该设计

4、选用一线制温度计 DS18B20 作为温度传感器,实时时钟芯片 DS1302 提供当前日期和时间数据,并将实时的日期和温度数据在字符型液晶显示器 LCD1602 上显示出来。可以通过几个按键对当前的时间进行调整,对闹钟进行随意设置。其原理框图如下图 2.2所示图 2.2 数字钟原理框图2.2 方案比较我们可以看到,方案一使用的基于 Altera 公司出品 QuartusII 软件以及相应的实验平台完成的多功能数字计时器,由于时钟的计时范围是 00:00:00-23:59:59,所以我们需要设计模六十和模二十四的计数器组成时钟计时电路。校分、校时、清零电路需要输入一些控制信号给时钟计时电路,当然

5、这些控制信号是由开关提供的。要串行通信接口电路LCD1602液晶显示键盘控制电路ds1302时钟电路供电电路发音电路STC89C52 单片机温度采集电压转换电路 第 页3实现整点报时功能,一个报时控制电路是必不可少的。万年历电路需要由计时电路提供计时脉冲,脉冲输送给一个由模 30、模 12、模 100 级联而成计时电路。整个过程不仅涉及到的分频计数器较多,还要用到大量的开关控制显得相当复杂且容易出错。而方案二是采用最近几年比较普遍的 STC89C52RC 单片机芯片实现。基于 STC 公司的ST89C52 单片机,使用 Dallas 的一线制数字温度计 DS18B20 作为温度传感器,实时时钟

6、芯片 DS1302 提供当前日期和时间数据,并将实时的日期和温度数据字符型液晶显示器 LCD1602 上显示。之所以选择这个芯片,是因为 STC 单片机降低成本,提升性能,原有程序直接使用,硬件无需改动。并且其抗干扰性强,加密性强,超低功耗,可以远程升级,内部有专用复位电路,价格也较便宜,一般的利用 STC 系列的单片机芯片加上一些外围的供电电路,复位电路,下载电路,特定功能电路等就能实现特定的功能。由于这些特点使得 STC 系列单片机的应用日趋广泛。所以本设计方案选用方案二。3 系统器件的选择3.1 温度传感器的选择 由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,需要比

7、较多的外部元件支持,且硬件电路复杂,制作成本相对较高。这里采用 DALLAS 公司的数字温度传感器 DS18B20 作为测温元件。3.1.1 DS18B20 简单介绍:DALLAS 最新单线数字温度传感器 DS18B20 是一种新型的“一线器件” ,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS 半导体公司的数字化温度传感器 DS18B20 是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55+125 摄氏度,可编程为 9 位12 位转换精度,测温分辨率可达 0.0625 摄氏度,分辨率设定参数以及用户设定的报警温度存储在 EEPROM 中,掉电后依然保存。

8、被测温度用符号扩展的 16 位数字量方式串行输出;其工作电源既可以在远端引入,也可以采用寄生电源方式产生;多个 DS18B20 可以并联到 3 根或 2 根线上,CPU 只需一根端口线就能与诸多 DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。3.1.2 DS18B20 内部结构DS18B20 内部结构主要由四部分组成:64 位光刻 ROM、温度传感器、非挥发的温度报警触发器 TH 和 TL、配置寄存器。DS18B20 温度传感器主要用于对温度进行测量,数据可用 16 位符号

9、扩展的二进制补码读数形式提供,并以 0.0625LSB 形式表示。表 1 是部分温度值对应的二进制温度表示数据。 第 页4表 1 部分温度值3.1.3 DS18B20 测温原理 在正常测温情况下,DS1820 的测温分辨力为 0.5,可采用下述方法获得高分辨率的温度测量结果:首先用 DS1820 提供的读暂存器指令(BEH)读出以 0.5为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB) ,得到所测实际温度的整数部分 Tz,然后再用 BEH 指令取计数器 1 的计数剩余值 Cs 和每度计数值 CD。考虑到DS1820 测量温度的整数部分以 0.25、0.75为进位界限的关系,实际

10、温度 Ts 可用下式计算:Ts=(Tz-0.25)+(CD-Cs)/CD3.2 DS1302 时钟芯片DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加 31字节静态 RAM,采用 SPI 三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和 RAM 数据。实时时钟可提供秒、分、时、日、星期、月、年,一个月小于 31 天时可自动进行调整,且具有闰年补偿功能。工作电压宽达 2.55.5V。采用双电源供电(主电源和备用电源) ,可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力,因此广泛应用于测量系统中。DS1302 是由 D

11、S1202 改进而来的,增加了以下的特性:双电源管脚用于主电源和备份电源供应,Vcc1 为课编程涓流充电电源,附加七个字节存储器。它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域。其外部引脚分配如图所示:引脚号引脚名称功能1Vcc2主电源2,3X1,X2震荡源,外接 32.768kHz 晶振4GND地线5RST复位/片选线 第 页56I/O串行数据输入/输出端(双向)7SCLK串行数据输入端8Vcc1后备电源3.3 STC89C52 单片机芯片STC89C52 是 STC 公司生产的低电压,高性能 CMOS8 位单片机,片内含 4kbytes 的可反复擦写的只读程序存储器(P

12、EROM)和 128bytes 的随机存取数据存储器(RAM) ,器件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系统,片内置通用 8 位中央处理器(CPU)和 Flash 存储单元,可灵活应用于各种控制领域。其主要功能有:与 MCS-51 产品指令系统完全兼容;4k 字节可重擦写 Flash 闪速存储器;1000 次擦写周期;全静态操作:0Hz24MHz;三级加密程序存储器;1288 字节内部RAM;32 个可编程 IO 口线;2 个 16 位定时计数器;6 个中断源;可编程串行 UART通道;低功耗空闲和掉电模式。其引脚图如下图所示:图 3.6 STC

13、89C52 引脚图3.4 液晶显示 LCD1602HS1602 是目前最常用的字符液晶之一。具有 162 能够显示所有英文大小写字母,0 到 9 十个数字以及一些常用的符号。该液晶在 4.5V 到 5.5V 电压范围内都能正确工作,平均工作电流为 2mA。液晶 HS162 共 16 个管脚.RS 为寄存器选择信号,RW 为读写选择信号,通过这两种信号的不同组合可对液晶进行读写命令和读写数据的操作。1602 液晶模块内部的字符发生存储器(CGROM)已经存储了 160 个 HS162 是目前最常用的字符 第 页6液晶之一。具有 162 能够显示所有英文大小写字母,0 不同的点阵字符图形,这些字符

14、有:阿拉伯数字、英文字母的大小写、常用的符号等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是 01000001B(41H) ,显示时模块把地址 41H中的点阵字符图形显示出来,我们就能看到字母“A” 。在操作液晶时,先要对液晶进行初始化,即进行最初是的命令设置。要设置液晶的工作方式设置,显示状态设置,输入方式设置等。最后再向液晶写入数据,即写入想要显示字符的 ASCII 码。4 软件设计与仿真本设计软件仿真部分用的是仿真软件 PROTUES。它不仅具有其它 EDA 工具软件的仿真功能,还能仿真单片机及外围器件。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师

15、、致力于单片机开发应用的科技工作者的青睐,是目前世界上唯一将电路仿真软件、 PCB 设计软件和虚拟模型仿真软件三合一的设计平台。 4.1 软件设计流程本次设计的系统软件设计主要包括主程序设计和温度采集子模块程序设计、日历日期数据子模块程序、按键控制子模块程序和 LCD 液晶显示子模块程序设计等。主程序主要完成器件的初始化,并判断有无按键按下,并根据判断的结果调用相应的子模块程序;而温度采集子模块程序和日历日期数据子模块程序完成相应的数据采集、处理和保存,按键处理子模块程序完成日期和闹钟的设置,而液晶显示子模块只要把上述子模块储存的数据送去显示即可。系统总的流程图如下图所示: 开始日历日期数据处

16、理温度数据处理液晶显示按键扫描按键按下按键控制初始化N Y 时间日期的修改 第 页7图 4.1 主程序流程4.2.1 温度采集流程DS18B20 在进行温度采集时,必须首先进行初始化,然后发 ROM 操作指令,再发存储器操作指令,最后才能传输数据。每次对器件进行读写操作时, 必须严格按照 DS18B20 的时序要求。因为温度数据在 DS18B20 中是以 2 的补码形式存放的,且低 4 位为小数部分, 4 位到 10 位为整数部分,其余为符号位,因此在读出 2 个字节的温度数据后,首先求一次补码得到原码,再将数据分离为整数温度值和小数温度值,整数部分的值可通过数据交换指令得到,而小数温度值部分

17、可通过查表得到。因为在液晶显示器上显示的是字符的 ASCII 码,因而还要转换为 BCD,在加 30H 转换为 ASC码。其流程图如下所示:图 4.3 温度采集流程4.2.2 日期数据处理流程对时钟芯片的操作主要包括 2 个方面:一是将芯片中的日期等数据读出来,二是在进行日期等设置时将设置的数据写入芯片,这也是按键处理时的主要内容。无论是读数据还是写数据,都要满足 DS1302 对时序的要求。而对芯片各个数据部分的访问是通过地址进行的,且读和写的地址不一样。读出的数据同样要转为 ASC II 码,然后储存起来,等待送去显示。其流程图如下图所示:读温度数据初始化求原码温度数据的整数和小数处理转为

18、 ASCII 码送去显示 第 页8图 4.4 日期数据处理4.3 proteus 仿真实验应用 protues 仿真软件先找好所需原件,然后按照设计好的电路图连接线路,之后在单片机里考入写好的程序,进行仿真。仿真图如下所示:时钟电路:测温电路:初始化读日期数据数据处理将设置的数据写入芯片转为 ASCII送去显示 第 页9显示电路:仿真结果: 第 页105.PROTEL 电路原理图、PCB 板5.1 原理图设计系统Protel 99 SE 是一个易于使用的具有大量元件库的原理图编辑器,主要用于原理图的设计。它可以为印制电路板设计提供网络表。该编辑器除了具有强大的原理图编辑功能以外,其分层组织设计

19、功能、设计同步器、丰富的电气设计检验功能及强大而完善的打印输出功能,使用户可以轻松完成所需的设计任务。5.2 印制电路板设计系统 它是一个功能强大的印制电路板设计编辑器,具有非常专业的交互式布线及元件布局的特点,用于印制电路板(PCB)的设计并最终产生 PCB 文件,直接关系到印制电路板的生产。包含一个具有专业水准的 PCB 信号完整性分析工具、功能强大的打印管理系统、一个先进的 PCB 三维视图预览工具。 第 页115.3 实物图 第 页126系统调试单片机系统调试之前首先应该确认电源电压是否正常。用万用表测量接地引脚跟电 第 页13源引脚之间的电压,看是否是电源电压,常用的 5V。接下来就

20、是检查复位引脚电压是否正常。分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。显示电路的调试:在这里主要是 1602 液晶显示器。检查它与单片机的连线:设计是 RS 接的 P3.7 口,要保证它为高电平。EN 接口接单片机的 P3.5 端,也要保证它为高电平;读写信号低电平有效;编写一段显示程序,烧录到单片机看是否能正常显示。DS1302 电路调试:该电路包含 DS1302 芯片,主电源、备用电源、晶振等部分。在与单片机连接的过程中需要注意以下几点:1.清楚 DS1302 与单片机连接的管脚,本设计定义为:DS1302 的 SCLK 连接 P3.2,I/O 口连接 P3.3,RST 连接

21、 P3.4;2.注意电源正负极的连接;3. DS1302 接 32.768KHZ 的晶振,该晶振体型比较小,在焊接时要小心,同时也要尽量使晶振离 DS1302 是 X1、X2 引脚近距离焊接。4.编写 DS1302 的时钟程序看是否能够正确显示时间。按键电路调试:按键电路比较简单,故调试起来也很容易。如果确保按键焊接正确,只需把 DS1302 的程序写进单片机,再按下设置键,如果在秒的位置有光标出现,则说明可用。按下上(下)调键,如果日的位置有加(减)的操作,则上(下)调按键可用。 温度传感器的调试:温度传感器的调试只需在确保电路焊接正确的情况下,把显示温度的程序写进单片机,然后看液晶显示器上

22、显示的温度是否是当前的室温,如果能够正确显示当前室温,那么说明电路一切完好。7总结与体会为了做好这个电子综合设计,我们三个人早早的就组好队开始动手做。但过程比较曲折,遇到了不少困难,还好最后终于把实物做出来了,挺有成就感的。下面总结一下我们的设计过程:1本次设计在刚开始调试的时候,由于没有经验,感觉无从下手。于是我们三个人分工上网查资料,就在这查的过程中,我们对电子设计有了自己的认识和理解,大概了解了一个数字钟的设计过程。之后我们把自己搜索的资料汇总在一起,开始进行软件的仿真。2用 protues 进行仿真时,开始什么都不会,都是上网一点一点查每个原件的名称,边查边学。就这样,我们学会了 pr

23、otues 软件的基本使用方法。3仿真图连出来后就需要程序了,这是一个难点。由于底子薄,基础差,我们基本上是从零学起单片机的 C 语言编程。在网上下了别人写好的程序,一点一点看。慢慢的有一些懂了,就试着去改,改完了放到自己的电路图上,不能用就接着改。到最后,一些简单的程序我们也都会编了。4仿真做好后开始做实物。去电子市场买好原件,焊电路。为了保证准确性,我们每焊完一根线就用万用表测量看接通了没有,相邻的管脚也用万用表测量以免短路, 第 页14有些管脚处要接三四根线我们三个人互相配合一人拿根导线由一个人焊,焊好后把程序考到单片机里,结果显示屏什么都不显示。我们就开始查故障,改程序。发现原来仿真和

24、实物有着不小的区别,仿真能做出来,实物不一定就能出来。例如与显示屏连接的 10k 欧的滑动变阻器要去掉,有些芯片的管脚在原理图上找不到我们就到网上查到这个芯片的每个管脚的用途以及接法然后接上。有些虽然看似很小的问题,但检错起来一点都不容易,需要反复的分析,不断的试验。就这样不断的试验,再修改,在试验,直到程序完全正确,可以显示出我们想要的答案为止。这次的多功能电子钟的显示通过不断的修改和调试,最终达到了我们想要的效果。它能够正常显示时间、日期、星期和温度。但是对于调整时间的功能,那三个功能键总是时灵时不灵的,我们检查了硬件和软件都没能发现故障在那里,没能解决这个问题也是这次电子综合设计实验的一

25、个遗憾。通过本次设计,我们对单片机有了更深刻的认识,也从实践的例子中去感受到了单片机设计给我们设计带来的改变与进步。我们不仅掌握 Keil uVision2 和 protues软件的使用,与此同时,我们还对电子设计的思路有了更多的认识。这次对多功能数字钟的设计与制作,让我了解设计电路的程序,也了解了关于多功能数字钟的原理与设计理念。在此次的多功能数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和具体的使用方法。总之是受益匪浅。这为自己今后进一步深化学习,积累了一定宝贵经验,撰写设计的过程也是专业知识的学习过程,它使我运用已有的专业知识,对其进行设计,分析和解决问题,把知识转

26、化为能力的训练。8.参考文献1电子技术综合设计教程 ,袁小平,机械工业出版社;2MCS-51 系列单片机实用接口技术 ,李华北,北京航空航天大学出版社;3 彭小军.用单片机实现电子钟J.新余高专学报,2004 年 4 月第 9 卷第 2 期;4 Proteus 教程:电子线路设计制版与仿真,朱清慧,清华大学出版社, 2011 第 2版; 9.附录1所需原件列表:元件规格数量单片机STC89C521排阻10k1 第 页15LCDLMO1601电阻10k1030PF2电容1uF3开关按键开关4电池盒四节1万能板15*9cm112MHZ1晶振32K1导线2m2焊锡较好1电池5 号4温度传感器DS18

27、B201时钟芯片DS130212程序:DS18B20 子程序:sbit DQ = P20; / 定义 DQ 引脚为 P2.0/* 延时函数 */void DS18_delay(int useconds) 第 页2int s;for (s=0; suseconds;s+);/* 复位函数 */unsigned char ow_reset(void) unsigned char presence;DQ = 0; / 将 DQ 线拉低DS18_delay(29);DQ = 1; / DQ 返回高电平DS18_delay(3); / 等待存在脉冲presence = DQ; / 获得存在信号DS18_

28、delay(25); / 等待时间隙结束return(presence); / 返回存在信号,0 = 器件存在, 1 = 无器件/* 位写入函数 */void write_bit(char bitval) DQ = 0; / 将 DQ 拉低开始写时间隙if(bitval=1) DQ =1; / 如果写 1,DQ 返回高电平DS18_delay(5); / 在时间隙内保持电平值,DQ = 1;/* 字节写入函数 */void ds18write_byte(char val) unsigned char i;unsigned char temp;for (i=0; ii; temp &= 0 x0

29、1; write_bit(temp); 第 页3DS18_delay(5);/* 位读取函数 */unsigned char read_bit(void) unsigned char i;DQ = 0; /将 DQ 拉低开始读时间隙DQ = 1; / then return highfor (i=0; i3; i+); / 延时 15sreturn(DQ); / 返回 DQ 线上的电平值/* 字节读取函数 */unsigned char DSread_byte(void) unsigned char i;unsigned char value = 0;for (i=0;i8;i+) / 读取字

30、节,每次读取一个字节if(read_bit() value|=0 x01i; / 然后将其左移DS18_delay(6); return(value);/* 读取温度函数 */unsigned int ReadTemperature(void) unsigned char get10;unsigned char temp_lsb,temp_msb;unsigned int t;unsigned char k;ow_reset(); 第 页4ds18write_byte(0 xCC); / 跳过 ROMds18write_byte(0 x44); / 启动温度转换DS18_delay(5);ow

31、_reset();ds18write_byte(0 xCC); / 跳过 ROMds18write_byte(0 xBE); / 读暂存器for (k=0;k2;k+)getk=DSread_byte();temp_msb = get1; / Sign byte + lsbittemp_lsb = get0; / Temp data plus lsbt=temp_msb*256+temp_lsb;t=t&0 x0ff0;if(t0 xf0)t=(-1)*t;return t4;主程序:#include#includeDS18B20_3.H#define uint unsigned int#de

32、fine uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;/flag 用于读取头文件中的温度值,和显示温度值#define yh 0 x80 /LCD 第一行的初始位置#define er 0 x80+0 x40 /LCD 第二行初始位置/液晶屏的与 C51 之间的引脚连接定义(显示数据线接 C51 的 P0 口)sbit rs=P37;sbit en=P35;sbit rw=P36;sbit led=P26; /LCD 背光开关 第 页5/DS1302 时钟芯片与 C51 之间的引脚连接定义sb

33、it IO=P33;sbit SCLK=P32;sbit RST=P34;sbit ACC0=ACC0;sbit ACC7=ACC7;/校时按键与 C51 的引脚连接定义sbit key1=P22; /设置键sbit key2=P24; /加键sbit key3=P25; /减键sbit buzzer=P21;/蜂鸣器uchar code tab1=20 - - ; /年显示的固定字符uchar code tab2= : : ;/时间显示的固定字符/延时函数void delay(uint xms)/延时函数,有参函数uint x,y;for(x=xms;x0;x-) for(y=120;y0;

34、y-);write_1602com(uchar com)/*液晶写入指令函数*rs=0;/数据/指令选择置为指令rw=0; /读写选择置为写P0=com;/送入数据delay(1);en=1;/拉高使能端,为制造有效的下降沿做准备delay(1);en=0;/en 由高变低,产生下降沿,液晶执行命令 第 页6write_1602dat(uchar dat)/*液晶写入数据函数*rs=1;/数据/指令选择置为数据rw=0; /读写选择置为写P0=dat;/送入数据delay(1);en=1; /en 置高电平,为制造下降沿做准备delay(1);en=0; /en 由高变低,产生下降沿,液晶执行

35、命令lcd_init()/*液晶初始化函数*write_1602com(0 x38);/设置液晶工作模式write_1602com(0 x0c);/开显示不显示光标write_1602com(0 x06);/整屏不移动,光标自动右移write_1602com(0 x01);/清显示write_1602com(yh+1);/日历显示固定符号从第一行第 1 个位置之后开始显示for(a=0;a14;a+)write_1602dat(tab1a);/向液晶屏写日历显示的固定符号部分write_1602com(er+2);/时间显示固定符号写入位置,从第 2 个位置后开始显示for(a=0;a0;a-

36、)IO=ACC0;SCLK=1;SCLK=0;ACC=ACC1;uchar read_byte()/读一个字节/RST=1;for(a=8;a0;a-) ACC=ACC1;ACC7=IO;SCLK=1;SCLK=0;return (ACC);/-void write_1302(uchar add,uchar dat)/向 1302 芯片写函数RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0; 第 页8uchar read_1302(uchar add)/从 1302 读数据函数uchar temp;RST=0;SCL

37、K=0;RST=1;write_byte(add|0 x01);temp=read_byte();SCLK=1;RST=0;return(temp);uchar BCD_Decimal(uchar bcd)/BCD 码转十进制函数,输入 BCD,返回十进制 uchar Decimal; Decimal=bcd4; return(Decimal=Decimal*10+(bcd&=0 x0F);void ds1302_init() /1302 芯片初始化子函数RST=0;SCLK=0;write_1302(0 x8e,0 x00); /允许写,禁止写保护 write_1302(0 x80,0 x0

38、0); /向 DS1302 内写秒寄存器 80H 写入初始秒数据 00write_1302(0 x82,0 x00);/向 DS1302 内写分寄存器 82H 写入初始分数据 00write_1302(0 x84,0 x12);/向 DS1302 内写小时寄存器 84H 写入初始小时数据 12write_1302(0 x8a,0 x05);/向 DS1302 内写周寄存器 8aH 写入初始周数据 5write_1302(0 x86,0 x07);/向 DS1302 内写日期寄存器 86H 写入初始日期数据 07write_1302(0 x88,0 x01);/向 DS1302 内写月份寄存器

39、88H 写入初始月份数据 01write_1302(0 x8c,0 x11);/向 DS1302 内写年份寄存器 8cH 写入初始年份数据 11write_1302(0 x8e,0 x80); /打开写保护/温度显示子函数void write_temp(uchar add,uchar dat)/向 LCD 写温度数据,并指定显示位置 第 页9uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(er+add);/er 是头文件规定的值 0 x80+0 x40write_1602dat(0 x30+sw);/数字+30 得到该数字

40、的 LCD1602 显示码write_1602dat(0 x30+gw);/数字+30 得到该数字的 LCD1602 显示码 write_1602dat(0 xdf);/显示温度的小圆圈符号 write_1602dat(0 x43);/显示C符号/时分秒显示子函数void write_sfm(uchar add,uchar dat)/向 LCD 写时分秒uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(er+add);/er 是头文件规定的值 0 x80+0 x40write_1602dat(0 x30+sw);/数字+30

41、 得到该数字的 LCD1602 显示码write_1602dat(0 x30+gw);/数字+30 得到该数字的 LCD1602 显示码/年月日显示子函数void write_nyr(uchar add,uchar dat)/向 LCD 写年月日uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(yh+add);/设定显示位置为第一个位置+addwrite_1602dat(0 x30+sw);/数字+30 得到该数字的 LCD1602 显示码write_1602dat(0 x30+gw);/数字+30 得到该数字的 LCD16

42、02 显示码void write_week(uchar week)/写星期函数write_1602com(yh+0 x0c);/星期字符的显示位置switch(week) 第 页10case 1:write_1602dat(M);/星期数为 1 时,显示 write_1602dat(O); write_1602dat(N); break;case 2:write_1602dat(T);/星期数据为 2 时显示 write_1602dat(U); write_1602dat(E); break;case 3:write_1602dat(W);/星期数据为 3 时显示 write_1602dat(

43、E); write_1602dat(D); break;case 4:write_1602dat(T);/星期数据为 4 是显示 write_1602dat(H); write_1602dat(U); break;case 5:write_1602dat(F);/星期数据为 5 时显示 write_1602dat(R); write_1602dat(I); break;case 6:write_1602dat(S);/星期数据为 6 时显示 write_1602dat(T); write_1602dat(A); break;case 7:write_1602dat(S);/星期数据为 7 时显

44、示 write_1602dat(U); write_1602dat(N); break;/*键盘扫描有关函数*void keyscan()key1=1; 第 页11if(key1=0)/ key1 为功能键(设置键)delay(10); if(key1=0) buzzer=1;/蜂鸣器短响一次 delay(20); buzzer=0;while(!key1);key1n+;if(key1n=9)key1n=1;/设置按键共有秒、分、时、星期、日、月、年、返回,8 个功能循环switch(key1n)case 1: TR0=0;/关闭定时器/TR1=0;write_1602com(er+9);/

45、设置按键按动一次,秒位置显示光标 write_1602com(0 x0f);/设置光标为闪烁 temp=(miao)/10*16+(miao)%10;/秒数据写入 DS1302 write_1302(0 x8e,0 x00); write_1302(0 x80,0 x80|temp); write_1302(0 x8e,0 x80); break;case 2: write_1602com(er+6);/按 2 次 fen 位置显示光标break;case 3: write_1602com(er+3);/按动 3 次,shibreak;case 4: write_1602com(yh+0 x0

46、e);/按动 4 次,weekbreak;case 5: write_1602com(yh+0 x0a);/按动 5 次,ribreak;case 6: write_1602com(yh+0 x07);/按动 6 次,yuebreak;case 7: write_1602com(yh+0 x04);/按动 7 次,nian 第 页12break;case 8:write_1602com(0 x0c);/按动到第 8 次,设置光标不闪烁TR0=1;/打开定时器 temp=(miao)/10*16+(miao)%10; write_1302(0 x8e,0 x00); write_1302(0 x

47、80,0 x00|temp);/miao 数据写入 DS1302 write_1302(0 x8e,0 x80); break;/加键 key2if(key1n!=0) key2=1;if(key2=0) /上调键delay(10);if(key2=0) buzzer=1;/蜂鸣器短响一次 delay(20); buzzer=0;while(!key2);switch(key1n)case 1:miao+;/设置键按动 1 次,调秒if(miao=60)miao=0;/秒超过 59,再加 1,就归零write_sfm(0 x08,miao); temp=(miao)/10*16+(miao)%

48、10;/十进制转换成 DS1302 要求的 DCB 码 write_1302(0 x8e,0 x00); /允许写,禁止写保护 write_1302(0 x80,0 x80|temp); 第 页13 write_1302(0 x8e,0 x80); /打开写保护write_1602com(er+0 x09); break;case 2:fen+;if(fen=60)fen=0;write_sfm(0 x05,fen);/令 LCD 在正确位置显示加设定好的分数据temp=(fen)/10*16+(fen)%10;/十进制转换成 DS1302 要求的 DCB 码 write_1302(0 x8e

49、,0 x00);/允许写,禁止写保护 write_1302(0 x82,temp); write_1302(0 x8e,0 x80);/打开写保护write_1602com(er+6); break;case 3:shi+;if(shi=24)shi=0;write_sfm(2,shi);/令 LCD 在正确的位置显示加设定好的小时数据temp=(shi)/10*16+(shi)%10;/十进制转换成 DS1302 要求的 DCB 码 write_1302(0 x8e,0 x00);/允许写,禁止写保护 write_1302(0 x84,temp); write_1302(0 x8e,0 x8

50、0);/打开写保护write_1602com(er+3); break;case 4:week+;if(week=8)week=1; write_1602com(yh+0 x0C);/指定加后的周数据显示位置write_week(week);/指定周数据显示内容 temp=(week)/10*16+(week)%10; write_1302(0 x8e,0 x00);/允许写,禁止写保护 write_1302(0 x8a,temp); write_1302(0 x8e,0 x80);/打开写保护write_1602com(yh+0 x0e); break; 第 页14case 5:ri+;if

51、(ri=32)ri=1;write_nyr(9,ri);/令 LCD 在正确的位置显示加设定好的日期数据temp=(ri)/10*16+(ri)%10;/十进制转换成 DS1302 要求的 DCB 码 write_1302(0 x8e,0 x00);/允许写,禁止写保护 write_1302(0 x86,temp); write_1302(0 x8e,0 x80);/打开写保护write_1602com(yh+10); break;case 6:yue+;if(yue=13)yue=1;write_nyr(6,yue);/令 LCD 在正确的位置显示加设定好的月份数据temp=(yue)/10

52、*16+(yue)%10;/十进制转换成 DS1302 要求的 DCB 码 write_1302(0 x8e,0 x00);/允许写,禁止写保护 write_1302(0 x88,temp); write_1302(0 x8e,0 x80);/打开写保护write_1602com(yh+7); break;case 7:nian+; if(nian=100)nian=0;write_nyr(3,nian);/令 LCD 在正确的位置显示加设定好的年份数据 temp=(nian)/10*16+(nian)%10;/十进制转换成 DS1302 要求的 DCB 码 write_1302(0 x8e,

53、0 x00);/允许写,禁止写保护 write_1302(0 x8c,temp); write_1302(0 x8e,0 x80);/打开写保护write_1602com(yh+4); break;/减键 key3 第 页15key3=1;if(key3=0)delay(10); if(key3=0) buzzer=1;/蜂鸣器短响一次 delay(20); buzzer=0;while(!key3);switch(key1n)case 1:miao-;if(miao=-1)miao=59;write_sfm(0 x08,miao); temp=(miao)/10*16+(miao)%10; write_1302(0 x8e,0 x00); write_1302(0 x80,temp); write_1302(0 x8e,0 x80); write_1602com(er+0 x09); /write_1602com(0 x0b);break;case 2:fen-;if(fen=-1)fen=59;write_sfm(5,fen);temp=(fen)/10*16+(fen)%10; write_1302(0 x8e,0 x00); write_1302(0 x82,temp);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论