电子钟温度计课程设计电子钟温度计的设计_第1页
电子钟温度计课程设计电子钟温度计的设计_第2页
电子钟温度计课程设计电子钟温度计的设计_第3页
电子钟温度计课程设计电子钟温度计的设计_第4页
电子钟温度计课程设计电子钟温度计的设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、*大学物信学院单片机课程设计 课 题 :电子钟温度计的设计 指导老师:* 姓 名: * 学 号:* 摘要:该设计实现了24小时制的时间显示及设定、年、月、日、星期的显示及设定、温度的检测及显示等功能。设计共分为四大部分,分别是控制部分、时钟部分、温度检测部分和人机交互部分。本设计采用的是STC89C51RC单片机,内部带有8KB的ROM,能够存储大量的程序,最突出特点是具有ISP在系统烧写功能,使得烧写程序更加方便。计时采用DS1302时钟芯片实现,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、星期、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电

2、池准确计时。温度检测采用DALLAS公司的数字化温度传感器DS18B20,该芯片采用的是独特的“一线总线”的方式与单片机进行通信,一线总线独特而且经济的特点,是用户可以轻松的组建传感器网络,为测量系统的构建引入全新的概念。实时温度采用一线总线的方式传输大大的提高了信号的抗干扰性,分辨率可通过软件设置,其小巧的体积为各种环境下测量温度提供了方便。显示器件采用通用型1602液晶,可显示32个字符,如果使用数码管来做显示器件需消耗大量的系统资源,因此采用低功耗的1602液晶,该液晶显示方便,功能强大,完全能满足数字万年历的显示要求。关键词:单片机AT89C51温度传感器DS18B20时钟芯DS130

3、2 液晶1602目录第一章 设计任务-4第二章 电路设计 2.1设计方案比较 4 2.1.1 时钟电路的设计4 2.1.2 温度电路的设计5 2.2根据设计绘制整体方框图及硬件图6 2.2.1整体方框图6 2.2.2总体硬件图6第3章 程序流程图 3.1主程序流程图7 3.2 键盘服务程序流程图7 3.3 温度采集与显示程序流程图-8第四章模块设计及说明 4.1 液晶显示模块 4.1.1 DS1602简介-8 4.1.2 DS1602相应功能特性介绍-8 4.1.3 DS1602液晶与单片机接口电路9 4.2计数模块 4.2.1 DS1302特性介绍9 4.2.2 DS1302引脚介绍9 4.

4、2.3 DS1302与单片机接口电路10 4.3实时环境温度采集模块 4.3.1 DS18B2O简介10 4.3.2 单总线介绍10 4.3.3 DS18B20管脚介绍10 4.3.4 DS18B20时序介绍10 4.3.5 DS18B20与单片机的接口电路-114.4 设置模块11第五章 调试与验证11第一章 设计任务(1)能够实现时间的正确显示,并且可以对表进行调整。(2)能够实现年月日及星期的显示,并且可以对日期进行调整。(3)能够实现对温度的及时检测,并且可以正确显示。 (4)用protues实现对设计的仿真。第二章 电路设计2.1电路方案的比较时钟电路的设计方案一:时钟电路可由555

5、定时器组成,通过555定时器构成1Hz脉冲发生电路(如图2-1),然后将脉冲机输入单片机,经单片机计算生成时钟。脉冲信号从555的3号引脚输出,通过电阻和电容可以得到不同频率的脉冲。其计算方法为tpl=R2C2ln2;tph=(R1+R2)C2ln2。图2-1 555秒脉冲发生电路方案二:用单片机控制专用时钟芯片DS1302(如图2-2),通过对时钟芯片的初始化设置、写数据、读数据等操作,实现对时钟信息的获取。图2-3 DS1302与单片机连接图比较:两个方案虽然都能实现时钟的功能,但是方案一由于电阻电容及其自身的精度影响,其生成的秒脉冲精度相对差一些,且将秒脉冲信号换算成时钟的编程也相对复杂

6、,而方案二能够较好地弥补方案一的不足。所以本设计中的时钟电路采用方案二的设计。2.1.2温度检测电路的设计方案一:利用热敏电阻对温度特殊的温度效应,可以通过一个比较简单的电路将温度信号转换成相应的电压信号,为了使电压信号更便于精确测量,可以利用运放将电压信号放大,再经模数转换将电压信号送入单片机,最后通过单片机的计算得出温度值,送入数码管显示。方案二:利用单片机对温度传感器DS18B20的控制,获取温度传感器所采集的温度信号(如图2-3)。图2-3 DS18B20与单片机连接图比较:方案一原理容易理解,但实际操作很有难度。不仅自己设计电路精度不能保证,而且外围电路复杂,成本也较高。而由图2-3

7、可以直观看出方案二简单方便,且精度较高,所以本设计中的温度检测电路采用方案二。显示模块(1602液晶)2.2根据设计绘制整体方框图及硬件图整体方框图 AT89C51时间计算模块设置模块(独立按键)实时温度采集模块DS18B20总体硬件图第三章 程序流程图3.1主程序流程图启动读取DS1302时钟芯片读取DS18B20温度传感器扫描显示液晶暂存数组的内容当前工作 模式按键处理是否有键按下T0开始定时写入液晶暂存数组获得按键减1加1 设置按键值返回主程序3.2 键盘服务程序流程图3.3 温度采集与显示程序流程图第四章模块设计及说明4.1 液晶显示模块4.1.1 DS1602简介1602液晶也叫16

8、02字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔,每行之间也有也有间隔,起到了字符间距和行间距的作用。1602的驱动电路带有11条指令,可以很方便的控制液晶的现实效果如:清屏、左移右移、光标显示。而且1602显示的字符在下一条指令为到来之前不会改变,也就是能够维持显示的字符,1602液晶占用的系统资源也少。在编程时必须注意1602的初始化和三个控制口的编写,确保从DS1302和18B20中读出的数据正确输入。4.1.2 DS1602相应功能特性介绍n +5V电压,对比度可

9、调n 内含复位电路n 提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能n 有80字节显示数据存储器DDRAMn 内建有160个5X7点阵的字型的字符发生器CGROMn 8个可由用户自定义的5X7的字符发生器CGRAM4.1.3 DS1602液晶与单片机接口电路4.2计数模块4.2.1 DS1302特性介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年

10、补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。4.2.2 DS1302引脚介绍各引脚的功能为:1、 Vcc2:5V电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。 2、3、X1、X2 是外接晶振脚 (32.768KHZ的晶振)4、地(GND)5、CE/RST:复位脚6、I/O:数据输入输出口;7、SCLK:串行时钟,输入; 8、Vcc1:备用电池端;DS1302通过三根口线实现与单片机的通信,因DS130

11、2功耗很小,即使电源掉电后通过3V的纽扣电池仍能维持DS1302精确走时。4.2.3 DS1302与单片机接口电路4.3实时环境温度采集模块4.3.1 DS18B2O简介DS18B20是美国DALLAS公司生产的数字温度传感器,采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。测量温度范围宽,测量精度高,在使用中不需要任何外围元件,支持多点组网功能多个 DS18B20 可以并联在惟一的单线上,实现多点测温,供电

12、方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。因此非常适合本系统使用。4.3.2 单总线介绍n 单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。n 单总线通常要求外接一个约为 4.7K10K 的上拉电阻,这样,当总线闲置时其状态为高电平。4.3.3 DS18B20管脚介绍1 GND为电源地;2DQ为数字信号输入输出端3 VDD为外接供电电源输入端,在寄生电源4.3.4 DS18B20时序介绍DS18B20的一线工作协议流程是:初始化ROM操作指令存储器操作指令数据传输

13、。其工作时序包括:l 初始化时序l 写时序l 读时序4.3.5 DS18B20与单片机的接口电路4.4 设置模块采用4个独立按键,接口电路如下;第五章 调试与验证本设计采用protues软件进行仿真,经过反复的调试最终仿真通过。可以实现预期的功能。部分功能演示如图5-1所示附录一:程序#include<reg51.h>#include"DS18B20_3.H"#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,te

14、mp;/flag用于读取头文件中的温度值,和显示温度值#define yh 0x80 /LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 /LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)/液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)sbit rs=P25;sbit rw=P26; /如果硬件上rw接地,就不用写这句和后面的rw=0了sbit en=P27;sbit SCLK = P16; /*实时时钟时钟线引脚 */sbit IO = P35; /*实时时钟数据线引脚 */

15、sbit RST = P17; /*实时时钟复位线引脚 */sbit ACC0=ACC0;sbit ACC7=ACC7;/校时按键与C51的引脚连接定义sbit key1=P32; /设置键sbit key2=P33; /加键sbit key3=P34; /减键uchar code tab1="20 - - " /年显示的固定字符uchar code tab2=" : : "/时间显示的固定字符/延时函数,后面经常调用void delay(uint xms)/延时函数,有参函数uint x,y;for(x=xms;x>0;x-) for(y=110

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

17、;en=0; /en由高变低,产生下降沿,液晶执行命令lcd_init()/*液晶初始化函数*write_1602com(0x38);/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);/开显示不显示光标write_1602com(0x06);/整屏不移动,光标自动右移write_1602com(0x01);/清显示write_1602com(yh+1);/日历显示固定符号从第一行第1个位置之后开始显示for(a=0;a<14;a+)write_1602dat(tab1a);/向液晶屏写日历显示的固定符号部分/delay(3);write

18、_1602com(er+2);/时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a<8;a+)write_1602dat(tab2a);/写显示时间固定符号,两个冒号/delay(3);/*DS1302有关子函数*/void write_byte(uchar dat)/写一个字节ACC=dat;RST=1;for(a=8;a>0;a-)IO=ACC0;SCLK=0;SCLK=1;ACC=ACC>>1;uchar read_byte()/读一个字节RST=1;for(a=8;a>0;a-)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC&g

19、t;>1;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;uchar read_1302(uchar add)/从1302读数据函数,指定读取数据来源地址uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);uchar BCD_Decimal(uch

20、ar bcd)/BCD码转十进制函数,输入BCD,返回十进制 uchar Decimal; Decimal=bcd>>4; return(Decimal=Decimal*10+(bcd&=0x0F);/-void ds1302_init() /1302芯片初始化子函数(2010-01-07,12:00:00,week4)RST=0;SCLK=0;write_1302(0x8e,0x00); /允许写,禁止写保护 /write_1302(0x80,0x00); /向DS1302内写秒寄存器80H写入初始秒数据00/write_1302(0x82,0x00);/向DS1302内

21、写分寄存器82H写入初始分数据00/write_1302(0x84,0x12);/向DS1302内写小时寄存器84H写入初始小时数据12/write_1302(0x8a,0x04);/向DS1302内写周寄存器8aH写入初始周数据4/write_1302(0x86,0x07);/向DS1302内写日期寄存器86H写入初始日期数据07/write_1302(0x88,0x01);/向DS1302内写月份寄存器88H写入初始月份数据01/write_1302(0x8c,0x10);/向DS1302内写年份寄存器8cH写入初始年份数据10write_1302(0x8e,0x80); /打开写保护/温

22、度显示子函数void write_temp(uchar add,uchar dat)/向LCD写温度数据,并指定显示位置uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(er+add);/er是头文件规定的值0x80+0x40write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码 write_1602dat(0xdf);/显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码 write_1602

23、dat(0x43);/显示"C"符号,0x43是液晶屏字符库里大写C的地址码/时分秒显示子函数void write_sfm(uchar add,uchar dat)/向LCD写时分秒,有显示位置加、现示数据,两个参数uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字write_1602com(er+add);/er是头文件规定的值0x80+0x40write_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码/年月日

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

25、期字符的显示位置switch(week)case 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('E&

26、#39;); 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时显示

27、write_1602dat('T'); write_1602dat('A'); break;case 7:write_1602dat('S');/星期数据为7时显示 write_1602dat('U'); write_1602dat('N'); break;/*键盘扫描有关函数*void keyscan()if(key1=0)/-key1为功能键(设置键)-delay(9);/延时,用于消抖动if(key1=0)/延时后再次确认按键按下while(!key1);key1n+;if(key1n=9)key1n=1;/

28、设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环switch(key1n)case 1: TR0=0;/关闭定时器/TR1=0;write_1602com(er+0x09);/设置按键按动一次,秒位置显示光标 write_1602com(0x0f);/设置光标为闪烁 temp=(miao)/10*16+(miao)%10;/秒数据写入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);/miao write_1302(0x8e,0x80); break;case 2: write_1602com(er+6);/按2次fe

29、n位置显示光标 /write_1602com(0x0f);break;case 3: write_1602com(er+3);/按动3次,shi /write_1602com(0x0f);break;case 4: write_1602com(yh+0x0e);/按动4次,week /write_1602com(0x0f);break;case 5: write_1602com(yh+0x0a);/按动5次,ri /write_1602com(0x0f);break;case 6: write_1602com(yh+0x07);/按动6次,yue /write_1602com(0x0f);br

30、eak;case 7: write_1602com(yh+0x04);/按动7次,nian /write_1602com(0x0f);break;case 8:write_1602com(0x0c);/按动到第8次,设置光标不闪烁TR0=1;/打开定时器 temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);/miao数据写入DS1302 write_1302(0x8e,0x80); break;/-加键key2-if(key1n!=0)/当key1按下以下。再按以下键才有效(按键次数不等于

31、零)if(key2=0) /上调键delay(10);if(key2=0)while(!key2);switch(key1n)case 1:miao+;/设置键按动1次,调秒if(miao=60)miao=0;/秒超过59,再加1,就归零write_sfm(0x08,miao);/令LCD在正确位置显示"加"设定好的秒数temp=(miao)/10*16+(miao)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); /允许写,禁止写保护 write_1302(0x80,temp); /向DS1302内写秒寄存器80H写入调整后的

32、秒数据BCD码 write_1302(0x8e,0x80); /打开写保护write_1602com(er+0x09);/因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回/write_1602com(0x0b);break;case 2:fen+;if(fen=60)fen=0;write_sfm(0x05,fen);/令LCD在正确位置显示"加"设定好的分数据temp=(fen)/10*16+(fen)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写,禁止写保护 write_1302(0x82,temp);

33、/向DS1302内写分寄存器82H写入调整后的分数据BCD码 write_1302(0x8e,0x80);/打开写保护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(0x8e,0x00);/允许写,禁止写保护 write_1302(0x84,temp)

34、;/向DS1302内写小时寄存器84H写入调整后的小时数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(er+3);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 4:week+;if(week=8)week=1; write_1602com(yh+0x0C);/指定'加'后的周数据显示位置write_week(week);/指定周数据显示内容 temp=(week)/10*16+(week)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写

35、,禁止写保护 write_1302(0x8a,temp);/向DS1302内写周寄存器8aH写入调整后的周数据BCD码 write_1302(0x8e,0x80);/打开写保护 write_1602com(yh+0x0e);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 5:ri+;if(ri=32)ri=1;write_nyr(9,ri);/令LCD在正确的位置显示"加"设定好的日期数据temp=(ri)/10*16+(ri)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写,禁止写

36、保护 write_1302(0x86,temp);/向DS1302内写日期寄存器86H写入调整后的日期数据BCD码 write_1302(0x8e,0x80);/打开写保护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码 write_1302(0x8e,0x00);/允许写,禁止

37、写保护 write_1302(0x88,temp);/向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);/打开写保护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(0x8e,0x00

38、);/允许写,禁止写保护 write_1302(0x8c,temp);/向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(yh+4);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;/-减键key3,各句功能参照'加键'注释-if(key3=0)delay(10);/调延时,消抖动if(key3=0)while(!key3);switch(key1n)case 1:miao-;if(miao=-1)miao=59;/秒数据减到-1时自动变成59write

39、_sfm(0x08,miao);/在LCD的正确位置显示改变后新的秒数 temp=(miao)/10*16+(miao)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); /允许写,禁止写保护 write_1302(0x80,temp); /向DS1302内写秒寄存器80H写入调整后的秒数据BCD码 write_1302(0x8e,0x80); /打开写保护write_1602com(er+0x09);/因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置/write_1602com(0x0b);break;case 2:fen-;i

40、f(fen=-1)fen=59;write_sfm(5,fen);temp=(fen)/10*16+(fen)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写,禁止写保护 write_1302(0x82,temp);/向DS1302内写分寄存器82H写入调整后的分数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(er+6);/因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置break;case 3:shi-; if(shi=-1)shi=23;write_sfm(2,shi

41、);temp=(shi)/10*16+(shi)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写,禁止写保护 write_1302(0x84,temp);/向DS1302内写小时寄存器84H写入调整后的小时数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(er+3);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 4:week-;if(week=0)week=7; write_1602com(yh+0x0C);/指定'加'后的周数据显示位置

42、write_week(week);/指定周数据显示内容 temp=(week)/10*16+(week)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写,禁止写保护 write_1302(0x8a,temp);/向DS1302内写周寄存器8aH写入调整后的周数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(yh+0x0e);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 5:ri-;if(ri=0)ri=31;write_nyr(9,ri);temp=(r

43、i)/10*16+(ri)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);/允许写,禁止写保护 write_1302(0x86,temp);/向DS1302内写日期寄存器86H写入调整后的日期数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(yh+10);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 6:yue-;if(yue=0)yue=12;write_nyr(6,yue);temp=(yue)/10*16+(yue)%10;/十进制转换成DS1302要求的

44、DCB码 write_1302(0x8e,0x00);/允许写,禁止写保护 write_1302(0x88,temp);/向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(yh+7);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;case 7:nian-; if(nian=-1)nian=99;write_nyr(3,nian); temp=(nian)/10*16+(nian)%10;/十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00

45、);/允许写,禁止写保护 write_1302(0x8c,temp);/向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);/打开写保护write_1602com(yh+4);/因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位break;void timer0() interrupt 1 /取得并显示日历和时间 /Init_DS18B20();/温度传感器DS18b2初始化子函数,在头文件中 flag=ReadTemperature();/将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示 /读取秒时分周日月年七

46、个数据(DS1302的读寄存器与写寄存器不一样): miao = BCD_Decimal(read_1302(0x81);fen = BCD_Decimal(read_1302(0x83);shi = BCD_Decimal(read_1302(0x85);ri = BCD_Decimal(read_1302(0x87);yue = BCD_Decimal(read_1302(0x89);nian=BCD_Decimal(read_1302(0x8d);week=BCD_Decimal(read_1302(0x8b);/显示温度、秒、时、分数据: write_temp(12,flag);/显示

47、温度,从第二行第12个字符后开始显示 write_sfm(8,miao);/秒,从第二行第8个字后开始显示(调用时分秒显示子函数)write_sfm(5,fen);/分,从第二行第5个字符后开始显示write_sfm(2,shi);/小时,从第二行第2个字符后开始显示/显示日、月、年数据:write_nyr(9,ri);/日期,从第二行第9个字符后开始显示 write_nyr(6,yue);/月份,从第二行第6个字符后开始显示write_nyr(3,nian);/年,从第二行第3个字符后开始显示write_week(week);/-void init() /定时器、计数器设置函数TMOD=0x11; /指定定时/计数器的工作方式为3TH0=0; /定时器T0的高四位=0TL0=0; /定时器T0的低四位=0EA=1; /系统允许有开放的中断ET0=1; /允许T0中断TR0=1; /开启中断,启动定时器/*主函数*void main()lcd_init(); /调用液晶屏初始化子函数ds1302_init(); /调用DS1302时钟的初始化子函数init(); /调用定时计数器的设置子函数while(1

温馨提示

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

评论

0/150

提交评论