版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 电子技术综合设计 总结报告 姓 名: 王丹 学 号:04101596 姓 名: 王硕 学 号:04101609 姓 名: 来航斐 学 号: 专业与班级: 信息 10-2 班 设计题目: 基于 89C52 的带温度显示的多功能数字钟 指导教师: 马草原 成 绩: 日 期: 第 页 1 目录 1.前言.2 2.总体方案设计.2 2.1 设计方案 .2 2.2 方案比较 .2 3 系统器件的选择.3 3.1 温度传感器的选择.3 3.1.1 DS18B20 简单介绍:.3 3.1.2 DS18B20 内部结构.3 3.1.3 DS18B20 测温原理.4 3.2 DS1302 时钟芯片 .4 3.
2、3 STC89C52 单片机芯片 .5 3.4 液晶显示 LCD1602.5 4 软件设计与仿真.6 4.1 软件设计流程.6 4.2.1 温度采集流程.7 4.2.2 日期数据处理流程.7 4.3 PROTEUS仿真实验.8 5.PROTEL 电路原理图、PCB 板.9 5.1 原理图设计系统.9 5.2 印制电路板设计系统 .10 5.3 实物图.11 6系统调试.11 7总结与体会.12 8.参考文献.13 9.附录.13 1所需原件列表:.13 2程序:.14 第 页 2 1.前言 本次设计要达到的目的是:具有时间显示和手动校对功能,24 小时制;具有年、 月、日显示和手动校对功能;具
3、有显示当前星期的功能;具有环境温度采集功能;掉 电后无需重新设置时间和日期;系统不但接口设计简单、便于控制,而且具有很好的 人机界面,可以对当前的时间进行调整。 2.总体方案设计 2.1 设计方案 方案一:利用 QuartusII 软件设计一个数字钟,对设计电路进行功能仿真,并下载 SOPC 实验系统中,可以完成 00:00:00 到 23:59:59 的计时功能,并在控制电路的作用 下具有保持、清零、快速校时、快速校分、整点报时等功能。能进行正常的时、分、 秒计时功能;锁死功能-锁死状态下时钟保持不变;清零功能-时钟计时电路和万年 历电路;闹表功能-定时精确到分,闹钟设计响一分钟,可关闭。
4、方案二:采用单片机 STC89C52RC 芯片以及相关的芯片来实现多功能的数字钟。该 设计选用一线制温度计 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 级联而成计时电路。整个过程不 仅涉及到的分频计数器较多,还要用到大量的开关控制显得相当复杂且容易出错。而 方案二是采用最近几年比较普遍的 STC89C52
6、RC 单片机芯片实现。基于 STC 公司的 ST89C52 单片机,使用 Dallas 的一线制数字温度计 DS18B20 作为温度传感器,实时时 钟芯片 DS1302 提供当前日期和时间数据,并将实时的日期和温度数据字符型液晶显示 器 LCD1602 上显示。之所以选择这个芯片,是因为 STC 单片机降低成本,提升性能, 原有程序直接使用,硬件无需改动。并且其抗干扰性强,加密性强,超低功耗,可以远程 升级,内部有专用复位电路,价格也较便宜,一般的利用 STC 系列的单片机芯片加上一些 外围的供电电路,复位电路,下载电路,特定功能电路等就能实现特定的功能。由于 这些特点使得 STC 系列单片机
7、的应用日趋广泛。所以本设计方案选用方案二。 3 系统器件的选择 3.1 温度传感器的选择 由于传统的热敏电阻等测温元件测出的一般都是电压,再转换成对应的温度,需 要比较多的外部元件支持,且硬件电路复杂,制作成本相对较高。这里采用 DALLAS 公 司的数字温度传感器 DS18B20 作为测温元件。 3.1.1 DS18B20 简单介绍: DALLAS 最新单线数字温度传感器 DS18B20 是一种新型的“一线器件” ,其体积更 小、更适用于多种场合、且适用电压更宽、更经济。DALLAS 半导体公司的数字化温度 传感器 DS18B20 是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围
8、 为-55+125 摄氏度,可编程为 9 位12 位转换精度,测温分辨率可达 0.0625 摄氏 度,分辨率设定参数以及用户设定的报警温度存储在 EEPROM 中,掉电后依然保存。被 测温度用符号扩展的 16 位数字量方式串行输出;其工作电源既可以在远端引入,也可 以采用寄生电源方式产生;多个 DS18B20 可以并联到 3 根或 2 根线上,CPU 只需一根 端口线就能与诸多 DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻 辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多 这样的数字温度计,十分方便。 3.1.2 DS18B20 内部结构 DS1
9、8B20 内部结构主要由四部分组成:64 位光刻 ROM、温度传感器、非挥发的温度 报警触发器 TH 和 TL、配置寄存器。 DS18B20 温度传感器主要用于对温度进行测量,数据可用 16 位符号扩展的二进制 补码读数形式提供,并以 0.0625LSB 形式表示。表 1 是部分温度值对应的二进制 温度表示数据。 第 页 4 表 1 部分温度值 3.1.3 DS18B20 测温原理 在正常测温情况下,DS1820 的测温分辨力为 0.5,可采用下述方法获得高分辨 率的温度测量结果:首先用 DS1820 提供的读暂存器指令(BEH)读出以 0.5为分辨率 的温度测量结果,然后切去测量结果中的最低
10、有效位(LSB) ,得到所测实际温度的整 数部分 Tz,然后再用 BEH 指令取计数器 1 的计数剩余值 Cs 和每度计数值 CD。考虑到 DS1820 测量温度的整数部分以 0.25、0.75为进位界限的关系,实际温度 Ts 可用 下式计算: Ts=(Tz-0.25)+(CD-Cs)/CD 3.2 DS1302 时钟芯片 DS1302 是美国 DALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加 31 字节静态 RAM,采用 SPI 三线接口与 CPU 进行同步通信,并可采用突发方式一次传送多 个字节的时钟信号和 RAM 数据。实时时钟可提供秒、分、时、日、星期、月、年,一 个月小
11、于 31 天时可自动进行调整,且具有闰年补偿功能。工作电压宽达 2.55.5V。采 用双电源供电(主电源和备用电源) ,可设置备用电源充电方式,提供了对后背电源进 行涓细电流充电的能力,因此广泛应用于测量系统中。DS1302 是由 DS1202 改进而来的, 增加了以下的特性:双电源管脚用于主电源和备份电源供应,Vcc1 为课编程涓流充电 电源,附加七个字节存储器。它广泛应用于电话、传真、便携式仪器以及电池供电的 仪器仪表等产品领域。其外部引脚分配如图所示: 引脚号引脚名称功能 1Vcc2主电源 2,3X1,X2震荡源,外接 32.768kHz 晶振 4GND地线 5RST复位/片选线 第 页
12、 5 6I/O串行数据输入/输出端(双向) 7SCLK串行数据输入端 8Vcc1后备电源 3.3 STC89C52 单片机芯片 STC89C52 是 STC 公司生产的低电压,高性能 CMOS8 位单片机,片内含 4kbytes 的 可反复擦写的只读程序存储器(PEROM)和 128bytes 的随机存取数据存储器(RAM) , 器件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系统, 片内置通用 8 位中央处理器(CPU)和 Flash 存储单元,可灵活应用于各种控制领域。 其主要功能有:与 MCS-51 产品指令系统完全兼容;4k 字节可重擦写 Flas
13、h 闪速存储器; 1000 次擦写周期;全静态操作:0Hz24MHz;三级加密程序存储器;1288 字节内部 RAM;32 个可编程 IO 口线;2 个 16 位定时计数器;6 个中断源;可编程串行 UART 通道;低功耗空闲和掉电模式。其引脚图如下图所示: 图 3.6 STC89C52 引脚图 3.4 液晶显示 LCD1602 HS1602 是目前最常用的字符液晶之一。具有 162 能够显示所有英文大小写字母, 0 到 9 十个数字以及一些常用的符号。该液晶在 4.5V 到 5.5V 电压范围内都能正确工作, 平均工作电流为 2mA。液晶 HS162 共 16 个管脚.RS 为寄存器选择信号
14、,RW 为读写选择 信号,通过这两种信号的不同组合可对液晶进行读写命令和读写数据的操作。1602 液 晶模块内部的字符发生存储器(CGROM)已经存储了 160 个 HS162 是目前最常用的字符 第 页 6 液晶之一。具有 162 能够显示所有英文大小写字母,0 不同的点阵字符图形,这些字 符有:阿拉伯数字、英文字母的大小写、常用的符号等,每一个字符都有一个固定的 代码,比如大写的英文字母“A”的代码是 01000001B(41H) ,显示时模块把地址 41H 中的点阵字符图形显示出来,我们就能看到字母“A” 。在操作液晶时,先要对液晶进 行初始化,即进行最初是的命令设置。要设置液晶的工作方
15、式设置,显示状态设置, 输入方式设置等。最后再向液晶写入数据,即写入想要显示字符的 ASCII 码。 4 软件设计与仿真 本设计软件仿真部分用的是仿真软件 PROTUES。它不仅具有其它 EDA 工具软件的 仿真功能,还能仿真单片机及外围器件。虽然目前国内推广刚起步,但已受到单片 机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐, 是目前世界上唯一将电路仿真软件、 PCB 设计软件和虚拟模型仿真软件三合一的设 计平台。 4.1 软件设计流程 本次设计的系统软件设计主要包括主程序设计和温度采集子模块程序设计、日历日 期数据子模块程序、按键控制子模块程序和 LCD 液晶显示子
16、模块程序设计等。主程序 主要完成器件的初始化,并判断有无按键按下,并根据判断的结果调用相应的子模块程 序;而温度采集子模块程序和日历日期数据子模块程序完成相应的数据采集、处理和 保存,按键处理子模块程序完成日期和闹钟的设置,而液晶显示子模块只要把上述子模 块储存的数据送去显示即可。系统总的流程图如下图所示: 开始 日历日期数据处理 温度数据处理 液晶显示 按键扫描 按键按下 按键控制 初始化 N Y 时间日期的修改 第 页 7 图 4.1 主程序流程 4.2.1 温度采集流程 DS18B20 在进行温度采集时,必须首先进行初始化,然后发 ROM 操作指令,再发存储 器操作指令,最后才能传输数据
17、。每次对器件进行读写操作时, 必须严格按照 DS18B20 的时序要求。因为温度数据在 DS18B20 中是以 2 的补码形式存放的,且低 4 位为小数部 分, 4 位到 10 位为整数部分,其余为符号位,因此在读出 2 个字节的温度数据后,首先求 一次补码得到原码,再将数据分离为整数温度值和小数温度值,整数部分的值可通过数 据交换指令得到,而小数温度值部分可通过查表得到。因为在液晶显示器上显示的是字 符的 ASCII 码,因而还要转换为 BCD,在加 30H 转换为 ASC码。其流程图如下所示: 图 4.3 温度采集流程 4.2.2 日期数据处理流程 对时钟芯片的操作主要包括 2 个方面:一
18、是将芯片中的日期等数据读出来,二是在进 行日期等设置时将设置的数据写入芯片,这也是按键处理时的主要内容。无论是读数据 还是写数据,都要满足 DS1302 对时序的要求。而对芯片各个数据部分的访问是通过地 址进行的,且读和写的地址不一样。读出的数据同样要转为 ASC II 码,然后储存起来, 等待送去显示。其流程图如下图所示: 读温度数据 初始化 求原码 温度数据的整数和小数处理 转为 ASCII 码 送去显示 第 页 8 图 4.4 日期数据处理 4.3 proteus 仿真实验 应用 protues 仿真软件先找好所需原件,然后按照设计好的电路图连接线路,之 后在单片机里考入写好的程序,进行
19、仿真。仿真图如下所示: 时钟电路: 测温电路: 初始 化 读日期数据 数据处理 将设置的数据写入芯 片 转为 ASCII 送去显示 第 页 9 显示电路: 仿真结果: 第 页 10 5.PROTEL 电路原理图、PCB 板 5.1 原理图设计系统 Protel 99 SE 是一个易于使用的具有大量元件库的原理图编辑器,主要用于原理 图的设计。它可以为印制电路板设计提供网络表。该编辑器除了具有强大的原理图编 辑功能以外,其分层组织设计功能、设计同步器、丰富的电气设计检验功能及强大而 完善的打印输出功能,使用户可以轻松完成所需的设计任务。 5.2 印制电路板设计系统 它是一个功能强大的印制电路板设
20、计编辑器,具有非常专业的交互式布线及元件 布局的特点,用于印制电路板(PCB)的设计并最终产生 PCB 文件,直接关系到印制电 路板的生产。包含一个具有专业水准的 PCB 信号完整性分析工具、功能强大的打印管 理系统、一个先进的 PCB 三维视图预览工具。 第 页 11 5.3 实物图 第 页 12 6系统调试 单片机系统调试之前首先应该确认电源电压是否正常。用万用表测量接地引脚跟电 第 页 13 源引脚之间的电压,看是否是电源电压,常用的 5V。接下来就是检查复位引脚电压是 否正常。分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。 显示电路的调试:在这里主要是 1602 液晶显示器。
21、检查它与单片机的连线:设计 是 RS 接的 P3.7 口,要保证它为高电平。EN 接口接单片机的 P3.5 端,也要保证它为高 电平;读写信号低电平有效;编写一段显示程序,烧录到单片机看是否能正常显示。 DS1302 电路调试:该电路包含 DS1302 芯片,主电源、备用电源、晶振等部分。在 与单片机连接的过程中需要注意以下几点:1.清楚 DS1302 与单片机连接的管脚,本设 计定义为:DS1302 的 SCLK 连接 P3.2,I/O 口连接 P3.3,RST 连接 P3.4;2.注意电源正 负极的连接;3. DS1302 接 32.768KHZ 的晶振,该晶振体型比较小,在焊接时要小心,
22、 同时也要尽量使晶振离 DS1302 是 X1、X2 引脚近距离焊接。4.编写 DS1302 的时钟程序 看是否能够正确显示时间。 按键电路调试:按键电路比较简单,故调试起来也很容易。如果确保按键焊接正 确,只需把 DS1302 的程序写进单片机,再按下设置键,如果在秒的位置有光标出现, 则说明可用。按下上(下)调键,如果日的位置有加(减)的操作,则上(下)调按 键可用。 温度传感器的调试:温度传感器的调试只需在确保电路焊接正确的情况下,把显 示温度的程序写进单片机,然后看液晶显示器上显示的温度是否是当前的室温,如果 能够正确显示当前室温,那么说明电路一切完好。 7总结与体会 为了做好这个电子
23、综合设计,我们三个人早早的就组好队开始动手做。但过程比 较曲折,遇到了不少困难,还好最后终于把实物做出来了,挺有成就感的。下面总结 一下我们的设计过程: 1本次设计在刚开始调试的时候,由于没有经验,感觉无从下手。于是我们三个 人分工上网查资料,就在这查的过程中,我们对电子设计有了自己的认识和理解,大 概了解了一个数字钟的设计过程。之后我们把自己搜索的资料汇总在一起,开始进行 软件的仿真。 2用 protues 进行仿真时,开始什么都不会,都是上网一点一点查每个原件的名 称,边查边学。就这样,我们学会了 protues 软件的基本使用方法。 3仿真图连出来后就需要程序了,这是一个难点。由于底子薄
24、,基础差,我们基 本上是从零学起单片机的 C 语言编程。在网上下了别人写好的程序,一点一点看。慢 慢的有一些懂了,就试着去改,改完了放到自己的电路图上,不能用就接着改。到最 后,一些简单的程序我们也都会编了。 4仿真做好后开始做实物。去电子市场买好原件,焊电路。为了保证准确性,我 们每焊完一根线就用万用表测量看接通了没有,相邻的管脚也用万用表测量以免短路, 第 页 14 有些管脚处要接三四根线我们三个人互相配合一人拿根导线由一个人焊,焊好后把程 序考到单片机里,结果显示屏什么都不显示。我们就开始查故障,改程序。发现原来 仿真和实物有着不小的区别,仿真能做出来,实物不一定就能出来。例如与显示屏连
25、 接的 10k 欧的滑动变阻器要去掉,有些芯片的管脚在原理图上找不到我们就到网上查 到这个芯片的每个管脚的用途以及接法然后接上。有些虽然看似很小的问题,但检错 起来一点都不容易,需要反复的分析,不断的试验。就这样不断的试验,再修改,在 试验,直到程序完全正确,可以显示出我们想要的答案为止。 这次的多功能电子钟的显示通过不断的修改和调试,最终达到了我们想要的效果。 它能够正常显示时间、日期、星期和温度。但是对于调整时间的功能,那三个功能键 总是时灵时不灵的,我们检查了硬件和软件都没能发现故障在那里,没能解决这个问 题也是这次电子综合设计实验的一个遗憾。 通过本次设计,我们对单片机有了更深刻的认识
26、,也从实践的例子中去感受到了 单片机设计给我们设计带来的改变与进步。我们不仅掌握 Keil uVision2 和 protues 软件的使用,与此同时,我们还对电子设计的思路有了更多的认识。这次对多功能数 字钟的设计与制作,让我了解设计电路的程序,也了解了关于多功能数字钟的原理与 设计理念。在此次的多功能数字钟设计过程中,更进一步地熟悉了芯片的结构及掌握 了各芯片的工作原理和具体的使用方法。总之是受益匪浅。这为自己今后进一步深化 学习,积累了一定宝贵经验,撰写设计的过程也是专业知识的学习过程,它使我运用 已有的专业知识,对其进行设计,分析和解决问题,把知识转化为能力的训练。 8.参考文献 1电
27、子技术综合设计教程 ,袁小平,机械工业出版社; 2MCS-51 系列单片机实用接口技术 ,李华北,北京航空航天大学出版社; 3 彭小军.用单片机实现电子钟J.新余高专学报,2004 年 4 月第 9 卷第 2 期; 4 Proteus 教程:电子线路设计制版与仿真,朱清慧,清华大学出版社, 2011 第 2 版; 9.附录 1所需原件列表: 元件规格数量 单片机 STC89C521 排阻 10k1 第 页 15 LCDLMO1601 电阻 10k10 30PF2 电容 1uF3 开关按键开关 4 电池盒四节 1 万能板 15*9cm1 12MHZ1 晶振 32K1 导线 2m2 焊锡较好 1
28、电池5 号 4 温度传感器 DS18B201 时钟芯片 DS13021 2程序: DS18B20 子程序: sbit DQ = P20; / 定义 DQ 引脚为 P2.0 /* 延时函数 */ void DS18_delay(int useconds) 第 页 2 int 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); /
29、等待存在脉冲 presence = DQ; / 获得存在信号 DS18_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;
30、unsigned char temp; for (i=0; ii; temp write_bit(temp); 第 页 3 DS18_delay(5); /* 位读取函数 */ unsigned char read_bit(void) unsigned char i; DQ = 0; /将 DQ 拉低开始读时间隙 DQ = 1; / then return high for (i=0; i3; i+); / 延时 15s return(DQ); / 返回 DQ 线上的电平值 /* 字节读取函数 */ unsigned char DSread_byte(void) unsigned char i
31、; unsigned char value = 0; for (i=0;i8;i+) / 读取字节,每次读取一个字节 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(); 第 页 4 ds18write_byte(0 xCC
32、); / 跳过 ROM ds18write_byte(0 x44); / 启动温度转换 DS18_delay(5); ow_reset(); ds18write_byte(0 xCC); / 跳过 ROM ds18write_byte(0 xBE); / 读暂存器 for (k=0;k2;k+)getk=DSread_byte(); temp_msb = get1; / Sign byte + lsbit temp_lsb = get0; / Temp data plus lsb t=temp_msb*256+temp_lsb; t=t if(t0 xf0) t=(-1)*t; return
33、t4; 主程序: #include #includeDS18B20_3.H #define uint unsigned int #define uchar unsigned char uchar 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
34、=P35; sbit rw=P36; sbit led=P26; /LCD 背光开关 第 页 5 /DS1302 时钟芯片与 C51 之间的引脚连接定义 sbit 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=
35、 : : ;/时间显示的固定字符 /延时函数 void delay(uint xms)/延时函数,有参函数 uint x,y; for(x=xms;x0;x-) for(y=120;y0;y-); write_1602com(uchar com)/*液晶写入指令函数* rs=0;/数据/指令选择置为指令 rw=0; /读写选择置为写 P0=com;/送入数据 delay(1); en=1;/拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;/en 由高变低,产生下降沿,液晶执行命令 第 页 6 write_1602dat(uchar dat)/*液晶写入数据函数* rs=1;
36、/数据/指令选择置为数据 rw=0; /读写选择置为写 P0=dat;/送入数据 delay(1); en=1; /en 置高电平,为制造下降沿做准备 delay(1); en=0; /en 由高变低,产生下降沿,液晶执行命令 lcd_init()/*液晶初始化函数* write_1602com(0 x38);/设置液晶工作模式 write_1602com(0 x0c);/开显示不显示光标 write_1602com(0 x06);/整屏不移动,光标自动右移 write_1602com(0 x01);/清显示 write_1602com(yh+1);/日历显示固定符号从第一行第 1 个位置之后
37、开始显示 for(a=0;a14;a+) write_1602dat(tab1a);/向液晶屏写日历显示的固定符号部分 write_1602com(er+2);/时间显示固定符号写入位置,从第 2 个位置后开始显示 for(a=0;a0;a-) 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
38、 芯片写函数 RST=0; SCLK=0; RST=1; write_byte(add); write_byte(dat); SCLK=1; RST=0; 第 页 8 uchar read_1302(uchar add)/从 1302 读数据函数 uchar temp; RST=0; SCLK=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; Dec
39、imal=bcd4; return(Decimal=Decimal*10+(bcd void ds1302_init() /1302 芯片初始化子函数 RST=0; SCLK=0; write_1302(0 x8e,0 x00); /允许写,禁止写保护 write_1302(0 x80,0 x00); /向 DS1302 内写秒寄存器 80H 写入初始秒数据 00 write_1302(0 x82,0 x00);/向 DS1302 内写分寄存器 82H 写入初始分数据 00 write_1302(0 x84,0 x12);/向 DS1302 内写小时寄存器 84H 写入初始小时数据 12 wr
40、ite_1302(0 x8a,0 x05);/向 DS1302 内写周寄存器 8aH 写入初始周数据 5 write_1302(0 x86,0 x07);/向 DS1302 内写日期寄存器 86H 写入初始日期数据 07 write_1302(0 x88,0 x01);/向 DS1302 内写月份寄存器 88H 写入初始月份数据 01 write_1302(0 x8c,0 x11);/向 DS1302 内写年份寄存器 8cH 写入初始年份数据 11 write_1302(0 x8e,0 x80); /打开写保护 /温度显示子函数 void write_temp(uchar add,uchar
41、dat)/向 LCD 写温度数据,并指定显示位置 第 页 9 uchar gw,sw; gw=dat%10;/取得个位数字 sw=dat/10;/取得十位数字 write_1602com(er+add);/er 是头文件规定的值 0 x80+0 x40 write_1602dat(0 x30+sw);/数字+30 得到该数字的 LCD1602 显示码 write_1602dat(0 x30+gw);/数字+30 得到该数字的 LCD1602 显示码 write_1602dat(0 xdf);/显示温度的小圆圈符号 write_1602dat(0 x43);/显示C符号 /时分秒显示子函数 vo
42、id write_sfm(uchar add,uchar dat)/向 LCD 写时分秒 uchar gw,sw; gw=dat%10;/取得个位数字 sw=dat/10;/取得十位数字 write_1602com(er+add);/er 是头文件规定的值 0 x80+0 x40 write_1602dat(0 x30+sw);/数字+30 得到该数字的 LCD1602 显示码 write_1602dat(0 x30+gw);/数字+30 得到该数字的 LCD1602 显示码 /年月日显示子函数 void write_nyr(uchar add,uchar dat)/向 LCD 写年月日 uc
43、har gw,sw; gw=dat%10;/取得个位数字 sw=dat/10;/取得十位数字 write_1602com(yh+add);/设定显示位置为第一个位置+add write_1602dat(0 x30+sw);/数字+30 得到该数字的 LCD1602 显示码 write_1602dat(0 x30+gw);/数字+30 得到该数字的 LCD1602 显示码 void write_week(uchar week)/写星期函数 write_1602com(yh+0 x0c);/星期字符的显示位置 switch(week) 第 页 10 case 1:write_1602dat(M);
44、/星期数为 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(E); write_1602dat(D); break; case 4:write_1602dat(T);/星期数据为 4 是显示 write_1602dat(H); write_1602dat(U); break; case
45、 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 时显示 write_1602dat(U); write_1602dat(N); break; /*键盘扫描有关函数* void keyscan() key1=1; 第 页 11 if(key1=0)/ key1 为功能键(
46、设置键) 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);/设置按键按动一次,秒位置显示光标 write_1602com(0 x0f);/设置光标为闪烁 temp=(miao)/10*16+(miao)%10;/秒数据写入 DS1302 write_
47、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 次,shi break; case 4: write_1602com(yh+0 x0e);/按动 4 次,week break; case 5: write_1602com(yh+0 x0a);/按动 5 次,ri break; case 6: write_160
48、2com(yh+0 x07);/按动 6 次,yue break; case 7: write_1602com(yh+0 x04);/按动 7 次,nian 第 页 12 break; case 8: write_1602com(0 x0c);/按动到第 8 次,设置光标不闪烁 TR0=1;/打开定时器 temp=(miao)/10*16+(miao)%10; write_1302(0 x8e,0 x00); write_1302(0 x80,0 x00|temp);/miao 数据写入 DS1302 write_1302(0 x8e,0 x80); break; /加键 key2 if(ke
49、y1n!=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)%10;/十进制转换成 DS1302 要求的 DCB 码 write_1302(0 x8e,0 x00); /允许写,禁止写保护 writ
50、e_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,0 x00);/允许写,禁止写保护 write_1302(0 x82,temp); write_1302(0 x8e,0
51、 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 x80);/打开写保护 write_1602com(er+3); break; case 4:week+; if(
52、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; 第 页 14 case 5:ri+; if(ri=32) ri=1; write_nyr(9,ri);/令 LCD 在正确的位置显示加
53、设定好的日期数据 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*16+(yue)%10;/十进制转换成 DS1302 要求的 DCB 码
54、 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,0 x00);/允许写,禁止写保护 write_1302(0 x8
55、c,temp); write_1302(0 x8e,0 x80);/打开写保护 write_1602com(yh+4); break; /减键 key3 第 页 15 key3=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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026上半年北京市人民检察院所属事业单位招聘1人笔试模拟试题及答案解析
- 2026天津市机电工艺技师学院事业单位招聘4人(第一批)考试备考题库及答案解析
- 2026陕西久泰农旅文化发展有限公司招聘(10人)考试备考题库及答案解析
- 2026年河南省濮阳市濮阳县重点中学初三第三次联合模拟英语试题含解析
- 吉林省德惠市2026届初三2月第一次调研英语试题含解析
- 安阳市重点达标名校2025-2026学年初三年级第五次月考语文试题试卷含解析
- 忻州市重点中学2026届学业水平模拟考试英语试题含解析
- 上海市交大二附中2026届初三下学期期末练习数学试题含解析
- 内蒙古北京八中学乌兰察布分校2026年初三第三次(4月)联考语文试题含解析
- 上海市浦东新区第三教育署2025-2026学年初三下学期5月考试英语试题试卷含解析
- 2025秋季湖南能源集团社会招聘51人笔试历年参考题库附带答案详解
- 2026年及未来5年市场数据中国剧本杀行业市场调查研究及投资前景展望报告
- 3.1《数数、数的组成》课件 人教版数学一年级下册
- 2026年安庆医药高等专科学校单招综合素质考试题库附答案详解(a卷)
- 2026年安徽卫生健康职业学院单招综合素质考试题库带答案详解ab卷
- 23G409先张法预应力混凝土管桩
- 半命题作文指导-课件
- 2023年江苏海事职业技术学院单招考试面试模拟试题及答案解析
- 美世-宝钢国际职位评估系统
- MidasGen-无梁楼盖板设计操作例题
- 青啤Siebel CRM项目月度促销方案操作手册V10
评论
0/150
提交评论