|
問題:就在程序最后那個(gè)if語句,如果 if(25<TN) led0=0;
else
led0=1;單片就能正常顯示,
但是我想分(22<TN<25),(25<=TN<28),(TN>28),這幾個(gè)段,就不能正常顯示了,確定用的if嵌套沒錯(cuò)?
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int;
unsigned char code digit[11]={"0123456789-"};
unsigned char code shuoming[]={"Now temperature:"};
unsigned char code error[]={"DS18B20 Error"};
unsigned char code error0[]={"please check"};
unsigned char code temp[]={"wendu:"};
unsigned char code danwei[]={"cent"};
unsigned char flag,tltemp;
unsigned char b=0,s=0,g=0;
sbit jdq=P3^7;
sbit fmq=P3^6;
sbit led=P1;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
/*顯示模塊程序*/
sbit RS=P2^0; //數(shù)據(jù)(RS=1),命令(RS=0)選擇端
sbit RW=P2^1; //讀(RW=1)寫(RW=0)選擇端
sbit E=P2^2;
sbit BF=P0^7;
void delay500us()
{
unsigned int i;
for(i=1;i<57;i++);
}
void delayms()//延時(shí)1ms
{
unsigned char i,j;
for(i=0;i<4;i++)
for(j=0;j<33;j++);
}
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delayms();
}
bit panduan(void) //判斷顯示器是否在忙碌中狀態(tài)
{
bit result;
RS=0;
RW=1;
E=1;
_nop_(); //空操作
_nop_();
_nop_();
_nop_();
result=BF;
E=0;
return result;
}
void write0(unsigned char dictate) //寫指令
{
while(panduan()==1);
RS=0;
RW=0;
E=0;
_nop_();
_nop_();
P0=dictate;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}
void address(unsigned char x)//顯示位置確定,方法:0x80+地址碼x
{
write0(x|0x80);
}
void writedate(unsigned char y)//寫數(shù)據(jù)
{ while(panduan()==1);
RS=1;
RW=0;
E=0;
P0=y;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}
void chushihua(void)
{
delay(15);
write0(0x38);//顯示模式設(shè)置,16*2,7*5點(diǎn)陣,8位數(shù)據(jù)接口
delay(5);
write0(0x38);
delay(5);
write0(0x38);
delay(5);
write0(0x0c);//顯示開,有光標(biāo),光標(biāo)閃爍
delay(5);
write0(0x06); //光標(biāo)右移,字符不移
delay(5);
write0(0x01);//清屏
delay(5);
}
/*void beer()
{ unsigned char t=2000;
while(t--)
{
fmq=0;
delay500us();
fmq=1;
delay500us();
}
} */
/*DS18B20模塊*/
sbit D=P3^3;
unsigned char T;
bit chushihua0(void)//初始化DS18b20
{
bit flag;
D=1;
for(T=0;T<2;T++);
D=0;
for(T=0;T<200;T++);
D=1;
for(T=0;T<10;T++);
flag=D;
for(T=0;T<200;T++);
return(flag);
}
unsigned char readchar(void)//讀數(shù)據(jù)
{
unsigned char i=0;
unsigned char dat;//儲(chǔ)存讀出的數(shù)據(jù)
for(i=0;i<8;i++)
{
D=1;
_nop_();
D=0;
_nop_();
D=1;
for(T=0;T<2;T++);//延時(shí)6秒
dat>>=1;
if(D==1)
dat|=0x80;
else
dat|=0x00;
for(T=0;T<8;T++);
}
return(dat);
}
writechar(unsigned char dat)//寫數(shù)據(jù);
{
unsigned char i=0;
for(i=0;i<8;i++)
{
D=1;
_nop_();
D=0;
D=dat&0x01;
for(T=0;T<10;T++);
D=1;
for(T=0;T<1;T++);
dat>>=1;
}
for(T=0;T<4;T++);
return 0;
}
void readtemp(void)//讀溫度;
{
chushihua0();
writechar(0xCC);
writechar(0x44);
delay(200);
chushihua0();
writechar(0xCC);
writechar(0xBE);
}
/*以下是與溫度的顯示有關(guān)的程序*/
void display_xerror(void) //沒有檢測(cè)到溫度時(shí)的顯示
{
unsigned char i;
address(0x00);
i=0;
while(error[i]!='\0')//"\0"數(shù)組結(jié)束標(biāo)志
{ writedate(error[i]);
i++;//顯示完每一個(gè)字母(DS18B20 Error)
delay(100);
}
address(0x40);
i=0;
while(error0[i]!='\0')//"\0"數(shù)組結(jié)束標(biāo)志
{
writedate(error0[i]);
i++;//顯示完每一個(gè)字母(please check)
delay(100);
}
while(1);
}
void display_symbol(void) //顯示“wendu”
{
unsigned char i;
address(0x40);
i=0;
while(temp[i]!='\0')//只要沒有寫到結(jié)束標(biāo)志,就繼續(xù)寫;
{
writedate(temp[i]);
i++;
delay(50);
}
}
void display_explain(void)//顯示說明;
{
unsigned char i;
address(0x00);
i=0;
while(shuoming[i]!='\0')
{
writedate(shuoming[i]);
i++;
delay(100);
}
}
void display_dot(void)//顯示小數(shù)點(diǎn)
{
address(0x49);
writedate('.');
delay(50);
}
void display_cent(void) //顯示單位;
{
unsigned char i;
address(0x4c);
i=0;
while(danwei[i]!='\0')
{
writedate(danwei[i]);
i++;
delay(50);
}
}
void display_zheng(unsigned char x)//顯示整數(shù)部分
{
b=x/100;
s=(x%100)/10;
g=x%10;
address(0x46);
if(flag==1)
{
writedate(digit[10]);
}
else
{
writedate(digit[b]);
}
writedate(digit[s]);
writedate(digit[g]);
delay(50);
}
void display_xiao(unsigned char x)//顯示小數(shù)部分
{
address(0x4a);
writedate(digit[x]);
delay(50);
}
unsigned char TL;//儲(chǔ)存暫存器的低位
unsigned char TH;//儲(chǔ)存暫存器的高位
unsigned char TN;//儲(chǔ)存暫存器的整數(shù)部分
unsigned char TD;//儲(chǔ)存暫存器的小數(shù)部分
void main(void)
{
//led=1;
chushihua();
delay(5);
if(chushihua0()==1)
display_xerror();
display_explain();
display_symbol();
display_dot();
display_cent();
while(1)
{
flag=0;
readtemp();
TL=readchar();
TH=readchar();
if((TH&0xf8)!=0x00)
{
flag=1;
TL=~TL;
TH=~TH;
tltemp=TL+1;
TL=tltemp;
if(tltemp>255)
TH++;
TN=TH*16+TL/16;
TD=(TL%16)*10/16;
}
TN=TH*16+TL/16;
TD=(TL%16)*10/16;
display_zheng(TN);
display_xiao(TD);
delay(10);
if(25<TN)
led0=0;
else
led0=1;
}
}
|
|