DS1302时钟+DS18B20用LCD1602显示系统很简单.pdf
《DS1302时钟+DS18B20用LCD1602显示系统很简单.pdf》由会员分享,可在线阅读,更多相关《DS1302时钟+DS18B20用LCD1602显示系统很简单.pdf(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.IDS1302DS1302 时钟时钟+DS18B20+DS18B20 用用 LCD1602LCD1602 显示(系统很简单)显示(系统很简单)看仔细点啊 貌似很多这样的图但可不一样喔 最小系统是用 AT89s52 搭建的!记得回去自己用 protues和 Keil 仿真一下,这样有利于进一步了解!故未将仿真好的代码上传,如果真的需要的话可以和我联系!程序代码:#include#include/#include LCD1602.h/#include DS1302.h#define uint unsigned int#define uchar unsigned charsbit DS1302_C
2、LK=P17;/实时时钟时钟线引脚sbit DS1302_IO=P16;/实时时钟数据线引脚.r.Isbit 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=P20;/模式切换键s
3、bit 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 LcdRw =P26;sbit LcdEn =P27;sfr DBPort =0 x
4、80;/P0=0 x80,P1=0 x90,P2=0 xA0,P3=0 xB0.数据端口/部等待函数*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();LcdEn=0;return DBPort;/向 LCD 写入命令或数据*.r.I#define LCD_COMMAND 0/Command#define LCD_DATA 1/Data#define LCD_CLEAR_SCREEN 0 x01/清屏#define LCD_HOMING 0 x02/光标返回原点void LCD_Write(bit style
5、,unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序 LcdEn=1;_nop_();/注意顺序 LcdEn=0;_nop_();LCD_Wait();/设置显示模式*#define LCD_SHOW 0 x04/显示开#define LCD_HIDE 0 x00/显示关#define LCD_CURSOR 0 x02 /显示光标#define LCD_NO_CURSOR 0 x00/无光标#define LCD_FLASH 0 x01/光标闪动#define LCD_NO_FLA
6、SH 0 x00/光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND,0 x08|DisplayMode);/设置输入模式*#define LCD_AC_UP 0 x02#define LCD_AC_DOWN 0 x00/default#define LCD_MOVE 0 x01/画面可平移#define LCD_NO_MOVE 0 x00/defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND,0 x04|Inpu
7、tMode);.r.I/初始化 LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0 x38);/8 位数据端口,2 行显示,5*7 点阵 LCD_Write(LCD_COMMAND,0 x38);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 ch
8、ar x,unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0 x80|x);if(y=1)LCD_Write(LCD_COMMAND,0 x80|(x-0 x40);/将字符输出到液晶显示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;.r.I
9、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 小时制#define DS1302_SECOND 0 x80/时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE 0 x82#define DS1302_H
10、OUR 0 x84#define DS1302_WEEK 0 x8A#define DS1302_DAY 0 x86#define DS1302_MONTH 0 x88#define DS1302_YEAR 0 x8Cvoid DS1302InputByte(unsigned char d)/实时时钟写入一字节(部函数)unsigned char i;ACC=d;for(i=8;i0;i-)DS1302_IO=ACC0;/相当于汇编中的 RRCDS1302_CLK=1;DS1302_CLK=0;ACC=ACC 1;unsigned char DS1302OutputByte(void)/实时时
11、钟读取一字节(部函数)unsigned char i;for(i=8;i0;i-)ACC=ACC 1;/相当于汇编中的 RRCACC7=DS1302_IO;.r.IDS1302_CLK=1;DS1302_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);/写 1B
12、yte 数据DS1302_CLK=1;DS1302_RST=0;unsigned char Read1302(unsigned char ucAddr)/读取 DS1302 某地址的数据unsigned char ucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr|0 x01);/地址,命令ucData=DS1302OutputByte();/读 1Byte 数据DS1302_CLK=1;DS1302_RST=0;return(ucData);void DS1302_GetTime(SYSTEMTIME*Ti
13、me)/获取时钟芯片的时钟数据到自定义的结构型数组 unsigned char ReadValue;ReadValue=Read1302(DS1302_SECOND);Time-Second=(ReadValue&0 x70)4)*10+(ReadValue&0 x0F);ReadValue=Read1302(DS1302_MINUTE);Time-Minute=(ReadValue&0 x70)4)*10+(ReadValue&0 x0F);ReadValue=Read1302(DS1302_HOUR);.r.I Time-Hour=(ReadValue&0 x70)4)*10+(ReadV
14、alue&0 x0F);ReadValue=Read1302(DS1302_DAY);Time-Day=(ReadValue&0 x70)4)*10+(ReadValue&0 x0F);ReadValue=Read1302(DS1302_WEEK);Time-Week=(ReadValue&0 x70)4)*10+(ReadValue&0 x0F);ReadValue=Read1302(DS1302_MONTH);Time-Month=(ReadValue&0 x70)4)*10+(ReadValue&0 x0F);ReadValue=Read1302(DS1302_YEAR);Time-Ye
15、ar=(ReadValue&0 x70)4)*10+(ReadValue&0 x0F);void DateToStr(SYSTEMTIME*Time)/将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里 DateStringif(hide_year2)/这里的if,else 语句都是判断位闪烁,2 就不显示,输出字符串为 2007/07/22Time-DateString0=2;Time-DateString1=0;Time-DateString2=Time-Year/10+0;Time-DateString3=Time-Year%10+0;elseTime-DateString0=;
16、Time-DateString1=;Time-DateString2=;Time-DateString3=;Time-DateString4=/;if(hide_monthDateString5=Time-Month/10+0;Time-DateString6=Time-Month%10+0;elseTime-DateString5=;Time-DateString6=;.r.I Time-DateString7=/;if(hide_dayDateString8=Time-Day/10+0;Time-DateString9=Time-Day%10+0;elseTime-DateString8=
17、;Time-DateString9=;if(hide_weekWeek%10+0;/星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 elseweek_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;elseTim
18、e-TimeString0=;Time-TimeString1=;Time-TimeString2=:;if(hide_minTimeString3=Time-Minute/10+0;Time-TimeString4=Time-Minute%10+0;elseTime-TimeString3=;Time-TimeString4=;Time-TimeString5=:;if(hide_secTimeString6=Time-Second/10+0;Time-TimeString7=Time-Second%10+0;elseTime-TimeString6=;Time-TimeString7=;T
19、ime-DateString8=0;void Initial_DS1302(void)/时钟芯片初始化 unsigned char Second=Read1302(DS1302_SECOND);if(Second&0 x80)/判断时钟芯片是否关闭 Write1302(0 x8e,0 x00);/写入允许 Write1302(0 x8c,0 x07);/以下写入初始化时间 日期:07/07/25.星期:3.时间:23:59:55 Write1302(0 x88,0 x07);Write1302(0 x86,0 x25);Write1302(0 x8a,0 x07);Write1302(0 x8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS1302 时钟 DS18B20 LCD1602 显示 系统 简单
限制150内