1、摘 要在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每个人都受到时间的影响。为了更好的利用我们自己的时间,我们必须对时间有一个度量,因此产生了钟表。钟表的发展是非常迅速的,从刚开始的机械式钟表到现在普遍用到的数字式钟表,即使现在钟表千奇百怪,但是它们都只是完成一种功能计时功能,只是工作原理不同而已,在人们的使用过程中,逐渐发现了钟表的功能太单一,没有更大程度上的满足人们的需求。因此,数字电子时钟的出现成为必然。数字钟是采用数字电路实现对.时,分.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶
2、体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。在此设计中所设计的钟表不但具有普通钟表的功能,它还能实现多个额外的功能:温度测量、年,月,日,星期。关键词:单片机,电子时钟,DS1302,DS18B20 , LCD1602目录第一章 绪 论 1第二章 系统硬件电路设计 .3第 1 节 单片机
3、控制系统原理 .3第 2 节 模块电路设计与比较 .4一、 时钟方案选择 .4二、 温度检测方案选择 .4三、 显示模块的选择 .4四、 其他设计的考虑 .4第 3 节 各功能模块硬件设计及实现 .5一、 单片机控制系统 .5二、 DS1302 实时时钟芯片 .10三、 温度模块 14四、 1602 液晶显示器 .16第 4 节 电路总图 20第三章 系统程序设计 21第 1 节 主程序流程图 21第 2 节 中断服务程序 22第四章 程序 23第 1 节 系统程序设计 23第五章 总结 35第六章 参考文献 36第一章 绪 论本设计主要分为硬件电路设计和软件实现两大部分。硬件电路设计采用模块
4、设计:中央处理电路、时钟电路、温度测量电路三大部分;软件采用 C 语言编程实现,设计采用按功能模块划分,包括:主程序、显示程序、温度测量程序、时钟程序等。在中央处理器上我们采用 AT89S52 单片机,该单片机是集 CPU ,RAM ,ROM ,计数和多种接口于一体的微控制器。自 20 世纪 70 年代问世以来,以其极高的性能价格比,受到人们的重视和关注。它体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易,广泛应用于智能生产和工业自动化上。在时间功能上主要依靠实时时钟芯片 DS1302 来完成大部分功能,DS1302 是具有涓细电流充电能力的低功耗实时时钟
5、电路,它以其接口简单、价格低廉、使用方便,被广泛地采用。它的主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通 32.768kHz 晶振。所以用此款芯片来实现时间功能是完全能满足电路的要求。温度方面工作由数字式温度传感器 DS18B20 来完成,这款温度传感器是具有线路简单,体积小,方便易用等特点,温度测量范围为55125,可编程为 9 位12 位 A/D 转换精度,测温分辨率可达 0.0625,被测温度用符号扩展的16 位数字量方式串行输出。选用这个芯片使电路简化,提高了效率。本课题通过 MCS-51 单片机来设计,采用 C 语言进行编程,可以实
6、现以下一些功能:小时、分、秒和年、月、日的显示,定时报警功能。本设计的电子时钟系统由时钟电路,LCD 显示电路,定时报警电路,按键调整电路四部分组成。51单片机通过软件编程,在 LCD1602 液晶屏上实现小时、分、秒和年、月、日的显示;利用时钟芯片 DS1302 来实现计时,定时功能;通过两个按键开关,一个用于时钟的调节,一个用于闹钟的调节,来实现参数设置和调节功能;到达设置的闹钟时间时,由蜂鸣器发声,起报警作用。本次设计的电子时钟,经过对比测试,发现实际计时的走时精度较高,可满足多种场合的应用需求。本文详细介绍了 AT89S52 单片机的基本原理,分析了 AT89S52 各个管脚的功能及它
7、在设计电路中的作用。本文论述了 LCD1602 液晶屏和时钟芯片 DS1302的工作原理及其软件设计过程。第二章 系统硬件电路设计第 1 节 单片机控制系统原理方案一:采用 CPLD 可编程逻辑器件作为主控制器控制外围电路进行电压、频率测量,时钟控制、温度测量、键盘和 LED 控制、报警控制。此方案逻辑电路复杂,且灵活性较低,不利于各种功能的扩展,在测电压时将通过 A/D 测得的数值转化为电压有效值时有一定的困难。 方案二:采用 AT89S52 单片机来实现系统的控制。键盘四个独立按键控制,时钟芯片采用 DS1302,温度传感器采用 DS18B20。此系统硬件简洁,将复杂的硬件功能用软件实现,
8、因此系统控制灵活,能很好地满足本题的基本要求和扩展要求。此方案基本原理框图如图 2.1 所示。 比较以上两种方案的优缺点,方案二简洁、灵活、可扩展性好,能完全达到设计要求,故采用第二种方案。液晶显示部分DS18B20温度传感器部分AT89S52单片机DS1302实时时钟部分键盘输入部分图 2.1. 系统方框图第 2 节 模块电路设计与比较一、 时钟方案选择方案一:要求显示小时和分钟,因此可以用门电路组合构成时钟发生器,但此方案硬件复杂,稳定性低,且不易控制。 方案二:采用带 RAM 的时钟芯片 DS1302。该芯片可以进行时分秒的计数,具有 100 年日历,可编程接口,还具有报警功能和掉电保存
9、功能,并且可以对其方便的进行程序控制,能很好的符合要求。故采用方案二。二、 温度检测方案选择 方案一:采用热电偶或热敏电阻作感温元件,但热电偶需冷端补偿,电路设计复杂,热敏电阻虽然精度较高,但需要标准稳定电阻匹配才能使用,而且重复性、可靠性都比较差。 方案二:采用集成温度传感器 DS18B20 。该传感器结构简单,不需外接电路,数据传输采用 one-wire。总线,可用一根 I/O 数据线即供电又传输数据,在-10 -+85范围内精度为0.5,分辨率较高,重复性和可靠性好。故采用方案二。三、 显示模块的选择方案一:采用数码管显示。数码管亮度高、体积小、重量轻,但其显示信息简单、有限,在本题目中
10、应用受到很大的限制。 方案二:采用液晶显示。液晶显示功耗低,轻便防震。采用液晶显示界面友好清晰,操作方便,显示信息丰富。 四、 其他设计的考虑 闹铃响可采用蜂鸣器来模拟一些音乐,实现闹铃的效果。也可采用音乐模块来更简单,更实用的效果,在此本设计出于器件规模的考虑特采用蜂鸣器来模拟闹铃。第 3 节 各功能模块硬件设计及实现本设计以单片机 AT89S52 为控制核心,由实时时钟部分、显示部分、键盘输入部分、温度采集部分等部分组成。其中实时时钟采用 DS1302 可实现年月日时分秒等时间信息的采集和闹钟功能。温度检测模块由 DS18B20 集成温度传感器对现场环境温度进行实时检测。键盘采集部分由四个
11、独立按键组成,可实现时间显示、闹钟设置、环境温度测量等功能。硬件设计是整个系统的基础,要考虑的方方面面很多,除了实现此设计基本功能以外,主要还要考虑如下几个因素:系统稳定度;器件的通用性或易选购性; 软件编程的易实现性;系统其它功能及性能指标;因此硬件设计至关重要。现从各功能模块的实现逐个进行分析探讨。一、 单片机控制系统AT89S52 单片机AT89S52 是美国 ATMEL 公司生产的低电压,高性能的 CMOS8 位单片机片内 8Kbytes 的可反复擦写的只读程序存储器(PEROM)和 128bytes 的随机存储器(RAM) ,器件采用 ATMEL 公司的高密度、非易失存储技术生产,兼
12、容标准MCS-51 指令系统,片内置通用 8 位中央处理器(CPU)和 Flash 存储单元,功能强大。AT89S52 单片机可为你提供许多高性价的应用场合,可灵活的应用于各种控制领域。主要性能参数:与 MCS-51 产品指令系统的全兼容 4k 字节可重擦写 Flash 闪速存储器1000 次可擦写周期全静态操作:0Hz-24MHz三级加密程序存储器1288 字节内部 RAM 32 个可编程 I/O 口线2 个 16 位定时/计数器 5 个中断源 可编程串行 UART 通道低功耗空闲和掉电模式 AT89S52 功能特性描述: AT89S52 提供以下标准功能:4k 字节 Flash 闪速存储器
13、,128 字节内部RAM,32 个 I/O 口线,两个 16 位定时/计数器,一个 5 向量中断结构,一个全双工串行通信口, 片内震荡器及时钟电路。同时,AT89S52 可降至 0Hz 的静态逻辑操作,并支持两种软件的可选的节电工作模式。空闲方式停止 CPU 的工作,但允许 RAM,定时/ 计数器,窜行通信口及中断系统继续工作。掉电方式保存 RAM 中的内容,但震荡器停止工作并禁止所有部件工作直到下一个硬件复位。(1)AT89S52 引脚功能说明:Vcc:电源电压GND:地P0 口:PO 口是一组 8 位漏极开路行双向 I/O 口,也既地址 /数据总线复用口。可作为输出口使用时,每位可吸收电流
14、的方式驱动 8 个 TTL 逻辑电路,对端口写“1”可作为高阻抗输入输入端用。在访问外部数据存储器时,这组口线分时转换地址(低 8 位)和数据总线复用,在访问期间激活内部上拉电阻。在 Flash 编程时,PO 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求接上拉电阻。P1 口:P1 口是一个内部上拉电阻的 8 位双向 I/O 口,P1 的输入缓冲级可驱动(吸收或输出电流)4 个 TTL 逻辑门电路。对端口写“1”,通过内部的上拉电图 2.2. 单片机引脚图阻把端口拉到高电平,此时可作输出口。作输入口时,因为内部存在上拉电阻,某个引脚被外部信号拉低时输出一个电流(I) 。Flash
15、编程和程序校验期间,P1口接收 8 位地址。P2 口:P2 口是一个带有内部上拉电阻的 8 位双向 I/O 口,P2 的输入缓冲极可以驱动(输入或输出电流)4 个 TTL 逻辑门电路。对端口“1”,通过内部的上拉电阻把端口拉到高电平,此时和作为输出口,作输出口时,因为存在内部上拉电阻,某个引脚被外部信号拉低时会输出一个电流。在访问外部存储器或 1 位地址的外部数据存储器(例如执行 MOVXDPTR 指令)时,P2 口送出高 8 位地址数据。在访问 8 位地址的外部数据存储器(如执行 MOVXRI 指令)时,P2 口线的内容(也既特殊功能寄存器(SFR)区中 R2 寄存器的内容) ,在整个访问期
16、间不改变。Flash 编程或校验时,P2 亦接收高地址和其他控制信号。P3 口:P3 口是一组带有内部上拉电阻的 8 位双向 I/O 口,P1 的输入缓冲级可驱动(吸收或输出电流)4 个 TTL 逻辑门电路。对 P3 口写入“1”时,它们被内部上拉电阻拉高并可作为输出端口。作输出端口时,被外部拉低的 P3 口将用上拉电阻输出电流。P3 口除可作为一般的 I/O 口线外,更重要的用途是它的第二功能如表 2.1 所示:表 2.1 AT89S52 端口:P3 口还接收一些用于 Flas 闪速存储器编程和程序校验的控制信号ALE/ 当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)PROG输出
17、脉冲用于锁存地址的低 8 位字节,即使不访问外部字节,ALE 仍时钟震荡频率的 1/6 输出固定的正脉冲信号,因此它可对外输出时钟脉冲或用于定时目的。要注意的是:每次访问外部存储器时将跳过一个 ALE 脉冲。对 Flash 存储器编程期间,该引脚还要输入编程脉冲( ) 。如有必要,可通过对特殊功能寄存PROG器(SFR )区中的 8EH 单元的 D0 位置位,可禁止 ALE 操作。该位置位后,只有一条 MOVX 和 MOVC 指令可激活。此外,此引脚会被微弱拉高,单片机执行外部程序时,应该置 ALE 无效RST:复位输出。当震荡器工作时,RST 引脚出现两个机器周期以上高电平使机器复位。 :程
18、序存入允许( )输出的是外部程序存储器的读选通信号,当PSENPSENAT89S52 由外部程序取指令(或数据)时,每个机器周期两次 有效,既输PSEN出两个脉冲。在此期间,当访问外部数据存储器,这两次有效的 信号不出现。EA/VPP:外部访问允许。欲使 CPU 仅访问外部程序存储器(地址为 0000H-FFFFH) ,EA 端必须保持低电平(接地) 。要注意的是:如果加密位 LB1 被编程,复位时内部会锁存 EA 端状态。Flash 存储器编程时,该引脚加上+12V 的编程允许电源 Vpp,当然这必须是该器件是使用 12V 的编程电压 Vpp。XTAL1:震荡器反向放大器及内部时钟的输入端。
19、XAAL2:震荡器反向放大器的输出端。图 2.3 内部震荡电路时钟震荡器:AT89S52 中有一个构成内部震荡器的高增益由于外部时钟信号是通过一个 2 分频的触发器后作为内部时钟信号的所以外部时钟的占空比没有特殊要求,但最小高电平持续的时间和最大低电平持续的时间应符合产品技术条件的要求。表 2.2 AT89S52 寄存器寄存器 内容 寄存器 内容PC 0000H TMOD 00HACC 00H TCOM 00HB 00H TH0 00HPSW 00H TLO 00HSP 07H TH1 00H0DPTR 0000H TH1 00HP1P3 0FFH SCON 00HIP xxx00000 SB
20、UF 不定IE 0xxx00000 PCON 0xxx00000其中单片机最小系统的电路图如图 2.4 所示。图 2.4 单片机最小系统二、 DS1302 实时时钟芯片DS1302 是 DALLAS 公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31 字节静态 RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过 AM/PM 标志位决定采用 24 或 12 小时时间格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需三根 I/O 线:复位(RST) 、I/O 数据线、串行
21、时钟(SCLK) 。时钟/RAM 的读/写数据以一字节或多达 31 字节的字符组方式通信。DS1302 工作时功耗很低,保持数据和时钟信息时,功耗小于 1mW。DS1302 的内部结构如图 2.5 所示,主要组成部分为:移位寄存器、控制逻辑、振荡器、实时时钟以及 RAM。虽然数据分成两种,但是对单片机的程序而言,其实是一样的,就是对特定的地址进行读写操作图 2.5 DS1302 的内部结构图DS1302 含充电电路,可以对作为后备电源的可充电电池充电,并可选择充电使能和串入的二极管数目,以调节电池充电电压。不过对我们目前而言,最需要熟悉的是和时钟相关部分的功能,对于其它参数请参阅数据手册。DS
22、1302 的工作原理DS1302 工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将 8 位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前 8 位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8 位地址 +8 位数据) ,在多字节方式下为 8 加最多可达 248 的数据。DS1302 的寄存器和控制命令对 DS1302 的操作就是对其内部寄存器的操作,DS1302 内部共有 12 个寄存器,其中有 7 个寄存器与日历、时钟相关,存放的数据位为 BCD 码形式。此外
23、,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与 RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。日历、时间寄存器及控制字如表 2.3 所示:表 2.3:日历、时钟寄存器与控制字对照表最后一位 RD/W 为“0”时表示进行写操作,为“1”时表示读操作。DS1302 内部寄存器列表如表 2.4 所示:DS1302 内部的 RAM 分为两类,一类是单个 RAM 单元,共 31 个,每个单元为一个 8 位的字节,其命令控制字为 COHFDH,其中奇数为读操作,偶数为7 6 5 4 3 2 1 0寄存器名称1 RAM/CK A4 A3 A2 A1
24、 A0 RD/W秒寄存器 1 0 0 0 0 0 0分寄存器 1 0 0 0 0 0 1小时寄存器 1 0 0 0 0 1 0日寄存器 1 0 0 0 0 1 1月寄存器 1 0 0 0 1 0 0星期寄存器 1 0 0 0 1 0 1年寄存器 1 0 0 0 1 1 0写保护寄存器 1 0 0 0 1 1 1慢充电寄存器 1 0 0 1 0 0 0时钟突发寄存器 1 0 1 1 1 1 1命令字 各位内容寄存器名称写 读取值范围7 6 5 4 3 2 1 0秒寄存器 80H 81H 00-59 CH 10SEC SEC分寄存器 82H 83H 00-59 0 10MIN MIN小时寄存器 8
25、4H 85H 01-12 或 00-23 12/24 0 A HR HR日期寄存器 86H 87H 01-28,29,30,31 0 0 10DATE DATE月份寄存器 88H 89H 01-12 0 0 0 10M MONTH周寄存器 8AH 8BH 01-07 0 0 0 0 0 DAY年份寄存器 8CH 8DH 00-99 10YEAR YEAR表 2.4. DS1302 内 部 寄 存 器 列 表写操作;再一类为突发方式下的 RAM,此方式下可一次性读写所有的 RAM 的31 个字节,命令控制字为 FEH(写) 、FH(读) 。我们现在已经知道了控制寄存器和 RAM 的逻辑地址,接着
26、就需要知道如何通过外部接口来访问这些资源。单片机是通过简单的同步串行通讯与 DS1302 通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302 写入一个命令帧,这个帧的格式如表 2.1 所示,最高位 BIT7 固定为1,BIT6 决定操作是针对 RAM 还是时钟寄存器,接着的 5 个 BIT 是 RAM 或时钟寄存器在 DS1302 的内部地址,最后一个 BIT 表示这次操作是读操作抑或是写操作。物理上,DS1302 的通讯接口由 3 个口线组成,即 RST,SCLK,I/O。其中RST 从低电平变成高电平启动一次数据传输过程,SCLK 是时钟线,I/O 是数据
27、线。请注意,无论是哪种同步通讯类型的串行接口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302 正是如此的,但是在芯片手册里没有明确说明) ,如果不是特别确定,则把程序设计成这样:平时 SCLK 保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在 SCLK 保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。DS1302 的命令字结构图图 2.6 DS1302 的命令字结构图 2.7 DS1302 部分原理图三、 温度模块本设计中我在温度模块中采用的是 DS18B20 温度传感器,DSl8B20 是DALLAS 公司生产的
28、一线式数字温度传感器。它将地址线、数据线和控制线合为一根双向串行传输数据的信号线,允许在这根信号线上挂接多个 DSl8B20;因此,单片机只需通过一根 IO 线就可以与多个 DSl8B20 通信。每个芯片内还有一个64 位的 ROM,其中存有各个器件自身的序列号,作为器件独有的 ID 号码。DSl8B20 简化了测温器件与计算机的接口电路,使得电路简单,使用更加方便。DSl8B20 的特性如下:(1)测温范围:一 55 至十 125;(2)转换精度:9 至 12 位二进制数(包括符号 1 位),可编程确定转换精度的位数;(3)测温分辨率:9 位精度为 05,12 位精度为 0.0625;(4)
29、转换时间:9 位精度为 9375ms,10 位精度为 1875ms,12 位精度为750ms;(5)具有非易失性上、下限报警设定的功能。预置 斜率累加器计数比较器预置温度寄存器减到 0减法计数器 2高温度系数振荡器减到 0减法计数器 1低温度系数振荡器停止增加图 2.7 内部测温电路图DS18B20 的测温原理如图 2.7 所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器 1,高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器 2 的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20 就对低温度系数振荡器产生的时钟脉冲后
30、进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 所对应的基数分别置入减法计数器 1 和温度寄存器中,减法计数器 1 和温度寄存器被预置在-55所对应的一个基数值。减法计数器 1 对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器 1 的预置值减到 0 时温度寄存器的值将加 1,减法计数器 1 的预置将重新被装入,减法计数器 1 重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器 2 计数到 0 时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图 2.7 中的斜率累加器用于补偿和修正测温过程中的非线性,其输
31、出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是 DS18B20 的测温原理。使用 DSl8B20 时应注意以下事项:(1)由于 DSl8B20 的测温分辨力提高到 12 位,因此它对时序及电特性参数要求较高需严格按照 DSl8B20 的时序要求进行操作。(2)DSl8B20 作三线制应用时,应将 UDD、IO 、GND 端焊接牢固;作两线制应用时,应将 UDD 与 GND 连在一起焊牢。若 UDD 端漏焊或者虚焊,传感器就只能输出十 850的温度数据。 (3)测温电缆线可采用带屏蔽层的 4 芯双绞线,其中两根线分别接信号线与地线,另两根线
32、依次接 UDD 和地线,屏蔽层在源端单点接地。四、 1602 液晶显示器1602 字符型型液晶是一种用 57 点阵图形来显示字符的液晶显示器,根据显示的容量可以分为 1 行 16 个字、2 行 16 个字、2 行 20 个字等,最常用的为 2 行16 个字,即我们马上要学习的 1602 液晶模块,下面(图 2.8)就是 TC1602 液晶模块的正面照片。 图 2.8 1602 实物图带背光的液晶模块 TC1602EL,TC1602EL 采用标准的 16 脚接口,其引脚功能如下:第 1 脚:VSS 为电源地,接 GND。第 2 脚:VDD 接 5V 正电源。第 3 脚:VL 为液晶显示器对比度调
33、整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影 ”,使用时可以通过一个 10K 的电位器调整对比度。第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第 5 脚:RW 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 RW 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平RW 为高电平时可以读忙信号,当 RS 为高电平 RW 为低电平时可以写入数据。第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。第 714 脚:D0D7 为 8 位双向数据线。第 15 脚:BLA 背光电源正极
34、(+5V)输入引脚。第 16 脚:BLK 背光电源负极,接 GND。 TC1602 液晶模块内带标准字库,内部的字符发生存储器( CGROM)已经存储了192 个 57 点阵字符, 32 个 510 点阵字符。另外还有字符生成RAM(CGRAM)512 字节,供用户自定义字符。1602 液晶模块内部的控制器共有 11 条控制指令。它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。指令 1:清显示,指令码 01H,光标复位到地址 00H 位置 指令 2:光标复位,光标返回到地址 00H 指令 3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或
35、者右移。高电平表示有效,低电平则无效指令 4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令 5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标指令 6:功能设置命令 DL:高电平时为 4 位总线,低电平时为 8 位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示 5x7 的点阵字符,高电平时显示 5x10 的点阵字符指令 7:字符发生器 RAM 地址设置指令 8:DDRAM 地址设置指令 9:读忙信号和光标地址 BF:
36、为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令 10:写数据指令 11:读数据 下面是 TC1602 液晶模块的一些主要技术参数:1、逻辑工作电压(VDD):+4.5 +5.5V2、LCD 驱动电压(VDD - VL):+4.5 +13.0V3、工作温度(Ta): 0 60C(常温)/-20 75 C(宽温)4、工作电流: 0; i-)DS1302_IO = ACC0; /相当于汇编中的 RRCDS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时
37、时钟读取一字节(内部函数) unsigned char i;for(i=8; i0; i-)ACC = ACC 1; /相当于汇编中的 RRC ACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa) DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte
38、数据DS1302_CLK = 1;DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr) /读取 DS1302 某地址的数据unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01);/ 地址,命令 ucData = DS1302OutputByte(); / 读 1Byte 数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);void DS1302_GetT
39、ime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time-Second = (ReadValueReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValueReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValueReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValueReadValue =
40、Read1302(DS1302_WEEK);Time-Week = (ReadValueReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValueReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValuevoid DateToStr(SYSTEMTIME *Time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里 DateString if(hide_year2 就不显示,输出字符串为 2007/07/22 Time-DateString0 = 2;Time-Date
41、String1 = 0; Time-DateString2 = Time-Year/10 + 0;Time-DateString3 = Time-Year%10 + 0;else Time-DateString0 = ;Time-DateString1 = ;Time-DateString2 = ;Time-DateString3 = ;Time-DateString4 = /;if(hide_monthDateString5 = Time-Month/10 + 0;Time-DateString6 = Time-Month%10 + 0;elseTime-DateString5 = ;Tim
42、e-DateString6 = ;Time-DateString7 = /;if(hide_dayDateString8 = Time-Day/10 + 0;Time-DateString9 = Time-Day%10 + 0;elseTime-DateString8 = ;Time-DateString9 = ; if(hide_weekWeek%10 + 0; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示elseweek_value0 = ;week_value1 = 0;Time-DateString10 = 0; /字符串末尾加 0
43、,判断结束字符void TimeToStr(SYSTEMTIME *Time) /将时,分,秒数据转换成液晶显示字符 if(hide_hourTimeString0 = Time-Hour/10 + 0;Time-TimeString1 = Time-Hour%10 + 0;elseTime-TimeString0 = ;Time-TimeString1 = ;Time-TimeString2 = :;if(hide_minTimeString3 = Time-Minute/10 + 0;Time-TimeString4 = Time-Minute%10 + 0;elseTime-TimeSt
44、ring3 = ;Time-TimeString4 = ;Time-TimeString5 = :;if(hide_secTimeString6 = Time-Second/10 + 0;Time-TimeString7 = Time-Second%10 + 0;elseTime-TimeString6 = ;Time-TimeString7 = ;Time-DateString8 = 0;void Initial_DS1302(void) /时钟芯片初始化 unsigned char Second=Read1302(DS1302_SECOND);if(Second /写入允许Write130
45、2(0x8c,0x07);/写入初始化值 07/07/25.星期:3.时间: 23:59:55Write1302(0x88,0x07);Write1302(0x86,0x25);Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); /禁止写入/*ds18b20 子程序*/*ds18b20 延迟子函数(晶振12MHz )*/ void delay_18B20(unsigned int i)while(i-);/*ds18b20 初始化函数*
46、/void Init_DS18B20(void) unsigned char x=0;DQ = 1; /DQ 复位delay_18B20(8); /稍做延时DQ = 0; /单片机将 DQ拉低delay_18B20(80); /精确延时 大于 480usDQ = 1; /拉高总线delay_18B20(14);x=DQ; /稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失败delay_18B20(20);/*ds18b20 读一个字节*/ unsigned char ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-)DQ
47、= 0; / 给脉冲信号dat=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;delay_18B20(4);return(dat);/*ds18b20 写一个字节*/ void WriteOneChar(uchar dat)unsigned char i=0;for (i=8; i0; i-)DQ = 0;DQ = datdelay_18B20(5);DQ = 1;dat=1;/*读取 ds18b20 当前温度*/void ReadTemp(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS1
48、8B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器两个就是温度delay_18B20(100);a=ReadOneChar(); /读取温度值低位b=ReadOneChar(); /读取温度值高位temp_value=b4; void temp_to_str() /温度数据转换成液晶字符显示TempBuf