12864+ds1302+ds18b20数字时钟 - 温度 - 日期同步显示

更新时间:2023-10-31 01:25:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

毕业(论文)说明书

题目类型: √ 理论研究

题 目:

系 别:

专 业:

指导老师:

学生姓名:

学 号:

实验研究 工程设计

2014年 工程技术研究 软件开发7 月 18日

一毕业设计(论文)内容与要求

一、主要研究内容

1、8051单片机硬件结构。 2、C语言程序设计基础内容。 3、单片机C语言程序设计的方法。 4、DS18B20温度传感器的使用方法。 5、DS1302时钟芯片的用法。

6、12864LCD液晶屏的编程使用方法。 二、要求

1、能够以指针的形式在LCD12864上显示当前时间的小时和分钟

和秒。

2、能够以数字加汉字的形式在LCD12864上显示当前时间的小时

和分钟和秒。

3、能够以数字加汉字的形式在LCD12864上显示当前年月日。 4、能够以数字加汉字的形式在LCD12864上显示当前星期。 5、时间采用时钟芯片DS1302控制。

6、温度采用DS18B20温度传感器检测当前温度。 7、所有功能在LCD12864当中同步显示。

8、采用AT89S52或者STC89C52RC单片机控制。

三、引言

之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、

生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向数字化控制,智能化控制方向发展。

本设计是数据采集及处理,显示系统与单片机有效结合,本设计

通过在“单片机原理及应用”课堂上学习的知识的综合应用,以及查阅

资料,培养一种自学的能力。并且引导一种创新的思维,把学到的知识

应用到日常生活当中。在设计的过程中,不断的学习,思考和同学间的

相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系

统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,

充分发挥教学与实践的结合。全能提高个人系统开发的综合能力,开拓

了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。

四、方案设计及方案论证

1.时钟温度的总体设计思路

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目

制 系

软件系统实现,用单片机的自动控制能力配合ds1302和ds18b20来控

按照系统的设计功能要求,本时钟温度系统的设计必须采用单片

时钟和温度的调整显示。获得时钟温度数据信息,单片机对其进行一列的处理,最后通过液晶显示出来。 2222、时钟温度系统方案论证

2.12.1时钟系统方案选择

2.12.1

方案 1111:

通过单片机内部的定时器/计数器,用软件实现,直接用单片机

的定时器编程以实现时钟; 方案 2222:

片机,由单片机控制显示。虽然用软件实现时钟硬件线路简单,但是程

序运行的每一步都需要时间,多一步或少一步程序都会影响记时的准确

度,对定时器定时也不是十分准确,时钟精度很低,对于我们实现所需

要的功能造成软件编程非常复杂。用专用时钟芯片硬件成本相对较高,

但它的精度很高,软件编程很简单。综上所述,选择方案2。 2.22.2单片机的选择

2.22.2

对于单片机的选择,如果用8031系列,由于它没有内部RAM,系

统又需要大量内存存储数据,因而不可用;51系列单片机的ROM为4K,

对于我们设计的系统可能有点小;52系列单片机与51系列的结构一样,

而ROM扩大为8K,对我们设计系统提供充足的空间进行功能的扩展。

再有51系列单片机与52系列的单片机价格差不多。因此,我们选择52 系列的单片机。

2.32.3显示系统的方案比较

2.32.3

方案1:用数码管或点阵LED显示。

方案2:用液晶1602显示。 方案3:用液晶12864显示。

管的只能显示简单的设计的系统,与我们设计要求也不相符。有很多东 多

的数据,用1602液晶显示数据有限,1602不能够显示指针时钟,只能

够显示一些基本的西文字符,显示数据的可读性不好,用可以显示汉西需要显示,还是用显示功能更好的液晶显示器比较好,它能显示更

时钟和温度的显示可以用数码管或LED,而且价格便宜。但是数

用专门的时钟芯片(DS1302)实现时钟的记时,再把时间数据送入

的12864液晶显示器还可以增加显示信息的可读性,用12864的绘图功

能即可绘制出指针时钟的框架,至于指针的转动则才用12864加ds1302

同步控制,让人看起来会很方便。虽然它们在价格上差距很大,但是1602

不能够实现我们的要求,12864.是我们唯一的选择。 2.42.4温度系统方案选择

2.42.4

方案1:

用热敏电阻等测温元件测出电压,再转换成对应的温度。需要比

多的外部元件(A/D转换)支持,且硬件电路复杂,制作成本相对较高。

方案2:

用DS18B20直接测温。DS18B20温度传感器是美国DALLAS半导

体公司最新推出的一种改进型智能温度传感器,它能直接读出被测温度,

并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

经比较,我们选择方案2。

温度实现只能通过外部的温度传感器来实现。经上网查阅及市场考

察,DS18b20体积小,只有3只脚,电路接法简单。内部含有寄存器为

计的要求。DS18B20也是我们通常使用的型号,因此温度传感器用 DS18B20。

五、时钟温度系统总体设计

初步确定设计系统由单片机主控模块、时钟模块ds102、测温模块

ds18b20、显示模块12864、共5个模块组成,电路系统框图。 如下图所示

我们设计实现上下限报警功能提供保障。精度为0.5°C,也符合我们

六、硬件设计部分

1、单片机最小系统电路设计

1.1单片机芯片选择

单片机采用52系列单片机。由ATMEL公司生产的AT89S52是一种低

功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。 使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指 令和引脚完全兼容。在单芯片上,拥有灵巧的8位CPU和在线系统可编 程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、有效解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM, 32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数 器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一工作停止,直到下一个中断或硬件复位为止。而且,它还具有一个看狗(WDT)定时/计数器,如果程序没有正常工作,就会强制整个系统位,还可以在程序陷入死循环的时候,让单片机复位而不用整个系统电,从而保护你的硬件电路。

空 续 切 门 复 断

AT89S52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2 个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,片上 Flash允许程序存储器在系统可编程,亦适于常规编程器。其将通用的微 处理器和Flash存储器结合在一起,特别是可反复擦写图1.1_1

图1.1_2

的Flash存储器可有效地降低开发成本.其芯片外观及引脚图如1.1__2:

1.2单片机管脚说明

VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。

当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数 据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口 作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须 被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器 能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作 输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的 缘故。在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接 收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻 拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输 出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位 地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址 “1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写 时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接

收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个 门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作TTL

输 入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由 于上拉的缘故。

P3口也可作为AT89S52的一些特殊功能口,如下表所示: 管脚备选功能

(串行输入口)

P3.0RXD

P3.1TXD P3.2/INT0 P3.3/INT1 P3.4T0 P3.5T1 P3.6/WR P3.7/RD

(串行输出口) (外部中断0) (外部中断1)

(记时器0外部输入) (记时器1外部输入)

(外部数据存储器写选通) (外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高 电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存 地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平 时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的 1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是: 每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输

出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令

是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行 状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间, 每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有 效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器

(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA 将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在 FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

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

1.3单片机最小系统

单片机最小系统主要由复位电路,晶振电路,电源等几部分组成。 1)复位电路

复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方

式。如下图所示:

2)晶振电路

晶振电路原理图如3-2:

3-2晶振模块原理图

选取原则:电容选取22pF,晶振为12MHz。

3)电源

AT89S52单片机的供电电源是5V的直流电。

4)EA非/Vpp脚

我们没有用外部扩展ROM,因此EA非/Vpp为高电平,即接+5V电

源。

2、时钟系统电路设计 2.1时钟芯片选择

可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等种功能。它采用主电源和备用电源双电源供电。它的工作电压范围 2.0~5.5V,在2.2V时,小于300nA。它内部含有31个字节的静态RAM, 可提供用户访问。

我们设计的基本的要求。内部的寄存器为我们调时,闹钟定时提供了存空间。备用用电源也实现了当系统断电后,时钟仍然可以保持。而它是串行接口,与单片机通信所需要的接口少。不像DS12887等芯片行通信需要很多IO口。

2.2DS1302管脚及寄存器说明 1、DS1302的引脚排列

Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能

保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。 当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1 时,DS1302由Vcc1供电。因此,我们vcc1用3V的纽扣电池作为备用 电源,vcc2用系统电源作为主电源。X1和X2是振荡源,外接32.768kHz

晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有

DS1302可以对年、月、日、周日、时、分、秒进行计时,可以达我们采用具有涓细电流充电能力的低功耗实时时钟电路DS1302。

寄 且 并

/ 的

数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据

传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302

进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,

I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持

低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串 行数据输入输出端(双向)。SCLK为时钟输入端。 2、DS1302的寄存器说明

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存

放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存 器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突 发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31 个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其 中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器, 此方式下可一次性读写所有的RAM的31个字节,命令控制字为 FEH(写)、FFH(读)。

2.3DS1302时钟电路

DS1302时钟电路如下图所示:

DS1302与单片机的连接仅需3条线:时钟线SCLK、数据线I/O和复位 线RST。时钟线SCLK与P1.4相连,数据线I/O与P1.5相连,复位线 RST与P2.2相连。由于DS1302是靠涓细电流充电来实现串行输入输出 的,因此,在SCLK、I/O、RST线上要加上拉电阻,其中,它们的电 流应该在500u~1mA之间,若电源为5V,则R约为5k,因此,我们的 电阻R=4.7K。

在单电源与电池供电系统中,vcc1提供低电源并提供低功率的备用电源。

Vcc2提供高电源作为芯片供电的主电源。因此,这里vcc1用10uf的电

容做电池,vcc2用5V的系统电源。晶振为32.768KHz接入X1、X2引 脚。

3、温度系统电路

3.1温度芯片的选择 场

温度实现只能通过外部的温度传感器来实现。经上网查阅资料及市考察,DS18b20体积小,只有3只脚,电路接法简单。它能够直接读

保 志 合 感

器用DS18B20。

3.2DS18B20内部结构描述

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一

个非易失性的可电擦除的EERAM。高速暂存RAM的结构为8个字节的

存储器,结构如图4.1所示。头两个字节包含测得的温度信息,第三第四字节是TH和TL的拷贝,是易失的,每次上电复位时被刷新。第五 个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。

DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数

值。

该字节各位的定义如图4.2所示。低5位一直为1,TM是测试模式位,

用于设置DS18B20在工作模式还是在测试模式。

超过程序限定温度(温度报警条件)的器件;精度为0.5°C,也符我们设计的要求。DS18B20也是我们通常使用的型号,因此温度传出被测温度。内部含有寄存器为我们设计实现上下限报警功能提供障。用户可定义的非易失性温度报警设置;报警搜索命令识别并标

温度LSB 温度MSB TH用户字节1 TL用户字节2 配置寄存器 保留 保留 保留

CRC

1字节 2字节 3字节 4字节 5字节 6字节 7字节 8字节 9字节

图4.1高速暂存RAM结构图

EEROM TH用户字节1 TL用户字节2

TMR1R011111

图4.2配置寄存器

3.3DS18b20温度系统电路 DS18B20系统电路如下:

DS18B20有两种接法:一是单线接法即只接QT。这种方法应用它内部

的寄生电源,因此在QT上要用一个MOSFET把I/O线只接拉到电源上。 二是从vdd脚加上电源。方法一适合于远距离温度监控,不需要本地电

源。而我们只是设计测温系统,选择方法二就行了,还有MOSFET极容

易烧,我们不用它。Vdd接5V电源,vss接地,QT与P3.5相连。因为 DS18B20的工作电流约为1MA,因此Qt端还要加上拉电阻为其提供电 流。若用5V电源,则R=5/1MA=5k。R取4.7K。 6.112864F简介

带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种

接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个 16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指

令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的

构 电 的

汉字.也可完成图形显示.低电压低功耗是其又一显著特点。由该模块成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵图形液晶模块。 6.212864F引脚说明 管脚号管脚名

1VSS0V电源地 2VCC3.0+5V电源正

3V0-对比度(亮度)调整 4

RS(CS)H/L

RS=“L”,表示DB7——DB0为显示指令数据

5R/W(SIDH/LR/W=“H”,E=“H”,数据被读到DB7——DB0

RS=“H”,表示DB7——DB0为显示数据

电平管脚功能描述

)R/W=“L”,E=“H→L”,DB7——DB0的数据

被写到IR或DR

6E(SCLK)H/L使能信号 7DB0H/L三态数据线 8DB1H/L三态数据线 9DB2H/L三态数据线 10DB3H/L三态数据线 11DB4H/L三态数据线 12DB5H/L三态数据线 13DB6H/L三态数据线 14DB7H/L三态数据线

15PSBH/LH:8位或4位并口方式,L:串口方式(见注

释1)

16NC-空脚

17/RESETH/L复位端,低电平有效(见注释2) 18VOUT-LCD驱动电压输出端

19AVDD背光源正端(+5V)(见注释3) 20KVSS背光源负端(见注释3) 12864F液晶显示电路

设计中采用LCD12864液晶显示。它一般串口、并口两种方式显示,

而我们一般采用并口显示。12864的4、5、6、15、17脚分别与单片机 的P3.0~P3.4相连。7~14脚与单片机的P0口相连。1、20号脚接地,

2号脚接电源,19号脚背光灯正端串一个电阻与电源相连,电阻起限的作用,我们取R=10K。3号脚是对比度(亮度)调整,这里要用一个 滑动变阻器来调整亮度,这里我们取电位器大小为10K。LCD12864显 示电路如下图所示:

总体硬件系统设计

总体硬件设计框图如下

示程序。

本系统的软件系统主要分为主程序、时钟程序、温度程序、液晶显

#include\ #include\

#include\ #include

#defineio_LCD12864_DATAPORTP0

\#defineucharunsignedchar #defineuintunsignedint

#defineshujuio_LCD12864_RS=1; #definezhilinio_LCD12864_RS=0; #defineduio_LCD12864_RW=1; #definexieio_LCD12864_RW=0; #defineSET_ENio_LCD12864_EN=1; #defineCLR_ENio_LCD12864_EN=0; sbitP25=P2^5; sbitP36=P3^6; sbitP37=P3^7;

sbitDQ=P3^5;//定义DS18B20通信端口 sbitT_CLK=P1^4;/*实时时钟时钟线引脚*/ sbitT_IO=P1^5;/*实时时钟数据线引脚*/ sbitT_RST=P2^2;/*实时时钟复位线引脚*/ sbitACC0=ACC^0; sbitACC7=ACC^7;

sbitio_LCD12864_RS=P1^7;//位定义12864通信端口 sbitio_LCD12864_RW=P1^6; sbitio_LCD12864_EN=P2^3;

*/

ucharcodemun_to_char[]=\数字转换为ASCII字符码ucharcodeWeek1_to_char[]={\一\

ucharcodeWeek2_to_char[]={\二\ ucharcodeWeek3_to_char[]={\三\ ucharcodeWeek4_to_char[]={\四\ ucharcodeWeek5_to_char[]={\五\

ucharcodeWeek6_to_char[]={\六\星期数字转换为汉字的ASCII 码*/

ucharcodeWeek7_to_char[]={\日\ ucharhanzi_buff1[]={\ ucharhanzi_buff2[]={\星期三\ ucharhanzi_buff3[]={\ ucharhanzi_buff4[]={\温度25.0\

uchardatatime_data_buff[7]={0x30,0x24,0x13,0x23,0x08,0x03,0x10};//格

式为:秒分时日月星期年DATA为直接访问内部数据存储器,

访问速度最快

floatcodepointer_mark[60][2]={//时钟刻度处的坐标,共60个,采用浮点

形,指针坐标运算的时候更加精确 {31,4},{34,2},{37,2},{40,2},{43,2},{46,4},{49,4},{52,7},{55,10},{58,13},

{59,16},{61,19},{61,22},{61,25},{61,28},{59,31},{61,34},{61,37},{61,40},

{61,43}, {59,46},{59,49},{56,52},{53,55},{50,58},{46,59},{43,61},{40,61},{37,61},

{34,61}, {31,59},{28,61},{25,61},{22,61},{19,61},{16,59},{13,58},{10,55},{7,52},{

v_Lcd12864DrawLineX_f(63,61,40,1); v_Lcd12864DrawLineX_f(63,61,43,1);

v_Lcd12864DrawLineX_f(63,59,46,1);//正东方向小时绘刻度制完成

v_Lcd12864DrawLineY_f(63,59,16,1);

v_Lcd12864DrawLineY_f(63,61,19,1); v_Lcd12864DrawLineY_f(63,61,22,1); v_Lcd12864DrawLineY_f(63,61,25,1); v_Lcd12864DrawLineY_f(63,61,28,1);

v_Lcd12864DrawLineY_f(63,59,31,1);

v_Lcd12864DrawLineY_f(63,61,34,1); v_Lcd12864DrawLineY_f(63,61,37,1); v_Lcd12864DrawLineY_f(63,61,40,1); v_Lcd12864DrawLineY_f(63,61,43,1);

v_Lcd12864DrawLineY_f(63,59,46,1);//正南小时方向刻度绘制完成

for(a=0;a<=15;a++)//这循环完成四个角上面三角形区域的填充

{v_Lcd12864DrawLine_f(a,0,0,a,1);

v_Lcd12864DrawLine_f(63,47+a,47+a,63,1);

v_Lcd12864DrawLine_f(47+a,0,63,16-a,1);

v_Lcd12864DrawLine_f(0,47+a,16-a,63,1);

} //填充斜线上的四个点

for(a=4;a<15;a=a+3)

{v_Lcd12864DrawPoint_f(17-a,a,1);//左斜上方的四个点这四个

点的坐标分别为“(4,13),(7,10),(10,7)(13,4)” v_Lcd12864DrawPoint_f(45+a,a,1);//右斜上方的四个点

这四个

点的坐标是“(49,4),(52,7),(55,10),(58,13)” v_Lcd12864DrawPoint_f(63-a,45+a,1);//右斜下角的四

个点这

四个点的坐标是“(59,49),(56,52),(53,55),(50,58)” v_Lcd12864DrawPoint_f(a,45+a,1);//左斜下角的四个点这

四个

点的坐标是“(13,58),(10,55),(7,52),(4,49)”

} }

voidmain(void) {

unsignedcharhour,decade,second;//定义时分秒十进制方式寄存器

unsignedcharhour1,decade1,second1;//用于时间判断

unsignedcharweek_buff;//用于星期寄存 unsignedchari=0;

unsignedinttemp_buff;//此变量用于温度寄存 v_Lcd12864Init_f();//初始化函数

io_LCD12864_DATAPORT=0xff;//释放P0端口 P25=0;//关闭发光二极管显示 P36=0;//关闭数码管显示

v_Lcd12864SendCmd_f(0x36);//采用扩充指令集,绘图开

v_DelayMs_f(2);//需设定两次,先改DL,再改RE v_Lcd12864SendCmd_f(0x36); v_DelayMs_f(2);

cls();//清屏,为显示做准备

frame_and_scale_f();//绘制出边框,和刻度

//Set1302(time_data_buff);//设置时间DS1302的时间,采用涓流充电

所以只设置一次

W1302(0x90,0xab);//采用涓流充电,选择两个二极管,8k的电阻,最

小电流充电 while(1)

{

for(i=4;i<8;i++)//右半屏显示年月日,温

{

LCD12864_HAIZI_WRITE(i,0,hanzi_buff1[i*2-8],hanzi_buff1[i*2+1-8]

);//显示年月日

LCD12864_HAIZI_WRITE(i,1,hanzi_buff2[i*2-8],hanzi_buff2[i*2+1-8]

);//显示星期

LCD12864_HAIZI_WRITE(i,2,hanzi_buff3[i*2-8],hanzi_buff3[i*2+1-8]

);//显示时间

LCD12864_HAIZI_WRITE(i,3,hanzi_buff4[i*2-8],hanzi_buff4[i*2+1-8]

);//显示温度

}

Get1302(time_data_buff);//功能把DS1302内寄存器的值赋

time_data数组

hanzi_buff1[0]=mun_to_char[time_data_buff[6]/0x10];

hanzi_buff1[1]=mun_to_char[time_data_buff[6]%0x10];//年 0]; /月 0];

hanzi_buff1[3]=mun_to_char[time_data_buff[4]/0x1hanzi_buff1[4]=mun_to_char[time_data_buff[4]%0x10];/hanzi_buff1[6]=mun_to_char[time_data_buff[3]/0x1

hanzi_buff1[7]=mun_to_char[time_data_buff[3]%0x10];///日

hanzi_buff3[0]=mun_to_char[time_data_buff[2]/0x10];

hanzi_buff3[1]=mun_to_char[time_data_buff[2]%0x10];//时

hanzi_buff3[3]=mun_to_char[time_data_buff[1]/0x10];

hanzi_buff3[4]=mun_to_char[time_data_buff[1]%0x10];//分

hanzi_buff3[6]=mun_to_char[time_data_buff[0]/0x10];

hanzi_buff3[7]=mun_to_char[time_data_buff[0]%0x10];///秒

temp_buff=ReadTemperature(); ]; ; ;

hanzi_buff4[5]=mun_to_char[temp_buff0/10]hanzi_buff4[7]=mun_to_char[temp_buff]hanzi_buff4[4]=mun_to_char[temp_buff/100

;

week_buff=time_data_buff[5]if(week_buff==7){

hanzi_buff2[6]=Week7_to_char[0];

hanzi_buff2[7]=Week7_to_char[1];//星期日 }

elseif(week_buff==1){

hanzi_buff2[6]=Week1_to_char[0];

hanzi_buff2[7]=Week1_to_char[1];//星期一 }

elseif(week_buff==2){

hanzi_buff2[6]=Week2_to_char[0];

hanzi_buff2[7]=Week2_to_char[1];//星期二 }

elseif(week_buff==3){

hanzi_buff2[6]=Week3_to_char[0];

hanzi_buff2[7]=Week3_to_char[1];//星期三 }

elseif(week_buff==4){

hanzi_buff2[6]=Week4_to_char[0];

hanzi_buff2[7]=Week4_to_char[1];//星期四 }

elseif(week_buff==5){

4,49},

{4,46},{2,43},{2,40},{2,37},{2,34},{4,31},{2,28},{2,25},{2,22},{2,19},

{4,16},{4,13},{7,10},{10,7},{13,4},{16,4},{19,2},{22,2},{25,2},{28,2}

};

voidv_DelayMs_f(unsignedintnDelay)//用于12864,DS1302延时 {

unsignedinti;

for(;nDelay>0;nDelay--) {

for(i=125;i>0;i--);

} }

//////////////////以下是DS18B20驱动程序////////////////

//延时函数

voiddelay(unsignedinti) {

while(i--); }

//DS18B20初始化函数 Init_DS18B20(void) {

unsignedcharx=0; DQ=1;//DQ复位

delay(8);//稍做延时 DQ=0;//单片机将DQ拉低

delay(80);//精确延时大于480us DQ=1;//拉高总线 delay(14);

x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败 delay(20); }

//DS18B20读一个字节 ReadOneChar(void) {

unsignedchari=0; unsignedchardat=0;

{

DQ=0;//给脉冲信号 dat>>=1;

DQ=1;//给脉冲信号 if(DQ)dat|=0x80; delay(4); }

for(i=8;i>0;i--)

return(dat); }

//DS18B20写一个字节

WriteOneChar(unsignedchardat) {

unsignedchari=0; for(i=8;i>0;i--){

DQ=0;

DQ=dat&0x01; delay(5); DQ=1; dat>>=1; }

}

//读取DS18B20温度

intReadTemperature(void) {

unsignedchara=0; unsignedcharb=0; unsignedintt=0;

floattt=0;

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0x44);//启动温度转换 Init_DS18B20();

WriteOneChar(0xCC);//跳过读序号列号的操作

WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前

两个就是温度

a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a;

tt=t*0.0625;//将温度的高位与低位合并 t=tt*10+0.5;//对结果进行4舍5入 return(t); }

***

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

函数名:RTInputByte() 功能:实时时钟写入一字节

说明:往DS1302写入1Byte数据(内部函数) 入口参数:d写入的数据 返回值:无

设计:zhaojunjie日期:2002-03-19 修改:日期:

***

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

voidRTInputByte(uchard) {

uchari; ACC=d;

)

for(i=8;i>0;i--{

T_IO=ACC0;/*相当于汇编中的RRC*/ T_CLK=1; T_CLK=0; ACC=ACC>>1;

}

}

***

*******

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

本文来源:https://www.bwwdw.com/article/fqh2.html

Top