12864+ds1302+ds18b20数字时钟 - 温度 - 日期同步显示
更新时间:2023-10-31 01:25:01 阅读量: 综合文库 文档下载
- 1286是什么意思推荐度:
- 相关推荐
毕业(论文)说明书
题目类型: √ 理论研究
题 目:
系 别:
专 业:
指导老师:
学生姓名:
学 号:
实验研究 工程设计
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;
}
}
***
*******
/**********************************************************
正在阅读:
12864+ds1302+ds18b20数字时钟 - 温度 - 日期同步显示10-31
我的假小子同桌作文500字06-28
品字魂 学做人方案03-08
发酵(制药)工厂设计课程设计05-11
我是一张书桌作文400字06-28
桂林电子科技大学2022年考研试题912土木工程材料(2022-A)04-18
幼儿园大班语言游戏活动《小小播音员》案例与反思范文04-09
计算机基础第三章完新 - 图文11-23
考前问题备忘录02-27
教学能手评选理论考试试卷参考答案12-08
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 时钟
- 同步
- 温度
- 日期
- 数字
- 显示
- 12864
- ds
- 1302
- 18
- 20