#include <at89x51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^3;//ds18b20與單片機連接口
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;
uchar data disdata[5];
uint tvalue,CurrentT=0;//溫度值
uchar tflag;//溫度正負標志
#define LCD_BUS P0
sbit SetKey = P2^2;
sbit UpKey = P2^1;
sbit DnKey = P2^0;
sbit BEEP = P2^4;
sbit Heat = P1^0;
sbit Cool = P1^1;
unsigned char AlarmTempLow=10,AlarmTempTop=40,Set=0,NG=0;
void delayms(uint ms) //延時xx毫秒
{
uchar i; while(ms--)
{
for(i=0;i<120;i++); } }
void command(uint com)
{
RS=0;
LCD_BUS=com;
delayms(5);
EN=1;
delayms(5);
EN=0; }
void write_dat(uchar dat)
{ RS=1;
LCD_BUS=dat;
delayms(5);
EN=1;
delayms(5);
EN=0; }
void writestring (uchar x ,uchar y,uchar s)
{ if (y == 0) command(0x80 + x);
else command(0xC0 + x);
while( s)
{
write_dat( s); } }
void writeChar (uchar x ,uchar y,uchar s)
{ if (y == 0) command(0x80 + x);
else command(0xC0 + x);
{
write_dat( s);
} }
void LCD_Initial()
{
EN=0;
RW=0;
command(0x38);
command(0x0c);
command(0x06);
command(0x01);
command(0x80+0x02); }
void delay_18B20(unsigned int i)
{while(i--);}
void ds1820rst(void)
{unsigned char x=0;
DQ=1;
delay_18B20(4);
DQ=0;
delay_18B20(4);
DQ=1;
delay_18B20(4);
}
uchar ds1820rd(void)
{unsigned char i=0;unsigned char dat=0;for(i=8;i>0;i--)
{DQ=0;dat>>=1;DQ=1;if(DQ)dat|=0x80;delay_18B20(10);}
return(dat);}
void ds1820wr(uchar wdata)
{unsigned char i=0;
for(i=8;i>0;i--)
{DQ=wdata&0x01;
delay_18B20(10);
DQ=1;wdata>>=1;}
}
unsigned int Read_Temperature(void)
/*讀取溫度值并轉換*/
{uchar a,b;
ds1820rst();
ds1820wr(0xcc);
ds1820wr(0x44);
ds1820rst();
ds1820wr(0xcc);
ds1820wr(0xbe);
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625);
CurrentT=tvalue;
return(tvalue);
}
void Display_Temperature()
//顯示溫度
{
uchar flagdat;
disdata[0]=tvalue/1000+0x30;
disdata[1]=tvalue%1000/100+0x30;
disdata[2]=tvalue%100/10+0x30;
disdata[3]=tvalue%10+0x30;
if(tflag==0)
flagdat=0x20;
else
flagdat=0x2d;//負溫度顯示負號:- //
if(disdata[0]==0x30)
{
disdata[0]=0x20;
if(disdata[1]==0x30)
disdata[0]=0x20; }
if(tflag==1)
{
writeChar(10,0,flagdat); //
wr_com(0x8a); wr_dat(flagdat);//顯示符號位
writeChar(11,0,disdata[0]); //
wr_com(0x8b); wr_dat(disdata[0]);//顯示百位
writeChar(12,0,disdata[1]);//
wr_com(0x8c);wr_dat(disdata[1]);//顯示十位
writeChar(13,0,disdata[2]);//wr_com(0x8d);
wr_dat(disdata[2]);//顯示個位
writeChar(14,0,0X2E);//
wr_com(0x8e);wr_dat(0x2e);//顯示小數點
writeChar(15,0,disdata[3]);//
wr_com(0x8f);
wr_dat(disdata[3]);//顯示小數位
}
else {writeChar (10,0,disdata[0]);//
wr_com(0x8a);wr_dat(disdata[0]);//顯示百位
writeChar(11,0,disdata[1]);//
wr_com(0x8b);wr_dat(disdata[1]);//顯示十位
writeChar(12,0,disdata[2]);//
wr_com(0x8c);
wr_dat(disdata[2]);//顯示個位
writeChar(13,0,0X2e);
wr_com(0x8d);
wr_dat(0x2e);//顯示小數點
writeChar(14,0,disdata[3]);
wr_com(0x8e);
wr_dat(disdata[3]);//顯示小數位
} }
void SetFun(void)
{
unsigned char i1=0,i2=0,i3=0,i4=0,i5=0,i6=0;
if(SetKey==0)
{ delayms(20); if(SetKey==0)
{ if(Set<2) Set++; else Set=0; }
switch(Set)
{
case 0: writestring(0,1," ");
writestring(8,1," ");
break;
case 1: writestring(0,1,">");
writestring(8,1," ");
break;
case 2: writestring(0,1," ");
writestring(8,1,">");
break; }
while(SetKey==0); }
if((UpKey==0)&&(Set!=0))
{
delayms(20);
if(UpKey==0)
{
switch(Set)
{
case 1: if(AlarmTempLow<99)
AlarmTempLow++;
else AlarmTempLow=99;
break;
case 2: if(AlarmTempTop<99) AlarmTempTop++;
else AlarmTempTop=99; break; }
i1 = AlarmTempLow/100;
i2 = AlarmTempLow%100/10;
i3 = AlarmTempLow%10;
i4 = AlarmTempTop/100;
i5 = AlarmTempTop%100/10;
i6 = AlarmTempTop%10;
writestring(5,1," ");
writestring(13,1," ");
if(i1!=0) writeChar(5,1,i1+'0');
if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
if(i1!=0) writeChar(6,1,i2+'0');
if((i1==0)&&(i2==0)) writeChar(5,1,i3+'0');
else if((i1==0)&&(i2!=0)) writeChar(6,1,i3+'0');
if((i1!=0)) writeChar(7,1,i3+'0');
if(i4!=0) writeChar(13,1,i4+'0');
if((i4==0)&&(i5!=0))
writeChar(13,1,i5+'0');
if(i4!=0) writeChar(14,1,i5+'0');
if((i4==0)&&(i5==0)) writeChar(13,1,i6+'0');
else if((i4==0)&&(i5!=0)) writeChar(14,1,i6+'0');
if((i4!=0)) writeChar(15,1,i6+'0');
while(UpKey==0); } }
if((DnKey==0)&&(Set!=0))
{
delayms(20);
if(DnKey==0)
{
switch(Set)
{
case 1: if(AlarmTempLow>0) AlarmTempLow--;
else AlarmTempLow=0;
break;
case 2: if(AlarmTempTop>0) AlarmTempTop--;
else AlarmTempTop=0; break; }
i1 = AlarmTempLow/100;
i2 = AlarmTempLow%(10,0,disdata[0]);
i3 = AlarmTempLow%10; //獲得溫度值的個位
i4 = AlarmTempTop/100; //獲得溫度值的百位
i5 = AlarmTempTop%100/10; //獲得溫度值的十位
i6 = AlarmTempTop%10; //獲得溫度值的個位
writestring(5,1," ");
writestring(13,1," ");
if(i1!=0) writeChar(5,1,i1+'0');
if((i1==0)&&(i2!=0)) writeChar(5,1,i2+'0');
if(i1!=0) writeChar(6,1,i2+'0');
if((i1==0)&&(i2==0)) writeChar(5,1,i3+'0');
else if((i1==0)&&(i2!=0)) writeChar(6,1,i3+'0');
if((i1!=0))
writeChar(7,1,i3+'0');
if(i4!=0) writeChar(13,1,i4+'0');
if((i4==0)&&(i5!=0))
writeChar(13,1,i5+'0');
if(i4!=0) writeChar(14,1,i5+'0');
if((i4==0)&&(i5==0))
writeChar(13,1,i6+'0');
else if((i4==0)&&(i5!=0))
writeChar(14,1,i6+'0');
if((i4!=0))
writeChar(15,1,i6+'0');
writeChar(4,1,i1+'0');
writeChar(5,1,i2+'0');
writeChar(6,1,i3+'0');
writeChar(12,1,i4+'0');
writeChar(13,1,i5+'0');
writeChar(14,1,i6+'0');
while(DnKey==0); } } }
void Alarm(void)
{
if((CurrentT>(AlarmTempTop*10))||(CurrentT<(AlarmTempLow*10))||(tflag==1))
{ BEEP=0; }
else
{ BEEP=1; } }
void main(void)
{
unsigned char i=0;
P3=0xef;
P2=0xef;P1=0x00;BEEP=1;
LCD_Initial();
Read_Temperature();
writestring(1,0,"DS18B20 Alarmer"); //顯示“DS18B20 Alarmer” delayms(1000); //延時1S
writestring(0,0,"Current T= "); //顯示“Current T= ”
}
writestring(0,1," Low=10 Top=40 "); //顯示“ Low=10 Top=40
NG=0; while(1)
{
Read_Temperature(); // //讀取溫度值
Display_Temperature(); //顯示溫度值
SetFun();
Alarm();
if((CurrentT<(AlarmTempTop*10))&&(CurrentT>(AlarmTempLow*10)))
{ Cool=0;Heat=0; }
else if((CurrentT>(AlarmTempTop*10)))
{ Cool=1;Heat=0; }
else if((CurrentT<(AlarmTempLow*10))||(tflag==1))
{ Cool=0;Heat=1; } }
程序一直報錯 找不出問題 求大神幫助
|