DS1302时钟+DS18B20用LCD1602显示.docx

上传人:牧羊曲112 文档编号:3155909 上传时间:2023-03-11 格式:DOCX 页数:21 大小:42.44KB
返回 下载 相关 举报
DS1302时钟+DS18B20用LCD1602显示.docx_第1页
第1页 / 共21页
DS1302时钟+DS18B20用LCD1602显示.docx_第2页
第2页 / 共21页
DS1302时钟+DS18B20用LCD1602显示.docx_第3页
第3页 / 共21页
DS1302时钟+DS18B20用LCD1602显示.docx_第4页
第4页 / 共21页
DS1302时钟+DS18B20用LCD1602显示.docx_第5页
第5页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《DS1302时钟+DS18B20用LCD1602显示.docx》由会员分享,可在线阅读,更多相关《DS1302时钟+DS18B20用LCD1602显示.docx(21页珍藏版)》请在三一办公上搜索。

1、DS1302时钟+DS18B20用LCD1602显示DS1302时钟+DS18B20用LCD1602显示 看仔细点啊 貌似很多这样的图但可不一样喔 最小系统是用AT89s52搭建的!记得回去自己用protues和Keil仿真一下,这样有利于进一步了解!故未将仿真好的代码上传,如果真的需要的话可以和我联系! 程序代码: #include #include /#include LCD1602.h /#include DS1302.h #define uint unsigned int #define uchar unsigned char sbit DS1302_CLK = P17; /实时时钟时

2、钟线引脚 sbit DS1302_IO = P16; /实时时钟数据线引脚 sbit DS1302_RST = P15; /实时时钟复位线引脚 sbit wireless_1 = P30; sbit wireless_2 = P31; sbit wireless_3 = P32; sbit wireless_4 = P33; sbit ACC0 = ACC0; sbit ACC7 = ACC7; char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数 sbit Set

3、 = P20; /模式切换键 sbit Up = P21; /加法按钮 sbit Down = P22; /减法按钮 sbit out = P23; /立刻跳出调整模式按钮 sbit DQ = P10; /温度传送数据IO口 char done,count,temp,flag,up_flag,down_flag; uchar temp_value; /温度值 uchar TempBuffer5,week_value2; void show_time; /液晶显示程序 /*1602液晶显示部分子程序*/ /Port Definitions* sbit LcdRs = P25; sbit LcdR

4、w = P26; sbit LcdEn = P27; sfr DBPort = 0x80; /P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口 /内部等待函数* unsigned char LCD_Wait(void) LcdRs=0; LcdRw=1; _nop_; LcdEn=1; _nop_; LcdEn=0; return DBPort; /向LCD写入命令或数据* #define LCD_COMMAND 0 / Command #define LCD_DATA 1 / Data #define LCD_CLEAR_SCREEN 0x01 / 清屏 #defin

5、e LCD_HOMING 0x02 / 光标返回原点 void LCD_Write(bit style, unsigned char input) LcdEn=0; LcdRs=style; LcdRw=0; _nop_; DBPort=input; _nop_;/注意顺序 LcdEn=1; _nop_;/注意顺序 LcdEn=0; _nop_; LCD_Wait; /设置显示模式* #define LCD_SHOW 0x04 /显示开 #define LCD_HIDE 0x00 /显示关 #define LCD_CURSOR 0x02 /显示光标 #define LCD_NO_CURSOR

6、0x00 /无光标 #define LCD_FLASH 0x01 /光标闪动 #define LCD_NO_FLASH 0x00 /光标不闪动 void LCD_SetDisplay(unsigned char DisplayMode) LCD_Write(LCD_COMMAND, 0x08|DisplayMode); /设置输入模式* #define LCD_AC_UP 0x02 #define LCD_AC_DOWN 0x00 / default #define LCD_MOVE 0x01 / 画面可平移 #define LCD_NO_MOVE 0x00 /default void LCD

7、_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_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏 LCD_SetInput(LCD_

8、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,0x80|(x-0x40); /将字符输出到液晶显示 void Print(unsigned char *str) while(*str!=0) LCD_Write(LCD_DATA,*str); str+; /*DS1302时钟部分子程序*/ typedef struct _SY

9、STEMTIME_ unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString11; unsigned char TimeString9; SYSTEMTIME; /定义的时间类型 SYSTEMTIME CurrentTime; #define AM(X) X #define PM(X) (X+12) / 转成24小时制

10、 #define DS1302_SECOND 0x80 /时钟芯片的寄存器位置,存放时间 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C void DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) DS130

11、2_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) 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 u

12、cDa) /ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr) /读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0;

13、DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte; / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组 unsigned char ReadValue; ReadValue = Read1302(DS1302_SECOND); Time-Second = (ReadValue&0x70)4)*10 +

14、 (ReadValue&0x0F); ReadValue = Read1302(DS1302_MINUTE); Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_HOUR); Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_DAY); Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue =

15、Read1302(DS1302_WEEK); Time-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MONTH); Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_YEAR); Time-Year = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); void DateToStr(SYSTEMTIME *Time) /将时间年,月,日,

16、星期数据转换成液晶显示字符串,放到数组里DateString if(hide_year2) /这里的if,else语句都是判断位闪烁,2就不显示,输出字符串为 2007/07/22 Time-DateString0 = 2; Time-DateString1 = 0; Time-DateString2 = Time-Year/10 + 0; Time-DateString3 = Time-Year%10 + 0; else Time-DateString0 = ; Time-DateString1 = ; Time-DateString2 = ; Time-DateString3 = ; Ti

17、me-DateString4 = /; if(hide_monthDateString5 = Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0; else Time-DateString5 = ; Time-DateString6 = ; Time-DateString7 = /; if(hide_dayDateString8 = Time-Day/10 + 0; Time-DateString9 = Time-Day%10 + 0; else Time-DateString8 = ; Time-DateString9 = ; if

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

19、else Time-TimeString0 = ; Time-TimeString1 = ; Time-TimeString2 = :; if(hide_minTimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 + 0; else Time-TimeString3 = ; Time-TimeString4 = ; Time-TimeString5 = :; if(hide_secTimeString6 = Time-Second/10 + 0; Time-TimeString7 = Time-Second%10

20、 + 0; else Time-TimeString6 = ; Time-TimeString7 = ; Time-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); W

21、rite1302(0x86,0x25); Write1302(0x8a,0x07); Write1302(0x84,0x23); Write1302(0x82,0x59); Write1302(0x80,0x55); Write1302(0x8e,0x80); /禁止写入 /*ds18b20子程序*/ /*ds18b20延迟子函数*/ void delay_18B20(unsigned int i) while(i-); /*ds18b20初始化函数*/ void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(8

22、); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 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 = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B2

23、0(4); return(dat); /*ds18b20写一个字节*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat=1; /*读取ds18b20当前温度*/ void ReadTemp(void) unsigned char a=0; unsigned char b=0; unsigned char t=0; Init_DS18B20; WriteOneChar(0xCC); / 跳过读序号列号的操作 Wr

24、iteOneChar(0x44); / 启动温度转换 delay_18B20(100); / this message is wery important Init_DS18B20; WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器等 前两个就是温度 delay_18B20(100); a=ReadOneChar; /读取温度值低位 b=ReadOneChar; /读取温度值高位 temp_value=b4; void temp_to_str /温度数据转换成液晶字符显示 TempBuffer0=temp_value/10

25、+0; /十位 TempBuffer1=temp_value%10+0; /个位 TempBuffer2=0xdf; /温度符号 TempBuffer3=C; TempBuffer4=0; void Delay1ms(unsigned int count) unsigned int i,j; for(i=0;icount;i+) for(j=0;j0;delay-) for(i=0;i0x59) /超过59秒,清零 temp=0; break; case 2: temp=Read1302(DS1302_MINUTE); /读取分数 temp=temp+1; /分数加1 up_flag=1; i

26、f(temp0x59) /超过59分,清零 temp=0; break; case 3: temp=Read1302(DS1302_HOUR); /读取小时数 temp=temp+1; /小时数加1 up_flag=1; if(temp0x23) /超过23小时,清零 temp=0; break; case 4: temp=Read1302(DS1302_WEEK); /读取星期数 temp=temp+1; /星期数加1 up_flag=1; if(temp0x7) temp=1; break; case 5: temp=Read1302(DS1302_DAY); /读取日数 temp=tem

27、p+1; /日数加1 up_flag=1; if(temp0x31) temp=1; break; case 6: temp=Read1302(DS1302_MONTH); /读取月数 temp=temp+1; /月数加1 up_flag=1; if(temp0x12) temp=1; break; case 7: temp=Read1302(DS1302_YEAR); /读取年数 temp=temp+1; /年数加1 up_flag=1; if(temp0x85) temp=0; break; default:break; while(Up=0); while(wireless_2=1);

28、/ void Downkey/降序按键 Down=1; if(Down=0|wireless_3=1) mdelay(8); switch(count) case 1: temp=Read1302(DS1302_SECOND); /读取秒数 temp=temp-1; /秒数减1 down_flag=1; /数据调整后更新标志 if(temp=0x7f) /小于0秒,返回59秒 temp=0x59; break; case 2: temp=Read1302(DS1302_MINUTE); /读取分数 temp=temp-1; /分数减1 down_flag=1; if(temp=-1) temp

29、=0x59; /小于0秒,返回59秒 break; case 3: temp=Read1302(DS1302_HOUR); /读取小时数 temp=temp-1; /小时数减1 down_flag=1; if(temp=-1) temp=0x23; break; case 4: temp=Read1302(DS1302_WEEK); /读取星期数 temp=temp-1; /星期数减1 down_flag=1; if(temp=0) temp=0x7; break; case 5: temp=Read1302(DS1302_DAY); /读取日数 temp=temp-1; /日数减1 down

30、_flag=1; if(temp=0) temp=31; break; case 6: temp=Read1302(DS1302_MONTH); /读取月数 temp=temp-1; /月数减1 down_flag=1; if(temp=0) temp=12; break; case 7: temp=Read1302(DS1302_YEAR); /读取年数 temp=temp-1; /年数减1 down_flag=1; if(temp=-1) temp=0x85; break; default:break; while(Down=0); while(wireless_3=1); void Setkey/模式选择按键 Set=1; if(Set=0|wireless_4=1) mdelay(8); count=count+1; /Setkey按一次,count就加1 done=1; /进入调整模式

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号