ds18b20触摸没反应_DS18B20无法工作,求高手知道

#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为无符号整型变量,为什么会出现负数.求高手知道

*********

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值