DS1802HE LCD1602实现万年历和温度显示(不用时间芯片).doc_第1页
DS1802HE LCD1602实现万年历和温度显示(不用时间芯片).doc_第2页
DS1802HE LCD1602实现万年历和温度显示(不用时间芯片).doc_第3页
DS1802HE LCD1602实现万年历和温度显示(不用时间芯片).doc_第4页
DS1802HE LCD1602实现万年历和温度显示(不用时间芯片).doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

#include#include#include #define uchar unsigned char#define uint unsigned intuchar code table=-Figo;/uchar code table1=WWW.TXMCU.COM;sbit lcden=P34;sbit lcdrs=P35;sbit dula=P26;sbit wela=P27; sbit ds=P17;sbit key1=P10; sbit key2=P11; sbit key3=P12; sbit key4=P13; int tempValue; int s_1=1000;unsigned char FunKeyFlag=6,keypress; #define key_vaule1 0x01 #define key_vaule2 0x02 #define key_vaule3 0x03 #define key_vaule4 0x04uchar num;int ms_10=10;int flag=0;int s_1_1=1000;uint sec=55;uint min=9;uint hour=22;uint nian=2014;uint yue=8;uint ri=20;uint xingqi=3;/延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.void delay_wendu(unsigned int i) unsigned int j; while(i-) for(j = 0; j 0) i-; ds = 1; /产生一个上升沿, 进入等待应答状态 i = 4; while(i0) i-;void dsWait() unsigned int i; while(ds); while(ds);/检测到应答脉冲 i = 4; while(i 0) i-;/向DS18B20读取一位数据/读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,/之后DS18B20则会输出持续一段时间的一位数据bit readBit() unsigned int i; bit b; ds = 0; i+;/延时约8us, 符合协议要求至少保持1us ds = 1; i+; i+;/延时约16us, 符合协议要求的至少延时15us以上 b = ds; i = 8; while(i0) i-; /延时约64us, 符合读时隙不低于60us要求 return b;/读取一字节数据, 通过调用readBit()来实现unsigned char readByte() unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i8; i+) j = readBit(); /最先读出的是最低位数据 dat = (j 1); return dat;/向DS18B20写入一字节数据void writeByte(unsigned char dat)unsigned int i;unsigned char j;bit b; for(j = 0; j = 1; /写1, 将DQ拉低15us后, 在15us60us内将DQ拉高, 即完成写1 if(b) ds = 0; i+; i+; /拉低约16us, 符号要求1560us内 ds = 1; i = 8; while(i0) i-; /延时约64us, 符合写时隙不低于60us要求 else /写0, 将DQ拉低60us120us ds = 0; i = 8; while(i0) i-;/拉低约64us, 符号要求 ds = 1; i+; i+;/整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了 /向DS18B20发送温度转换命令void sendChangeCmd() dsInit(); /初始化DS18B20, 无论什么命令, 首先都要发起初始化 dsWait(); /等待DS18B20应答 delay_wendu(1); /延时1ms, 因为DS18B20会拉低DQ 60240us作为应答信号 writeByte(0xcc); /写入跳过序列号命令字 Skip Rom writeByte(0x44); /写入温度转换命令字 Convert T/向DS18B20发送读取数据命令void sendReadCmd() dsInit(); dsWait(); delay_wendu(1); writeByte(0xcc); /写入跳过序列号命令字 Skip Rom writeByte(0xbe); /写入读取数据令字 Read Scratchpad/获取当前温度值int getTmpValue() unsigned int tmpvalue; int value; /存放温度数值 float t; unsigned char low, high; sendReadCmd(); /连续读取两个字节数据low = readByte();high = readByte(); /将高低两个字节合成一个整形变量 /计算机中对于负数是利用补码来表示的 /若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value tmpvalue = high; tmpvalue 0 ? 0.5 : -0.5); /大于0加0.5, 小于0减0.5 return value;void HandleKeyPress(); void KeyScan() /按键扫描 static unsigned char state=0;unsigned char temp; if (key1=0) temp=key_vaule1; else if (key2=0) temp=key_vaule2; else if (key3=0) temp=key_vaule3; else if (key4=0) temp=key_vaule4; else temp=0; switch (state) case 0: if(temp!=0) state=1;break;case 1: state=2; break;case 2: if(temp!=0) state=3;keypress=temp; else state=0; break;case 3: if(temp=0) HandleKeyPress();state=0; break; void HandleKeyPress() /按键功能的设置 if (keypress=key_vaule1) /功能键的设置 FunKeyFlag=(FunKeyFlag+1)%7; else if (keypress=key_vaule2) /第二个按键的设置 switch (FunKeyFlag) case 0:hour+;if(hour23)hour=0;break; case 1:min+;if(min59)min=0;break; case 2:sec+;if(sec59)min=0;break; case 3:ri+;xingqi+;if(ri30)ri=1;if(xingqi7)xingqi=1;break; case 4:yue+;if(yue12)yue=1;break; case 5:nian+;break; else if (keypress=key_vaule3) /第三个按键的设置 switch (FunKeyFlag) case 0:hour-;if(hour0)hour=23;break; case 1:min-;if(min0)min=59;break; case 2:sec-;if(sec0)sec=59;break; case 3:ri-;xingqi-;if(ri1)ri=31;if(xingqi1)xingqi=1;break; case 4:yue-;if(yue0;x-)for(y=110;y0;y-);void write_com(uchar com)lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_data(uchar date)lcdrs=1;P0=date;flag=1;delay(5);lcden=1;delay(5);lcden=0;shijian_show(uchar wei,shijian ) uchar shi,ge;shi=shijian/10;ge=shijian%10;write_com(0x80+0x40+wei);write_data(0x30+shi);write_data(0x30+ge); rili_show(uchar wei,rili ) uchar shi,ge;shi=rili/10;ge=rili%10;write_com(0x80+wei);write_data(0x30+shi);write_data(0x30+ge); nian_show(uchar wei,shijian ) uchar shi,ge,qian,bai;qian=shijian/1000;bai=shijian%1000/100;shi=shijian%100/10;ge=shijian%10;write_com(0x80+wei);write_data(0x30+qian);write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge); wendu_show(uchar wei,int wendu ) uchar shi,ge,qian,bai,xiao;qian=wendu/10000;bai=wendu%10000/1000;shi=wendu%1000/100;ge=wendu%100/10; xiao=wendu%10;write_com(0x80+0x40+wei);write_data(0x30+qian);write_data(0x30+bai);write_data(0x30+shi);/write_com(0x80+0x40+wei+1); write_data(0xdf);write_data(0x30+ge); write_data(0x30+xiao);void init() P0=0;dula=0;wela=0;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);void week_show() /星期的显示 write_com(0x80+12); switch (xingqi) case 1: write_data(M); write_data(o); write_data(n); break;case 2: write_data(T);write_data(u);write_data(e); break;case 3: write_data(W); write_data(e); write_data(d); break; case 4: write_data(T); write_data(h); write_data(u); break; case 5: write_data(F); write_data(r); write_data(i); break;case 6: write_data(S); write_data(a); write_data(t); break; case 7: write_data(S); write_data(u); write_data(n); break; void main() TMOD = 0x01;TH0 = (65536-1000)/256;TL0 = (65536-1000)%256;EA = 1;ET0 = 1;TR0 = 1;init();while(1) nian_show(1,nian); rili_show(6,yue); rili_show(9,ri); shijian_show(0,hour); shijian_show(3,min); shijian_show(6,sec); write_com(0x80+5); write_data(0x2d); write_com(0x80+8); write_data(0x2d); write_com(0x80+0x40+2); write_data(0x3A); write_com(0x80+0x40+5); write_data(0x3A); week_show();wendu_show(10,tempValue); void time() interrupt 1 TH0 = (65536-1000)/256;TL0 = (65536-1000)%256;ms_10-;s_1_1-; if(s_1_1=0) s_1_1=1000; sendChangeCmd(); /显示5次 tempValue = getTmpValue(); /计算温度 if(ms_10=0) /按键扫描 ms_10=10; KeyScan(); s_1-; if(s_159) sec=0; min+; if(min59) min=0; hour+; if(hour23) hour=0; ri+; xingqi+; if(xingqi7) xingqi=1; if(yue=1|yue=3|yue=5|yue=7|yue=8|yue=10|yue

温馨提示

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

最新文档

评论

0/150

提交评论