ds18b20触摸没反应_DS18B20仿真出现问题 求教

这篇博客主要讨论了在使用DS18B20温度传感器时遇到的初始化失败和触摸无响应的问题。博主提供了初始化函数和读取温度的代码,并分析了可能的故障原因。通过代码调试和修改,最终实现了正常读取温度值的功能。
摘要由CSDN通过智能技术生成

//no result

#includetypedef unsigned char uchar;

typedef unsigned int uint;

uchar tempL=0;                 //设全局变量

uchar tempH=0;

uint z;                        //测量到的温度的整数部分

uchar p1;                //小数第一位

uchar p2;                //小数第二位

uchar p;                //两位小数

bit flag=1;                                //温度正负标志

bit DS18B20_IS_OK = 1;

uchar code number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//IO

sbit c1=P2^0;

sbit c2=P2^1;

sbit en_139=P2^2;

sbit DQ=P2^3;//ds18b20与单片机连接口

sbit en_573=P2^4;

void delay0(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=80;y>0;y--);

}

void select(uchar i)

{

switch(i)

{

case 1:c1=0,c2=0;break;

case 2:c1=1,c2=0;break;

case 3:c1=0,c2=1;break;

default:c1=1,c2=1;break;

}

}

void display(uchar dat,uchar i)

{

select(i);

P3=number[dat];

delay0(1);

}

void Delay(uint x)

{

while(--x);

}

/*void Init_DS18B20(void)

{

uchar x=0;

DQ=1;                                         //DQ先置高

delay0(8);                                 //稍延时

DQ=0;                                         //发送复位脉冲

delay0(80);                                 //延时(>480us)

DQ=1;                                         //拉高数据线

delay0(5);                                 //等待(15~60us)

x=DQ;                                         //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1

delay0(20);

}*/

uchar Init_DS18B20(void)

{

uchar status;

DQ = 1;

Delay(8);

DQ = 0;

Delay(90);

DQ = 1;

Delay(8);

DQ = 1;

return status;

}

//读一个字节

/*uchar ReadOneChar(void)                          //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号

{

uchar i=0;                 //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期

uchar dat=0;

for (i=8;i>0;i--)                 //一个字节有8位

{

DQ=1;

delay0(1);

DQ=0;

dat>>=1;

DQ=1;

if(DQ)

dat|=0x80;

delay0(4);

}

return(dat);

}*/

uchar ReadOneByte()

{

uchar i,dat=0;

DQ = 1;

_nop_();

for(i=0;i<8;i++)

{

DQ = 0;

dat >>= 1;

DQ = 1;

_nop_();

_nop_();

if(DQ)

dat |= 0X80;

Delay(30);

DQ = 1;

}

return dat;

}

//写一个字节

/*void WriteOneChar(uchar dat)

{

uchar i=0;                 //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,

for(i=8;i>0;i--)                 //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。

{

DQ=0;                                 //在开始另一个写周期前必须有1us以上的高电平恢复期。

DQ=dat&0x01;

delay0(5);

DQ=1;

dat>>=1;

}

delay0(4);

}*/

void WriteOneByte(uchar dat)

{

uchar i;

for(i=0;i<8;i++)

{

DQ = 0;

DQ = dat& 0x01;

Delay(5);

DQ = 1;

dat >>= 1;

}

}

//读温度值(低位放tempL;高位放tempH;)

void ReadTemperature(void)

{

if(Init_DS18B20()==1)

DS18B20_IS_OK=0;

else

{

WriteOneByte(0xcc);

WriteOneByte(0x44);

Init_DS18B20();

WriteOneByte(0xcc);

WriteOneByte(0xbe);

tempL=ReadOneByte();

tempH=ReadOneByte();

DS18B20_IS_OK=1;

if(tempH>0x7f)                                      //最高位为1时温度是负

{

tempL=~tempL;                                        //补码转换,取反加一

tempH=~tempH+1;

flag=0;                                                      //读取温度为负时flag=0

}

//z=tempL/16+tempH*16;              //整数部分

z=((tempL&0xf0)>>4)|((tempH&0x07)<<4);

p1=(tempL&0x0f)*10/16;                 //小数第一位

p2=(tempL&0x0f)*100/16%10;        //小数第二位

p=p1*10+p2;                 //小数两位

DS18B20_IS_OK=1;

}

}

//显示函数

void display_0()

{

display(z/10,1);

display(z%10,2);

display(p1,3);

display(p2,4);

}

void sys_init()

{

en_139=0;

}

void main()

{

sys_init();

ReadTemperature();

Delay(5000);

Delay(5000);

while(1)

{

if(DS18B20_IS_OK)

display_0();

delay0(1);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值