51单片机的液晶显示温度计程序_第1页
51单片机的液晶显示温度计程序_第2页
51单片机的液晶显示温度计程序_第3页
51单片机的液晶显示温度计程序_第4页
51单片机的液晶显示温度计程序_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、/温度值的整/数字电位器/分钟、秒/Timer0 中断/设定的分钟51 单片机的液晶显示温度计程序51 单片机的液晶显示温度计程序 #include <reg51.h>#include & lt;intrins.h >sbitRST = P2A0;sbitCLK= P2A1;sbitDQ= P2A2;sbitTSOR= P2A3;sbitALERT =P2A4;sbitRS= P2A7;sbitRW= P2A6;sbitEN= P2A5;/* 全局变量*/ static unsigned char temp1,temp2; 数部分、小数部分static unsigned ch

2、ar pos,posset; 电位值、设定值static unsigned char min,sec;static unsigned char count;计数static unsigned char minset;数static unsigned char status1,status2;/状态标志bit stop,timeover;/定时停止、结束static char line0 =00:00 ;static char line1 =. CW;/*/voidInitInterupt();voidKeyboardDelay();/*LCD驱动函数*/voidDelayL();voidDel

3、ayS();voidWriteCommand(unsigned char c);voidWriteData(unsigned char c);voidShowChar(unsigned char pos,unsigned char c);void ShowString(unsigned char line,char *ptr); voidInitLcd();/* 键盘 -程序*/ unsigned char GetKey();/*数字温度计驱动*/voidChangePos(bit sel,unsigned charpos1,unsigned char pos2);/* 温度传感器驱动*/vo

4、idDelay15();voidDelay60();voidDelay100ms();voidWrite0TS();voidWrite1TS();bitReadTS();voidResetTS();voidWriteByteTS(unsigned char byte);unsigned charReadByteTS();voidInitTS();voidGetTempTS();/* 主程序*/ void main (void) char code str1 = Hello World! ;char code str2 = 2002-10-20 unsigned char i;SP=0x50;/

5、初始化数据ChangePos(0,255-pos,255-pos);ALERT=0;TSOR=1;DelayL();InitLcd();DelayL();ShowString(0,str1);ShowString(1,str2);for(i=0;i<15;i+)Delay100ms();InitInterupt();minset=10;posset=0;min=minset;pos=posset;sec=0;count=0;P1=0xF0;status1=0;status2=0;stop=1;timeover=0;/报警灯灭/1-wire 总线释放/初始化 LCD/启动画面/初始化中断设

6、置/ 缺省定时 10 分钟/ 缺省电位器值 0/设置电位器 InitTS();/初始化温度计while(1) / 循环显示温度值 GetTempTS();line10=0x20;i=temp1;if(i>39)/ 超过 40 摄氏度,告警灯亮ALERT=1;if(i>99)/ 超过 100 摄氏度,显示温度的百位line10=0x31;i-=100;/显示温度的十位/显示个位/显示小数位/若定时结束,则电位器缓line11=i/10+0x30;line12=i%10+0x30;line14=temp2+0x30; if(timeover)慢复 0for(;pos>0;pos-

7、)ChangePos(0,255-pos,255-pos);_nop_();_nop_();timeover=0; posset=0;if(pos>posset)/若按键修改电位器位置for(;pos>posset;pos-)/则缓变到设定值ChangePos(0,255-pos,255-pos);_nop_();_nop_();ChangePos(0,255-pos,255-pos);else if(pos<posset)for(;pos<posset;pos+)ChangePos(0,255-pos,255-pos); _nop_();_nop_();ChangeP

8、os(0,255-pos,255-pos); i=pos;line19=0x20;/显示电位器等级值if(i>99)line19=i/100+0x30; i=i%100; line110=i/10+0x30; line111=i%10+0x30;ShowString(1,line1);line05=min/10+0x30;/显示时间line06=min%10+0x30;line08=sec/10+0x30;line09=sec%10+0x30;ShowString(0,line0); Delay100ms();void InitInterupt()TMOD=0x21;/初始化中断设置TL

9、1=0xFD;TH1=0xFD;PX0=1;EA=1;ES=1;PCON=0;TR1=1;SCON=0x50;TL0=0x00;TH0=0x4C;ET0=1; EX0=1;IT0=1;void KeyboardDelay() unsigned char i,j;i=0x40;j=0xFF;while(i-)while(j-);/*/ 定时 0.05m/按键中断延时中断处理*/Int0_process() interrupt 0 using 0 unsigned char key;unsigned char keycode= TP;unsigned char step3=1,2,5;/获得按键值

10、EA=0;key=GetKey();switch(key)case 0:stop=!stop;min=minset;sec=0;break;case 1:case 2:case 3:if(stop)minset+=stepkey-1;if(minset>60)minset=0;min=minset;break;case 5:case 6:case 7:if(stop)minset-=stepkey-5; if(minset>60) minset=0; min=minset;break;case 9:case 10:case 11: posset+=stepkey-9;break;c

11、ase 13:case 14:case 15:posset-=stepkey-13;break;default:break;TR0=!stop;KeyboardDelay();P1=0xF0;EA=1;Timer0_process() interrupt 1 using 0EA=0;TR0=0;TL0=0x00;TH0=0x4C;count+;if(count=20)/如果到累计定时到达 1sif(sec=0)/ 定时处理if(min=0) / 总定时到,则置结束标志 timeover=1;elsemin-; sec=59;elsesec-;count=0;TR0=1;EA=1;/*LCD 驱

12、动子程序*/void DelayL()unsigned char i,j;i=0xF0;j=0xFF;while(i-)while(j-);void DelayS()unsigned char i;i=0x1F;while(i-);void WriteCommand(unsigned char c) DelayS();EN=0;RS=0;RW=0;_nop_();EN=1;P0=c;EN=0;void WriteData(unsigned char c)DelayS();EN=0;RS=1;RW=0;_nop_();EN=1;P0=c;EN=0;RS=0;void ShowChar(unsig

13、ned char pos,unsigned char c) unsigned char p; if(pos>=0x10)p=pos+0xB0;elsep=pos+0x80;WriteCommand(p);WriteData(c);void ShowString(unsigned char line,char *ptr) unsigned char l,i; l=line<<4;for(i=0;i<16;i+)ShowChar(l+,*(ptr+i); void InitLcd() DelayL();WriteCommand(0x38);WriteCommand(0x38

14、);WriteCommand(0x06);WriteCommand(0x0C);WriteCommand(0x01);WriteCommand(0x80);/* 键盘子程序*/ unsigned char GetKey() unsigned k,t,i,j;k=P1;k=k&0xF0;i=0;while(k&0x10)&&i<4)i+;k=k>>1;k=0x01;j=0;while(j<4)P1=0xFFAk;_nop_();t=P1;t=tA0xFF;t=t&0xF0;if(t)break;j+;k=k<<1;k=j

15、*4+i;return k;/* 数字温度计驱动子程序*/void ChangePos(bit sel,unsigned char pos1,unsigned char pos2) unsigned char i;RST=0;DQ=0;CLK=0;RST=1;DQ=sel;_nop_();CLK=1;_nop_();CLK=0;for(i=0;i<8;i+) if(pos1&0x80) DQ=1;elseDQ=0;_nop_();CLK=1;_nop_();CLK=0;pos1=pos1<<1;for(i=0;i<8;i+)if(pos2&0x80)DQ

16、=1;elseDQ=0;_nop_();CLK=1;_nop_();CLK=0;pos2=pos2<<1; RST=0;/*void Delay100ms()unsigned char i,j,k;for(i=0;i<8;i+)for(j=0;j<25;j+)for(k=0;k<250;k+);void Delay15()unsigned char i; for(i=0;i<8;i+);void Delay60()- 温度传感器子程序*/ 延时 100ms/ 延时 15us/ 延时 60usunsigned char i; for(i=0;i<30;i

17、+);/ 写 bit 0void Write0TS()TSOR=1;TSOR=0;Delay15();Delay15();Delay15();Delay15();TSOR=1;_nop_();_nop_();/ 写 bit 1void Write1TS()TSOR=1;TSOR=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TSOR=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Delay15();Delay15();Delay15();bit ReadT

18、S() bit b;TSOR=1;TSOR=0;_nop_();_nop_();_nop_();_nop_();TSOR=1;_nop_();_nop_();_nop_();_nop_();_nop_();b=TSOR;Delay15();Delay15();Delay15();_nop_();_nop_();/复位return b;void ResetTS()unsigned char i; TSOR=1;TSOR=0;for(i=0;i<8;i+)Delay60();TSOR=1;while(TSOR);for(i=0;i<8;i+)Delay60();/写一个字节void WriteByteTS(unsigned char byte) (byte )unsigned char i;for(i=0;i<8;i+)if(byte&0x01)Write1TS();elseWrite0TS(); byte=by

温馨提示

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

评论

0/150

提交评论