#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]="ERROR " ;
uchar code table2[]="turn on";
uchar code table3[]="turn off";
sbit duan=P2^6;
sbit wei=P2^7;
sbit ds=P2^2;
uchar t,a,flag;
uchar code table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90};
unsigned int temp;
float f_temp;
void init()
{ TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ET0=1;
ES=1;
}
void delay (unsigned int z)
{ unsigned int x,y;
for(x=z; x>0;x--)
for(y=110;y<0;y--) ;
}
void dsreset(void) // DS18B20复位,初始化函数
{
unsigned int i;
ds=0;i=103;
while(i>0) i--;
ds=1;
i=4;
while(i>0) i--;
}
bit tempreadbit(void) // 读一位数据函数
{ unsigned int i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0) i--;
return(dat) ;
}
unsigned char tempread(void) //读一个字节数据函数
{ unsigned char i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{ j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat) ;
}
void tempwritebyte(unsigned char dat)
{ unsigned int i;
unsigned char j;
bit testb;
for(j=1;j<=8;j++)
{ testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{ ds=0;
i++;i++;
ds=1;
i=8;while(i>0) i--;
}
else
{ ds=0; //写0
i=8;while(i>0) i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) // DS18B20 开始获取温度并且转换
{ dsreset();
delay(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44) ; //写温度转换指令
}
unsigned int get_temp() //读取寄存器中存储的温度数据
{ unsigned char a,b;
dsreset();
delay(1);
tempwritebyte(0xcc) ;
tempwritebyte(0xbe) ;
a=tempread(); //读低八位
b=tempread(); //读高八位
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;//温度在寄存器中为十二位,分辨率为0.0625°
temp=f_temp*10+0.5;//乘以10表示小数点以后只取一位,加0.5为四舍五入
f_temp=f_temp+0.05;
return temp; // temp 是整数型
}
void main()
{ uint temp_final;
init();
wei=1;
P0=0x07;
wei=0;
duan=1;
P0=table[0];
duan=0;
while(1)
{
if(flag==1)
{
if(a==0x01)
{ ES=0;
TI=1;
printf("turn on \n") ;
while(!TI) ;
TI=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ES=1;
flag=0; }
if(a==0x02)
{ ES=0;
TI=1;
printf("turn off \n") ;
while(!TI) ;
TI=0;
TR0=0;
ES=1;
flag=0; }
if((a!=0x01)&&(a!=0x02))
{ ES=0;
TI=1;
printf("ERROR \n");
while(!TI) ;
TI=0;
ES=1;
flag=0; }
}
if(t==20)
{
flag=0;
t=0;
tempchange();
temp_final= get_temp();
ES=0;
TI=1;
printf("The temp is %d \n",temp_final);
while(!TI) ;
TI=0;
ES=1;
}
}
}
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
void ser() interrupt 4
{ RI=0;
a=SBUF;
flag=1;
}
这个程序返回的TEMP总是-24577,定义的TEMP为无符号整型变量,为什么会出现负数.求高手知道
*********