电子万年历课程设计报告_第1页
电子万年历课程设计报告_第2页
电子万年历课程设计报告_第3页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、机电信息工程学院单片机系统课程设计报告系另专 业: 班 级: 设计题目: 学生姓名: 指导教师:完成日期:、设计任务与性能指标1.1 设计任务设计一个带有年月日、 时分秒及星期显示的电子日历。 要求用 Altium 6.0 画 出系统的电路原理图,印刷电路板,绘出程序流程图,并给出程序清单。1.2 性能指标电子日历的主要功能是给人们提供时间和日期信息,无论其形式如何,从外 部都可分为显示和校准两部分。 为使电子日历协调工作, 整个系统从功能上可分 为实时时钟、 显示和键盘三个模块, 分别完成时间和日期的计算以及人机交互的 管理。带有时钟(时分秒)和日期(年月日)和星期的显示。可进行时间及日期

2、的校正及报时点设置。1.3 系统要求带有时钟(时分秒)和日期(年月日)和星期的显示。可进行时间及日期的校正及报时点设置。二、方案选择2.1硬件方案实时时钟方案选择实时时钟(RTC: Real Time Clock)是系统的核心,其运行精度直接影响产 品质量。实时时钟的实现有两种方案可选, 一是利用单片机系统时钟和中断完成 时间和日期的计算;二是利用专用时钟芯片。前者不用附加芯片,系统简单,但 是累计误差较大, 只有短时计时才可使用。 长时间计时一般都采用后者。 后者采 用 32.768KHz 晶体振荡器振作为脉冲源,内部的 15 位计数器刚好产生标准秒脉 冲。该类芯片除时钟计时外, 还有年月日

3、和星期的计算功能, 并且还可计算闰年。 芯片初始化后可脱离 CPU 自动运行,有些芯片内部带有电池,出厂时芯片即开 始运行。专用时钟芯片的种类很多,与 CPU 的通信方式有并行,也有串行。常 见的芯片有DALLAS 公司生产的DS1302和DS12887,前者为串行,需要外加 后备电池; 后者为并行, 芯片内置锂电池和晶体振荡器, 无外加电源的情况下可 运行 10 年。本实验采用的是第二种方案,而且用的是 DS1302。显示方案选择简单的数据显示常采用液晶显示或数码管显示。液晶显示有耗电低、外形美 观的优点, 并且,点阵液晶可显示较复杂的字符或图案。 其缺点是通用液晶显示 器的显示方案构建不够

4、灵活, 在较暗的环境下液晶需要背光, 而且,液晶显示成 本较高。相对液晶显示器来讲,由于数码管种类繁多,其显示方案构建灵活,成 本较低。由于本身即是发光体,所以,数码管显示无需额外光源。数码管的缺点 是功耗较大,字符较多时,必须交流供电,而且,数码管不能显示复杂字型。考 虑到本实验的设计要求,选择的则是液晶显示。系统框图如图 1 所示:图1电子万年历的系统框图2.2软件方案系统软件可分为键盘管理、显示管理、报时管理和 RTC管理三部分。软件 可由汇编语言完成,也可由C语言完成。本实验米用的则是 C语言。三、硬件电路的设计与分析El02S1100iyiT 110532 Hl_33PFbGND1K

5、-oWETGHD111TO:XT AL1卩 0 M DUFO 1MD1XTAL2F0.2/AD2R2TPO.3/AD3PD.4/AD4PD.5/ADJ PO左他D£ PO.7/AD7EA/7PPF3J0 皿 DPSENP3JrTxDALE/PROGP3.2/INT0P1J0/T2P3.3/INT1P3.4/T0P3.5fTlPl.l/T 沁P3.5/MP1.2/ECIP37莎P1.3/CEX0P1.4EX1P2maPl S/CEX2P2.1ZA9Pl.fiEZSP2 2/A10Pl .70X4P23XL11vssP2.4/A12P2.5/A13P2.7/A15PsyC51ED2HBP

6、UI4013.1单片机模块本实验CPU采用的是STC89C52,单片机模块主要包括晶振电路,复位电 路,单片机芯片,P0 口作为输出连接液晶模块,P1 口连接实时时钟部分,P3 口 用来扫描键盘使用,如图2所示。3.2实时时钟模块实时时钟采用DS1302其中Vcci为后备电源,VCc2为主电源。在主电源关闭 的情况下,也能保持时钟的连续运行。DS1302由也1或Vcc2两者中的较大者供电。 当 仏2大于V=d+ 0.2V时,仏2给DS1302供电。当 仏2小于VCc1时,DS1302由 也1 供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把 RST输入驱动置高

7、电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字 节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允 许对DS1302进行操作。如果在传送过程中 RST置为低电平,则会终止此次数据 传送,I/O引脚变为高阻态。上电运行时,在 Vcc>2.5V之前,RST必须保持低电 平。只有在SCLK为低电平时,才能将 RST置为高电平。I/O为串行数据输入输 出端(双向),SCLK始终是输入端。DS1302与 P1 口连接。如图3所示:GNDBATTERYVCCY232.758k> SCLK

8、:VCCIRST1/0GNDDS1302U2814尹GNDC7GND3.3按键模块11' GND实时系统的按键共有4个:确定键,加一键,减一键,返回键。与 P2 口连接。 如图4所示:图4按键模块原理图3.4显示模块显示模块用的是液晶显示器1602, 1602采用标准的16脚接口。第1脚:VSS 为地电源。第2脚:VDD接5V正电源。第3脚:V0为液晶显示器对比度调整端, 接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”, 使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高 电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:RW为读写信号

9、线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写 入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当 RS为高 电平RW为低电平时可以写入数据。第 6脚:E端为使能端,当E端由高电平跳 变成低电平时,液晶模块执行命令。第 714脚:D0D7为8位双向数据线。 第1516脚:背光。DS1602的控制端与P3 口连接,而数据端与 P0 口连接。如 图5所示:Pl Header 16GND.| 1vcc|3.5报时模块1点钟响1声,12报时模块采用的蜂鸣器,具有整点报时的功能。例如: 点钟响12声。如图6所示:3.6测温模块测温模块主要采用的则是18B20,

10、 18B20是一个三脚的温度芯片,一脚接电 源,一脚接地,另一个脚是一跟信号线。18B20是一款仅使用一跟信号线与单片 机通信的温度测量芯片,这跟信号线既要包含时间信息,又要包含数据信息,因 此与单片机的硬件连接(物理层)比较简单。如图7所示:U?vcc|_OQvcc3DS1S207测温模块电路图四、系统软件设计4.1主程序设计程序软件部分流程图如图8所示:L开始图8主程序流程图4.2时钟芯片DS1302子程序设计DS1302的控制字节定义如表1所示。控制字节的最高有效位(位 7)必须 是逻辑1,如果为0,则不能把数按位写入 DS1302中。位6为0,表示存取日历 时钟数据;为1,表示存取RA

11、M数据。位5至位1指示操作单元的地址,最低有交往位(位0)为0, 总是从最低位开始输出。表示要执行写操作;为1,表示执行读操作,控制字节表1DS1302的控制字节定义DS1302共有12个寄存器,其中有7个与日历、时钟有关,存放的数据为BCD码,其日历、时间寄存器及其控制字如表 2所示。表2 DS1302各寄存器及控制字寄存器名命令字取值范围各位内容写操作读操作76543210秒寄存器80H81H0059CH10SECSEC分寄存器82H83H0059010MINMIN时寄存器84H85H0012 或 002312/24010/APHRHR日寄存器86H87H0128,29,30,310010

12、DATEDATE月寄存器88H89H011200010MMONTH周寄存器8AH8BH010700000DAY年寄存器8CH8DH009910YEARYEAR(开始 )初始化DS1302时分秒赋值为0DS1302禁止写入读取数据获取数组将数据转换成液晶显示字符串字符串存入数组( 返回图9 DS1302流程图4.3液晶显示芯片1602子程序设计1602液晶模块内部的字符发生存储器(CGROIM)经存储了 160个不同的点 阵字符图形,如表3所示液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块 的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字 符地址,也就是

13、告诉模块在哪里显示字符,表 4是DM-162的内部显示地址.表3 CGROM和CGRAM中字符代码与字符图形对应关系'高位 低位 '、0000001000110100010101100111101010111100110111101111X X X X0000CGRAM(1)0PP夕aPX X X X0001(2)!1AQaqo了厶aqX X X X0010(3)a2BRbrr39X X X X0011(4)#3CScsj亍£ooX X X X0100(5)$4DTds、工卜VQX X X X0101(6)%5EUeu才n(TuX X X X0110(7)&6

14、FVfv、力二Hp刀X X X X0111(8)>7GWgw7VgnX X X X1000(1)(8HXhxVXX X X X1001(2)9IYiy丿儿yX X X X1010(3)aJZgz工八j千X X X X1011(4)+Kk才口万X X X X1100(5)7L¥l|uX X X X1101(6)'Mmn口%X X X X1110(7)Nn3、nX X X X1111(8)OoJ、丿V0表4DM-162的内部显示地址12345678910111213141516000102030405060708090A0B0C0D0E0F第一行40414243444546

15、4748494A4B4C4D4E4F第二行初始化LCD设置显示模式设置输入模式确定输入位置字符输出到液晶返回图10 1602液晶显示子程序 流程4.4温度传感芯片18B20子程序设计18B20可以测量-55度到125度之间的温度,测量精度为0.5度。在DS1820中温度是以1/2度LSB (最低有效位)形式表示时产生以下 9位格式MSB最高位)(最低有效位)LSB1.11001110最高有效(符号)位被复制到存储器内两字节的温度寄存器中较高 MSB的所 有位这种符号扩展产生了如表5所示的16位温度读数。表5温度/数据关系温度数字输出/ (二进制)安息字输出(十八进制)+ 12500000000

16、 1111101000FAh+2500000000 001100100032h+ 1/200000000 000000010001h00000000 000000000000h11111111 11111111FFFFh11111111 11001110FFCEh11111111 10010010FF92h开始1!初始化1T读一个字节写一个字节读取温度将温度转换成液晶字符返回图1118B20温度传感子程序五、调试及性能分析流程5.1调试步骤1)硬件调试主要是检测硬件电路是否有短路、断路、虚焊等。具体步骤及测试结果如 下所示:由于在PCB图设计中按键封装选择有误,导致起初电路无任何反应,后经 万

17、用表测试,发现了错误原因,通过割线、飞线加以改正了电路的错误连接,实 现了预期功能。2)软件调试因为网上相似的万年历案例很多,基本相似的也不少,我们小组参照相关程 序进行调试,基本没遇到很困难的问题。5.2 性能分析单片机上电复位后,我们已经给 1302 赋了初值,按下控制键进入时间调整 状态,此时在我们调整哪一位时哪一位就会处于闪烁状态, 按下加 1 键被调整的 那一位就会加 1,按减一也会减 1,然后我们把时间调到当时的时间,屏幕也很 稳定,温度也自动的显示出来, 但经过我们仔细的观察之后, 时钟走的好像不是 很稳定,可能会有一定的误差, 所以我们的日历在性能上还有不完善的地方, 在 以后

18、的学习当中,我们将尽力把这些功能也完善好。六、心得体会经过这次的课程设计,我们对单片机、 PCB 其相关芯片的资料和运用有了 深刻的了解。同时,理论同实践相联系,使我们对这些知识的应用更加清楚。我们此次的设计产品为电子万年历, 基本功能包括时间, 日期,星期和温度 已经实现,报时功能因软件问题,未能实现。在调试过程中,起初无论如何复位,烧录的程序都未见任何现象,后来,在 用万用表测试串口模块硬件的过程中,发现按键全都短路了,经查看 PCB 图才 发现按键的封装反了,应该是横向短路、纵向开关,我们误把横向设计成开关、 纵向短路了。经过仔细校对、割线、飞线,才开始出现预定的现象。本次课程设计时间不

19、算长, 但是收获很大, 包括对单片机的认识, 对 AltiumDesigner 6软件使用的巩固和加深,对 DS1302的工作原理的了解等。同时也培 养了我们面对问题, 要耐心冷静处理的态度。 这次课程设计对我们今后的影响会 非常大。当然,非常感谢老师和同学们在我们遇到问题时的热情帮助。课程设计是一次很好的理论联系实践的动手机会, 增了我们的动手能力, 使 我们的理论知识得以应用, 今后我们会注重实践能力的锻炼, 注重动手能力的培 养。参考文献1 徐维祥、刘旭敏。 单片微型机原理及应用。 大连理工大学出版社, 19962 杨将新、李华军、刘东骏。 单片机程序设计及应用。 电子工业出版社, 20

20、063 刘文涛。 单片机语言 C51 典型应用设计。 人民邮电出版社, 20054 楼然苗、李光飞 . 51 系列单片机设计实例 . 北京航空航天大学出版社, 2003附录1系统硬件电路图1£1O P 诂 rff ti 當 S-9 血 5 S 2r/1上3W.-亍乳 sw -定 rKSLr W 二 £ J5Z 二兀 LIT; sw二2 =-.mfr £ =2 二< AVL 一 scns_£ EJV; _.£- -I卜s -£ 耳二£ 吕二匸 wi£ ?二£ §-*£=4fl自2应

21、ursd 护匚一 l_r一 附录 2 程序清单#include <REG51.H> #include <intrins.h>/#include "LCD1602.h"/#include "DS1302.h"#define uint unsigned int #define uchar unsigned charsbit DS1302_CLK = P1A4;sbitDS1302_IO= P1A3sbitDS1302_RST = P1A2;sbitwireless_1 =P3A0;sbitwireless_2 =P3A1;sbitwi

22、reless_3 =P3A2;sbitwireless_4 =P3A3;sbitACC0 = ACCA0;sbitACC7 = ACCA7;/实时时钟时钟线引脚/实时时钟数据线引脚/实时时钟复位线引脚/秒,分,时到日sbit Set = P2A0;sbit Up =卩2人1;sbit Down = P2A2;sbit out = P2A3;sbit DQ = P1A0;void show_time();/液晶显示程序* 1602液晶显示部分子程序 */char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year

23、; 月,年位闪的计数/模式切换键/加法按钮/减法按钮/立刻跳出调整模式按钮/ 温度传送数据 IO 口char done,count,temp,flag,up_flag,down_flag; uchar temp_value;/温度值 uchar TempBuffer5,week_value2;/Port Definitions*sbit LcdRssbit LcdRw= P2A5;= P2A6;*sbit LcdEn = P2A7;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0. 数据端口sfr DBPort = 0x80; / 内*unsigned char LCD_Wai

24、t(void)LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_();LcdEn=0; return DBPort;写入命数据/ 向 LCD*#define LCD_COMMAND0 / Command#define LCD_DATA#define LCD_CLEAR_SCREEN#define LCD_HOMING1 / Data0x01/ 清屏0x02/ 光标返回原点void LCD_Write(bit style, unsigned char input) LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input; _n

25、op_();/ 注意顺序LcdEn=1;_nop_();/ 注意顺序LcdEn=0;_nop_();LCD_Wait();*#define LCD_SHOW0x04/显示开#define LCD_HIDE0x00/ 显示关#define LCD_CURSOR0x02/ 显示光标#define LCD_NO_CURSOR0x00/无光标#define LCD_FLASH0x01/光标闪动#define LCD_NO_FLASH0x00/光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|Di

26、splayMode);#define LCD_AC_UP0x020x00/ default#define LCD_AC_DOWN#define LCD_MOVE0x01/ 画面可平移#define LCD_NO_MOVE0x00/default/设置输入模式*void LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);LCD* *void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); /8 位数据端口 ,2 行显示 ,5*7 点阵 LCD_

27、Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);/ 开启显示 , 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);/清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC 递增 , 画面不动 / 液晶字符输入的位置 * void GotoXY(unsigned char x, unsigned char y) if(y=0) LCD_Write(LCD_COMMAND,0x80|x);if(y=1) LCD_Write(LCD_COMMAND,0x8

28、0|(x-0x40); /将字符输出到液晶显示void Print(unsigned char *str)while(*str!='0')LCD_Write(LCD_DATA,*str);str+;/*DS1302时钟部分子程序 */ typedef struct _SYSTEMTIME unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week;unsigned char Day; unsigned char Month;unsigned char Year; unsig

29、ned char DateString11; unsigned char TimeString9;SYSTEMTIME; /定义的时间类型 SYSTEMTIME CurrentTime;#define AM(X)X#define PM(X)(X+12)#define DS1302_SECOND0x80#define DS1302_MINUTE0x82#define DS1302_HOUR0x84#define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C/ 转成 24 小

30、时制/ 时钟芯片的寄存器位置 ,存放时间void DS1302InputByte(unsigned char d) unsigned char i;ACC = d;for(i=8; i>0; i-)DS1302_IO = ACC0;DS1302_CLK = 1;DS1302_CLK = 0;ACC = ACC >> 1;/ 实时时钟写入一字节 (内部函数 )/相当于汇编中的 RRCunsigned char DS1302OutputByte(void) unsigned char i;for(i=8; i>0; i-)/ 实时时钟读取一字节 (内部函数 )ACC = A

31、CC >>1; ACC7 = DS1302_IO; DS1302_CLK = 1;/相当于汇编中的 RRCDS1302_CLK = 0; return(ACC);void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302 地址 , ucData:要写的数据DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr);/ 地址,命令DS1302InputByte(ucDa);/ 写 1Byte 数据DS1302_CLK = 1

32、;DS1302_RST = 0;*Time) / 获取时钟芯片的时钟数据到自定义的结构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 DS1

33、302_GetTime(SYSTEMTIME型数组unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time->Minute = (ReadV alue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_

34、HOUR);Time->Hour = (ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = (ReadV alue&0x70)>>4)*10 + (ReadV alue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = (ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);Read

35、Value = Read1302(DS1302_MONTH);Time->Month = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = (ReadValue&0x70)>>4)*10 + (ReadV alue&0x0F);void DateToStr(SYSTEMTIME *Time)/将时间年 ,月,日,星期数据转换成液晶显示字符串 ,放到数组里 DateString if(hide_yea

36、r<2)/ 这里的 if,else 语句都是判断位闪烁 ,<2 显示数据 ,>2就不显示 ,输出字符串为 2007/07/22Time->DateString0 = '2'Time->DateString1 = '0'Time->DateString2 = Time->Year/10 + '0'Time->DateString3 = Time->Year%10 + '0'elseTime->DateString0 = ' 'Time->DateStr

37、ing1 = ' 'Time->DateString2 = ' 'Time->DateString3 = ' 'Time->DateString4 = '/'if(hide_month<2)Time->DateString5 = Time->Month/10 + '0'Time->DateString6 = Time->Month%10 + '0'elseTime->DateString5 = ' 'Time->DateSt

38、ring6 = ' 'Time->DateString7 = '/' if(hide_day<2)Time->DateString8 = Time->Day/10 + '0'Time->DateString9 = Time->Day%10 + '0'elseTime->DateString8 = ' 'Time->DateString9 = ' ' if(hide_week<2)week_value0 = Time->Week%10 + &

39、#39;0' /星期的数据另外放到 week_value 数组里 , 跟年 ,月,日的分开存放 ,因为等一下要在最后显示else week_value0 = ' 'week_value1 = '0'Time->DateString10 = '0' / 字符串末尾加 '0' , 判断结束字符void TimeToStr(SYSTEMTIME *Time) /将时 ,分 ,秒数据转换成液晶显示字符放到数组 TimeString; if(hide_hour<2)Time->TimeString0 = Time-

40、>Hour/10 + '0'Time->TimeString1 = Time->Hour%10 + '0'elseTime->TimeString0 = ' 'Time->TimeString1 = ' 'Time->TimeString2 = ':'if(hide_min<2)Time->TimeString3 = Time->Minute/10 + '0'Time->TimeString4 = Time->Minute%10 +

41、'0'elseTime->TimeString3 = ' 'Time->TimeString4 = ' 'Time->TimeString5 = ':'if(hide_sec<2)Time->TimeString6 = Time->Second/10 + '0'Time->TimeString7 = Time->Second%10 + '0'elseTime->TimeString6 =Time->TimeString7 = Time-&g

42、t;DateString8 = '0'void Initial_DS1302(void)/时钟芯片初始化unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80)/判断时钟芯片是否关闭Write1302(0x8e,0x00); / 写入允许Write1302(0x8c,0x07); / 以下写入初始化时间 日期:07/07/25.星期: 3. 时间 : 23:59:55 Write1302(0x88,0x07);Write1302(0x86,0x25);Write1302(0x8a,0x07);Write1

43、302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); / 禁止写入/*ds18b20子程序 */*ds18b20延迟子函数(晶振 12MHz ) */void delay_18B20(unsigned int i) while(i-); void Init_DS18B20(void)/*ds18b20初始化函数 *unsigned char x=0;DQ = 1; /DQ 复位delay_18B20(8); / 稍做延时DQ = 0; /单片机将 DQ 拉低 delay_18B20(80);

44、 / 精确延时 大于 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;i>0;i-)DQ = 0; / 给脉冲信号 dat>>=1;DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); return(dat); void WriteOneC

45、har(uchar dat) * *ds18b20写一个字节 *unsigned char i=0;for (i=8; i>0; i-)DQ = 0;DQ = dat&0x01; delay_18B20(5);DQ = 1; dat>>=1;void ReadTemp(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作 WriteOneChar(0x44); / 启动温度转换delay_18B20(100);

46、/ this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作前两个就是温度WriteOneChar(0xBE); /读取温度寄存器等(共可读 9 个寄存器)delay_18B20(100);a=ReadOneChar();/读取温度值低位b=ReadOneChar();/ 读取温度值高位temp_value=b<<4;temp_value+=(a&0xf0)>>4;void temp_to_str()/温度数据转换成液晶字符显示TempBuffer0=temp_val

47、ue/10+'0' / 十位 TempBuffer1=temp_value%10+'0' /个位 TempBuffer2=0xdf;/ 温度符号TempBuffer3='C'TempBuffer4='0'void Delay1ms(unsigned int count)unsigned int i,j; for(i=0;i<count;i+) for(j=0;j<120;j+); /* 延时子程序 */ void mdelay(uint delay) uint i;for(;delay>0;delay-) for

48、(i=0;i<62;i+) /1ms 延时 .;void outkey()/ 跳出调整模式 ,返回默认显示 uchar Second;if(out=0|wireless_1=1) mdelay(8);count=0; hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0; Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); / 写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E

49、,0x80);/ 禁止写入done=0;while(out=0);while(wireless_1=1);/void Upkey()/ 升序按键Up=1;if(Up=0|wireless_2=1)mdelay(8);switch(count)case 1:temp=Read1302(DS1302_SECOND); /读取秒数 temp=temp+1; /秒数加 1 up_flag=1;/ 数据调整后更新标志if(temp&0x7f)>0x59)/超过 59 秒,清零temp=0;break;case 2:temp=Read1302(DS1302_MINUTE); / 读取分数 t

50、emp=temp+1; /分数加 1 up_flag=1;if(temp>0x59)/超过 59 分 ,清零temp=0;break;temp=Read1302(DS1302_HOUR); / 读取小时数 temp=temp+1; /小时数加 1default:break;up_flag=1;if(temp>0x23)/ 超过 23 小时 ,清零temp=0;break;case 4:temp=Read1302(DS1302_WEEK); / 读取星期数 temp=temp+1; /星期数加 1 up_flag=1;if(temp>0x7)temp=1;break;case 5:temp=Read1302(DS1302_DAY); / 读取日数 temp=temp+1; /日数加 1up_flag=1;if(temp>0x31)temp=1;break;case 6:t

温馨提示

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

评论

0/150

提交评论