|
这是程序,温度显示的时候负温度显示不出来,到0的时候显示-00.0,之后再往下调就没有变化了,该怎末改,求大神解答
#include "reg52.h"
#include "absacc.h"
unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77 }; //共阴 (cc)
sbit DQ=0xb7; //c51与DS18B20通信口
sbit P07=0x87; //小数点
sbit RED=0x97; //高温报警灯
sbit GREEN=0x96; //低温报警灯
sbit SET=0x90; //以下按钮设置
sbit NEXT=0x91;
sbit REDUCE=0x92;
sbit ADD=0x93;
unsigned char tempL=0; //温度低八位
unsigned char tempH=0; //温度高八位
float temperature; //显示温度值
float temperatureH=30,temperatureL=10; //报警温度
int tH=1,tL=1;//报警状态,1为关闭
int m,k=1,l,keyon,keytype,out=0;//设置报警温度时使用的中间变量
void delay(unsigned int time)
{
while(time--);
}
void display(float k) //显示温度
{
if(k>0) //正温度显示的百位,暂时设置为零。
{
P2=0xfe;
P0=0x3f;
delay(260);
P0=0x00;
P2=0xfd; //温度十位显示
P0=tab[(((int)k)%100)/10];
delay(260);
P0=0x00;
P2=0xfb; //温度个位显示
P0=tab[((int)k)%10];
P07=1;
delay(260);
P0=0x00;
P2=0xf7; //温度一位小数显示
P0=tab[((int)(k*10))%10];
delay(260);
P0=0x00;
}
else //负温度显示负号
{
k= -k;
P2=0xfe;
P0=0x40;
delay(260);
P0=0x00;
P2=0xfd; //温度十位显示
P0=tab[(((int)k)%100)/10];
delay(260);
P0=0x00;
P2=0xfb; //温度个位显示
P0=tab[((int)k)%10];
P07=1;
delay(260);
P0=0x00;
P2=0xf7; //温度一位小数显示
P0=tab[((int)(k*10))%10];
delay(260);
P0=0x00;
}
}
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1;
delay(8);
DQ=0;
delay(85);
DQ=1;
delay(14);
x=DQ;
delay(20);
return DQ;
}
ReadOneChar(void)
{
unsigned char i,dat=0;
DQ = 1;
delay(1);
for(i=0;i<8;i++)
{
DQ = 0;
delay(1);
dat >>= 1;
DQ = 1;
delay(1);
if(DQ)
dat |= 0X80;
delay(30);
DQ = 1;
}
return(dat);
}
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
return DQ;
}
ConversionTemperature()
{
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44);
delay(20);
return 0;
}
ReadTemperature(void)
{
char ctempL,ctempH;
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0xbe);
tempL=ReadOneChar();
tempH=ReadOneChar();
if(tempH<0x3f) //温度是否小于零
temperature=((tempH*256)+tempL)* 0.0625;//大于零
if (temperature>temperatureH,tH=-1);
if (temperature<temperatureL,tL=-1);
else
{
ctempL=tempL;
ctempH=tempH;
temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;
temperature=-temperature;
}
delay(200);
return(temperature);
}
///////////////////////////报警设置显示/////////////////////////
void Display2()
{ /////////高温报警显示
if(m==0||m==1)
{
P2=0xfe;
P0=0x6e;
delay(70);
P0=0x00;
if(m==0&&k==-1) delay(70);
else
{
if(tH==1)
{
P2=0xfd;
P0=0x4b;
delay(70);
P0=0x00;
}
else
{
P2=0xfd;
P0=0x3f;
delay(70);
P0=0x00;
}
}
if(m==1&&k==-1) delay(100);
else
{
if(temperatureH>=0)
{
P2=0xfb;
P0=tab[(int)(temperatureH/10)];
delay(70);
P0=0x00;
P2=0xf7;
P0=tab[(int)(temperatureH)%10];
delay(70);
P0=0x00;
}
else
{
P2=0xfb;
P0=0x40; //////显示负号
delay(70);
P0=0x00;
P2=0xf7;
P0=tab[(int)(-temperatureH)%10];
delay(70);
P0=0x00;
}
}
}
////////低温报警显示
else if(m==2||m==3)
{
P2=0xfe;
P0=0x1a;
delay(70);
P0=0x00;
if(m==2&&k==-1) delay(70);
else
{
if(tL==1)
{
P2=0xfd;
P0=0x4b;
delay(70);
P0=0x00;
}
else
{
P2=0xfd;
P0=0x3f;
delay(70);
P0=0x00;
}
}
if(m==3&&k==-1) delay(100);
else
{
if(temperatureL>=0)
{
P2=0xfb;
P0=tab[(int)(temperatureL/10)];
delay(70);
P0=0x00;
P2=0xf7;
P0=tab[(int)(temperatureL)%10];
delay(70);
P0=0x00;
}
else
{
P2=0xfb;
P0=0x40; ////显示负号
delay(70);
P0=0x00;
P2=0xf7;
P0=tab[(int)(-temperatureL)%10];
delay(70);
P0=0x00;
}
}
}
if(l==200){k=-k;l=0;}
l++;
}
/////////////////////////////报警设置显示结束///////////////////////////////////
////////////////////////////////报警设置/////////////////////////////////////////
void seting()
{
if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1); //无键盘按下
else /////有键盘按下时
{
keyon=1;
if(SET==0)keytype=0;
if(NEXT==0)keytype=1;
if(REDUCE==0)keytype=2;
if(ADD==0)keytype=3;
}
if(keyon==1&&SET==1&&NEXT==1&&REDUCE==1&&ADD==1) //键盘松开后判断键盘状态
{
if(keytype==1)////////////////菜单下翻
{
if(m>=3)m=0;
else m++;
}
if(keytype==2) ////////////////加操作
{
if(m==0)tH=-tH;
if(m==1)
{
if(temperatureH>(temperatureL+1)) temperatureH--;
else temperatureH=99;
}
if(m==2)tL=-tL;
if(m==3)
{
if(temperatureL>-9) temperatureL--;
else temperatureL=(temperatureH-1);
}
}
if(keytype==3) ////////////////减操作
{
if(m==0)tH=-tH;
if(m==1)
{
if(temperatureH<99) temperatureH++;
else temperatureH=(temperatureL+1);
}
if(m==2)tL=-tL;
if(m==3)
{
if(temperatureL<(temperatureH-1)) temperatureL++;
else temperatureL=-9;
}
}
if(keytype==0) ///////////跳出温度设置
{
keyon=0;
keytype=4;
out=1;
}
keyon=0;
keytype=4;
}
}
/////////////////////////////报警设置结束/////////////////////////////////////////
void main()
{
P1=0XFF;
while(1)
{
ConversionTemperature();//温度转换
display(temperature);//显示温度
if(SET==0) /////////////////////////进入报警温度设定
{
out=0;
delay(300);
while(SET==0);
m=0;
l=0;
keyon=0;
keytype=4;
while(1)
{
Display2();
seting();
if (out==1)break;
}
delay(200);
while(SET==0);
}
if(tH==1)RED=1;
else if(tH==-1&&temperature>=temperatureH) RED=0; //////满足条件是开启高温报警
else if(temperature<(temperatureH-0.9))RED=1;
if(tL==1)GREEN=1;
if(tL==-1&&temperature<=temperatureL) GREEN=0;//////满足条件时开启低温报警
else if(temperature>(temperatureL+1)) GREEN=1;
ReadTemperature();//读取温度
display(temperature);//显示温度
}
}
|
|