ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:21.72KB ,
资源ID:3246237      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3246237.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(12864+DS1302时钟+18B20温度计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

12864+DS1302时钟+18B20温度计.docx

1、12864+DS1302时钟+18B20温度计#include #include #define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P10; /实时时钟时钟线引脚 sbit DS1302_IO = P11; /实时时钟数据线引脚 sbit DS1302_RST = P12; /实时时钟复位线引脚sbit DQ = P33; /温度传送数据IO口sbit ACC0 = ACC0;sbit ACC7 = ACC7;uchar hide_sec,hide_min,hide_hour,hide_day,hide_

2、week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数sbit Set = P14; /模式切换键 对应实验板K5sbit Up = P15; /加法按钮 对应实验板K6sbit Down= P16; /减法按钮 对应实验板K7sbit out = P17; /立刻跳出调整模式按钮 对应实验板K8uchar done,count,temp,up_flag,down_flag;uchar temp_value,temp1_value; /temp_value温度值正数部分 temp1_value温度值小数部分 uchar TempBuffer8,week_val

3、ue3;void show_time(); /液晶显示程序/*/12864液晶显示部分子程序模块/*sbit rs = P20;sbit rw = P21;sbit e = P22;#define lcddata P0sbit busy=P07; /lcd busy bitvoid wr_d_lcd(uchar content);void wr_i_lcd(uchar content);void clrram_lcd (void);void init_lcd(void);void busy_lcd(void);void rev_row_lcd(uchar row);void rev_co_lc

4、d(uchar row,uchar col,uchar mode);void clr_lcd(void);void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);void wr_row_lcd(uchar row,char *p);/*/液晶初始化/*void init_lcd(void) wr_i_lcd(0x06); /*光标的移动方向*/ wr_i_lcd(0x0c); /*开显示,关游标*/*/填充液晶DDRAM全为空格/*void clrram_lcd (void) wr_i_lcd(0x30); wr_i_

5、lcd(0x01);/*/对液晶写数据/content为要写入的数据/*void wr_d_lcd(uchar content) busy_lcd(); rs=1; rw=0; lcddata=content; e=1; ; e=0;/*/对液晶写指令/content为要写入的指令代码/*void wr_i_lcd(uchar content) busy_lcd(); rs=0; rw=0; lcddata=content; e=1; ; e=0;/*/液晶检测忙状态/在写入之前必须执行/*void busy_lcd(void) lcddata=0xff; rs=0; rw=1; e =1;

6、while(busy=1); e =0;/*/指定要显示字符的坐标/*void gotoxy(unsigned char y, unsigned char x) if(y=1) wr_i_lcd(0x80|x); if(y=2) wr_i_lcd(0x90|x); if(y=3) wr_i_lcd(0x80|x)+8); if(y=4) wr_i_lcd(0x90|x)+8);/*/液晶显示字符串程序/*void print(uchar *str) while(*str!=0) wr_d_lcd(*str); str+; /*/DS1302时钟部分子程序模块/*typedef struct _

7、SYSTEMTIME_ uchar Second; uchar Minute; uchar Hour; uchar Week; uchar Day; uchar Month; uchar Year; uchar DateString11; uchar TimeString9;SYSTEMTIME; /定义的时间类型SYSTEMTIME CurrentTime;#define AM(X) X#define PM(X) (X+12) / 转成24小时制#define DS1302_SECOND 0x80 /时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE 0x82#defi

8、ne DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C /*/实时时钟写入一字节(内部函数)/*void DS1302InputByte(uchar d) uchar i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; /*/实时时钟读取一字节(内部函数)/*uc

9、har DS1302OutputByte(void) uchar i; for(i=8; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); /*/ucAddr: DS1302地址, ucData: 要写的数据/*void Write1302(uchar ucAddr, uchar ucDa) DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令

10、DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; /*/读取DS1302某地址的数据/*uchar Read1302(uchar ucAddr) uchar ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData)

11、;/*/获取时钟芯片的时钟数据到自定义的结构型数组/*void DS1302_GetTime(SYSTEMTIME *Time) uchar ReadValue; ReadValue = Read1302(DS1302_SECOND); Time-Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);/转换为相应的10进制数 ReadValue = Read1302(DS1302_MINUTE); Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302

12、(DS1302_HOUR); Time-Hour = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_DAY); Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_WEEK); Time-Week = (ReadValue&0x10)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MONTH); Time-Month = (ReadV

13、alue&0x70)4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_YEAR); Time-Year = (ReadValue&0xf0)4)*10 + (ReadValue&0x0F); /*/将时间年,月,日,星期数据转换成液/晶显示字符串,放到数组里DateString/*void DateToStr(SYSTEMTIME *Time) uchar tab =0XD2,0XBB,0XB6,0XFE,0XC8,0XFD,0XCB,0XC4,0XCE,0XE5,0XC1,0XF9,0XC8,0XD5; if(hide_year2)

14、/这里的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 = ; Time-DateString4=-; if(hide_monthDateString5 = T

15、ime-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(hide_weekWeek%10)-2; /星期的数据另外放到 week_value数组里,跟年,

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

17、; 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%

18、10 + 0; else Time-TimeString6 = ; Time-TimeString7 = ; Time-TimeString8 = 0;/*/时钟芯片初始化/*void Initial_DS1302(void) uchar Second=Read1302(DS1302_SECOND); if(Second&0x80) /判断时钟芯片是否关闭 Write1302(0x8e,0x00); /写入允许 Write1302(0x8c,0x07); /以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55 Write1302(0x88,0x07); Write

19、1302(0x86,0x25); Write1302(0x8a,0x07); Write1302(0x84,0x23); Write1302(0x82,0x59); Write1302(0x80,0x55); Write1302(0x8e,0x80); /禁止写入 /*/ds18b20子程序模块/*/*ds18b20子程序*/*ds18b20延迟子函数(晶振12MHz )*/ void delay_18B20(unsigned int i) while(i-);/*ds18b20初始化函数*/void Init_DS18B20(void) unsigned char x=0; DQ = 1;

20、/DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(40); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(7); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(10);/*ds18b20读一个字节*/ uchar ReadOneChar(void) uchar i=0; uchar dat = 0; for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; d

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

22、换 delay_18B20(100); / this message is wery important Init_DS18B20(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(50); a=ReadOneChar(); /读取温度值低位 b=ReadOneChar(); /读取温度值高位 t=b&0xf8; if(t) TempBuffer0=:; TempBuffer1=-; temp_value=b4; temp_value=temp_value+1; temp1_value=a&0x0f; else temp_value=b4; temp1_value=a&0x0f; TempBuffer0=:; TempBuffer1=temp_value/100+0; /百位 if(TempBuffer1=1) TempBuffer1=1; else TempBuffer1= ; void temp_to_str() /温度数据转换成液晶字符显示 TempBuffer2=temp_value%100/10+0; /十位 TempBuffer3=temp_value%10+0; /个位 Temp

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1