标题:
ds18b20读数一直是ff
[打印本页]
作者:
小蜜蜂o
时间:
2016-1-11 15:31
标题:
ds18b20读数一直是ff
延时函数没问题,debug里调的,都不带形参,形参代了不是线性时间增加。我看有些人的延时函数里有形参,这样延时时间根本就不会准确嘛。
我读出来的温度值全是ff,测试ds18b20有响应,不知道什么问题。
//////////////////////时钟晶振为11.0592计算的//////////////////////
#include<reg52.h>
#include<intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit dat_18b20=P2^7;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar a[5]={1};
uchar shi,ge,xiao;
void delay10us()//实际为10.9us
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay(uint z)
{
while(z--);
}
void delay100us()//
{
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
}
void delay60us()//实际为67us
{
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
}
bit ack_18b20()//检查是否存在:返回0,存在
{
bit x=1;
EA=0;
dat_18b20=0;
delay100us();
delay100us();
delay100us();
delay100us();
delay100us();//延时500us
dat_18b20=1;
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();//延时实际63.6us
x=dat_18b20;
while(!dat_18b20);
EA=1;
return x;
}
作者:
小蜜蜂o
时间:
2016-1-11 15:32
接上面
void write_18b20(uchar dat)//位发射
{
uchar x,temp;
EA=0;
for(x=0x01;x!=0;x<<=1)
{
dat_18b20=0;
_nop_();
_nop_();
temp=dat&&x;
if(!temp)//为0
{
dat_18b20=0;
}
else//为1
{
dat_18b20=1;
}
delay60us();
dat_18b20=1;
}
EA=1;
}
uchar read_18b20()//位读取
{
uchar y=0,x;
EA=0;
for(x=0x01;x!=0;x<<=1)
{
dat_18b20=0;
_nop_();
_nop_();
dat_18b20=1;
_nop_();
_nop_();
if(dat_18b20)
{
y=y|x;
}
delay60us();
}
EA=1;
return y;
}
/////////////////////////////////////////////////////////////////////////////////////////
void display_led(uchar x,uchar y)//x表示数码管位,从左到右:0-3;y为要显示的数字0-f
{
P2=~(0x01<<x);
P3=table[y];
delay(10);
P2=0xff;
P3=0xff;//数码管消隐
}
void config_uart(uint x)//串口比特率x,包含初始化串口
{
EA=1;
ET1=0;
ES=1;
SCON=0X00;
SM0=0;
SM1=1;
REN=1;
TMOD=0X20;
TH1=256-11059200/12/32/x;
TL1=TH1;
TR1=1;
}
void txd_uart(uchar *p,uchar len)//串口发送,发送个数len>=1
{
while(len--)
{
SBUF=*p;
while(!TI);
TI=0;
p++;
}
}
/////////////////////////////////////////////////////////////////////////////////////
void wendu()
{
uchar x,msb,lsb,temp1,temp2;
uint z;
if(!ack_18b20())
display_led(3,1);
else
display_led(3,5);
if(!ack_18b20())
{
write_18b20(0xcc);
write_18b20(0x44);//发送命令转换
}
for(x=0;x<50;x++)
{
delay(10000);
}
if(!ack_18b20())
{
write_18b20(0xcc);
write_18b20(0xbe);//发送读取命令
lsb=read_18b20();
msb=read_18b20();
}
a[0]=msb;
a[1]=lsb;
txd_uart(a,2);//串口发送检测问题
temp1=(msb&0x07)<<4;
temp2=(lsb&0xf0)>>4;
temp1=temp1+temp2;//整数部位
shi=temp1/10;
ge=temp1%10;
temp1=lsb&0x0f;
z=temp1*625;//扩大10000倍,小数化整数
xiao=z/1000;//取小数点后一位
}
void main()
{
uint count;
// delay(10000);
// delay60us();
// delay100us();
delay10us();
delay(50000);
config_uart(9600);
while(1)
{
if(count>=5000)
{
wendu();
count=0;
}
display_led(0,shi);
display_led(1,ge);
display_led(2,xiao);
count++;
}
}
作者:
小蜜蜂o
时间:
2016-1-12 21:43
问题找到了,原因出在位发射那个函数,里面有temp=dat&&x;实际上应该是&。混淆了位&和逻辑&了,哎…………
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1