|
這是程序,溫度顯示的時候負溫度顯示不出來,到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)
tu.PNG (120.71 KB, 下載次數: 63)
下載附件
2021-5-25 10:02 上傳
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);//顯示溫度
}
}
|
|