还有温度低于0的时候显示不正确是为什么呢。
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LCD1602_DATA P2
- uchar code tab1[]={"TEMP: "};
-
- uchar code tab2[]={"Lv: "} ;
- //端口定义
- sbit rs=P1^5;
- sbit rw=P1^6;
- sbit e=P1^7;
- sbit DQ=P1^4;
- sbit k1=P3^1;
- sbit k2=P3^2;
- sbit k3=P3^3;
- char TH=10,TL=-10; //设置限制最高值、最低值
- uchar flag1=0;
- uchar k1num=0; //键盘计数
- uchar wendu;
- //********1ms延时函数 **********
- void Delay(uint n)
- {
- uint i,j;
- for(i=n;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Delay1(uint a)
- {
- while(--a);
- }
- //**********LCD1602********
- //写指令
- void Write_comd(uchar comd)
- {
- rs=0;
- rw=0;
- P2=comd;
- Delay(5);
- e=1;
- Delay(5);
- e=0;
- }
- //写数据
- void Write_data(uchar Data)
- {
- rs=1;
- rw=0;
- P2=Data;
- Delay(5);
- e=1;
- Delay(5);
- e=0;
- }
- //写字符串
- void Write_str(uchar add,uchar *dat)
- {
- Write_comd(add);
- while(*dat != ' ')
- {
- Write_data(*dat++);
- }
- }
- //写温度
- void Write_wendu(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- Write_comd(add);
- Write_data(shi+'0');
- Write_data(ge+'0');
- }
- //初始化函数
- void LCD1602_init()
- {
- e=0; //上电时高电平
- rs=0;
- rw=0;
- Delay(5);
- Write_comd(0x01); //清屏
- Delay(5);
- Write_comd(0x38); //设置16*2显示,5*7点阵,8位数据接口
- Delay(5);
- Write_comd(0x0c); //设置光标。无
- Delay(5);
- Write_comd(0x06); //文字不动,光标右移。
- }
- //******************DS18B20***********
- uchar temp;
- void DS18B20_init() //复位,判断好坏。 a=0 a=1坏掉
- {
- // uchar a=0;
- DQ=1;
- Delay1(8);//10us
- DQ=0;
- Delay1(90);// 480us ~ 960us 750
- DQ=1;//释放总线 15us~60us
- _nop_();//机器周期
- _nop_();
-
- // a=DQ;
- Delay1(100);// 480us++ 560跳出复位
- DQ=1; //拉高
- // return a; // 或者可以直接认为18b20好用,
- }
- //读DS18B20
- uchar Read_18b20()
- {
- uchar i;
- uchar dat=0;
- DQ=1;
- _nop_();
- for (i=0;i<8;i++) //拉低读数据
- {
- DQ=0;
- _nop_(); //6ms
- _nop_();
- dat>>=1;//右移一位 0000 0001 / 1000 0000 / 0100 0000
- DQ=1;
- _nop_();
- _nop_();
- if(DQ)
- dat|=0x80; //1000 0000 或 传递过来第一位是1就是1,0就是0
- Delay1(30); //40us
- DQ=1; //准备下一位
- }
- return (dat);
- }
- //写18b20
- void Write_18b20(uchar dat) //15us,释放拉高,
- {
- uchar i; // 延时确认时间15us 写八位
- for(i=0;i<8;i++)
- {
- DQ=0;
- DQ=dat&0x01;//0000 0001 发送一个1
- Delay1(5);//延迟45ms
- DQ=1;
- dat>>=1; //发送第二位 000 0010
- }
- }
- // DS18B20温度转换
- void Change_Temp()
- {
- DS18B20_init(); //复位
- Write_18b20(0xcc);//跳过id地址,序列号
- Write_18b20(0x44);//启动温度转换
- }
- //DS18B20 读取温度
- uchar Read_Temp()
- {
- int temp;
- uchar date[2];
- // Delay(380) ; ///////////////**************85
- DS18B20_init();//再次复位
- Write_18b20(0xcc);
- Write_18b20(0xbe); //读内部RAM中9字节的内容;
- date[0]=Read_18b20();//底字节 LSB
- date[1]=Read_18b20();// 高字节 MSB
- temp=date[1];
- temp<<=8;
- temp |= date[0];
- temp>>=4;
- return (temp);
-
- }
-
- //********键盘******
- void key_scan()
- {
- if(k1==0)
- {
- Delay(2);
- if(k1==0)
- {
- while(!k1); //松手检测
- k1num++;
- if(k1num==1)
- {
- flag1=1; //发送限制最高温度标志
- }
- if(k1num==2)
- {
- flag1=2; //发送限制最低温度标志
- }
- if(k1num==3)
- {
- flag1=0;
- k1num=0;
- }
- }
- }
- if(k1num!=0)
- {
- switch(k1num)
- {
- case 1: //调节最高限温值
- {
- if(k2==0)
- {
- Delay(2);
- if(k2==0)
- {
- while(!k2);
- TH++;
- if(TH>=30)
- TH=30;
- }
- }
- if(k3==0)
- {
- Delay(2);
- if(k3==0)
- {
- while(!k3);
- TH--;
- if(TH<0)
- TH=0;
- }
- }
- }break;
- case 2: //调节最低限温值
- {
- if(k2==0)
- {
- Delay(2);
- if(k2==0)
- {
- while(!k2);
- TL++;
- if(TL>0)
- TL=0;
- }
- }
- if(k3==0)
- {
- Delay(2);
- if(k3==0)
- {
- while(!k3);
- TL--;
- if(TL<-30)
- TL=-30;
- }
- }
- }break;
- }
- }
- }
- //********主函数********
- void main()
- {
- int ans;
- uchar flag;
- uchar flag1=0;
- LCD1602_init();
-
- Write_str(0x80,tab1);
- Write_str(0xc0,tab2);
-
- while (1)
- {
-
- Change_Temp();
- Delay(1000);
- ans=Read_Temp();
- if(ans<0) /******判断是否为负温度********/
- {
- ans=-ans;
- flag=1;
- }
- else
- flag=0;
- if(flag==1) //负温度,发送‘-’
- {
- Write_comd(0x80+6);
- Write_data('-');
- Write_wendu(0x87,ans);
- }
- if(flag==0)
- {
- Write_wendu(0x86,ans);
- Write_comd(0x80+8);
- Write_data(' ');
- }
- }
- key_scan();
- if(k1num==1)
- {
- LCD1602_init();
- Write_str(0x80,"PSE SET HIGHEST TEMP");
- Write_str(0xC0,"Temperatuer: C");
- while(flag1==1)
- {
- Write_wendu(0xcc,ans);
- }
- }
- if(k1num==2)
- {
- LCD1602_init();
- Write_str(0x80,"PSE SET LOWEST TEMP");
- Write_str(0xC0,"Temperatuer:- C");
- while(flag1==2)
- {
- Write_comd(0xc5);
- Write_data('-');
- Write_wendu(0xcd,-ans);
- }
- }
- }
复制代码
-
按键。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>