我用proteus仿真DS18B20时,为什么读取的值为0 下面是我的程序; 请各位高手指点
下面是我的程序和电路#include<reg52.h>#include"intrins.h"#include"lcd1.h"#defineucharunsignedcha...
下面是我的程序和电路
#include<reg52.h>
#include "intrins.h"
#include "lcd1.h"
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^1;
uint num_table[10]={'0','1','2','3','4','5','6','7','8','9'};
uchar flag = 2;
void delay_uss(uchar t_us)
{
uchar i;
for( i = t_us; i>0; i--)
_nop_();
}
void delay_mss(uint t_us)
{
uint i,j;
for( i = t_us; i>0; i--)
for( j = 1000; j>0 ; j--)
_nop_();
}
void master_reset()
{
uchar i = 0;
DQ = 1;
DQ = 0;
delay_uss(80);
DQ = 1;
i = 20;
while(DQ == 1)
{
if( i-- == 0)
break;
}
i = 100;
while(DQ == 0)
{
if( i-- == 0)
break;
}
DQ = 1;
delay_uss(5);
}
void write_byte(uchar byte)
{
uchar j=0;
uchar i=0;
bit btmp;
for( j=1;j<=8;j++)
{
btmp = byte&0x01;//先发送最低位
byte = byte>>1;
if(btmp)
{
DQ = 0;
i++;
i++;
DQ = 1;
i = 8;
while(i>0) i--;
}
else
{
DQ = 0;
i = 8;
while(i>0) i--;
DQ = 1;
i++;
i++;
}
}
}
bit read_bit()
{
bit b=0;
DQ = 0;
_nop_();
delay_uss(1);//15us以上
b = DQ;
delay_uss(5); //45us以上
return(b);
}
uchar read_byte()
{
uchar temp = 0;
uchar i = 0;
uchar dat = 0;
for( i =0; i<8; i++)
{ temp = read_bit();
dat = (dat|(temp << i));
}
return (dat);
}
uint tem_convert(uchar teml,uchar temh)
{
uchar templ=0,temph=0;
uint temp=0;
templ = teml;
temph = temh;
if((temph&&0xf8)==0)
flag = 0;//表示是正数
else
flag = 1;//表示是负数
if(flag == 0)
{
temp = ((temph&&0x07)%16)*256+(teml/16)*16+teml%16;
temp = (uint)(temp*0.0625);
}
else
if(flag == 1)
{
temph = (temph^0x07);
templ = (templ^0xff);
templ = templ+1;
temph = temph+(uchar)CY;
temp = ((temph&&0x07)%16)*256+(teml/16)*16+teml%16;
temp = (uint)(temp*0.0625);
}
return (temp);
}
void display(uint dat)
{
lcd_wcmd(0x82);
if(flag == 0)
lcd_wdat('+');
else
if(flag == 1)
lcd_wdat('-');
lcd_wdat(num_table[dat/100]);
lcd_wdat(num_table[dat%100/10]);
lcd_wdat(num_table[dat%10]);
lcd_wdat('o');
lcd_wdat('C');
}
void main()
{ uchar teml=0,temh=0;
uint dat = 0;
lcd_init();
master_reset();
write_byte(0xcc);
write_byte(0x44);
DQ = 1;
delay_mss(100); //500ms以上,用以正确的进行温度转换
master_reset();
write_byte(0xcc);
write_byte(0xBE);
teml=read_byte();
temh=read_byte();
dat=tem_convert(teml,temh);
display(dat);
while(1);
} 展开
#include<reg52.h>
#include "intrins.h"
#include "lcd1.h"
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^1;
uint num_table[10]={'0','1','2','3','4','5','6','7','8','9'};
uchar flag = 2;
void delay_uss(uchar t_us)
{
uchar i;
for( i = t_us; i>0; i--)
_nop_();
}
void delay_mss(uint t_us)
{
uint i,j;
for( i = t_us; i>0; i--)
for( j = 1000; j>0 ; j--)
_nop_();
}
void master_reset()
{
uchar i = 0;
DQ = 1;
DQ = 0;
delay_uss(80);
DQ = 1;
i = 20;
while(DQ == 1)
{
if( i-- == 0)
break;
}
i = 100;
while(DQ == 0)
{
if( i-- == 0)
break;
}
DQ = 1;
delay_uss(5);
}
void write_byte(uchar byte)
{
uchar j=0;
uchar i=0;
bit btmp;
for( j=1;j<=8;j++)
{
btmp = byte&0x01;//先发送最低位
byte = byte>>1;
if(btmp)
{
DQ = 0;
i++;
i++;
DQ = 1;
i = 8;
while(i>0) i--;
}
else
{
DQ = 0;
i = 8;
while(i>0) i--;
DQ = 1;
i++;
i++;
}
}
}
bit read_bit()
{
bit b=0;
DQ = 0;
_nop_();
delay_uss(1);//15us以上
b = DQ;
delay_uss(5); //45us以上
return(b);
}
uchar read_byte()
{
uchar temp = 0;
uchar i = 0;
uchar dat = 0;
for( i =0; i<8; i++)
{ temp = read_bit();
dat = (dat|(temp << i));
}
return (dat);
}
uint tem_convert(uchar teml,uchar temh)
{
uchar templ=0,temph=0;
uint temp=0;
templ = teml;
temph = temh;
if((temph&&0xf8)==0)
flag = 0;//表示是正数
else
flag = 1;//表示是负数
if(flag == 0)
{
temp = ((temph&&0x07)%16)*256+(teml/16)*16+teml%16;
temp = (uint)(temp*0.0625);
}
else
if(flag == 1)
{
temph = (temph^0x07);
templ = (templ^0xff);
templ = templ+1;
temph = temph+(uchar)CY;
temp = ((temph&&0x07)%16)*256+(teml/16)*16+teml%16;
temp = (uint)(temp*0.0625);
}
return (temp);
}
void display(uint dat)
{
lcd_wcmd(0x82);
if(flag == 0)
lcd_wdat('+');
else
if(flag == 1)
lcd_wdat('-');
lcd_wdat(num_table[dat/100]);
lcd_wdat(num_table[dat%100/10]);
lcd_wdat(num_table[dat%10]);
lcd_wdat('o');
lcd_wdat('C');
}
void main()
{ uchar teml=0,temh=0;
uint dat = 0;
lcd_init();
master_reset();
write_byte(0xcc);
write_byte(0x44);
DQ = 1;
delay_mss(100); //500ms以上,用以正确的进行温度转换
master_reset();
write_byte(0xcc);
write_byte(0xBE);
teml=read_byte();
temh=read_byte();
dat=tem_convert(teml,temh);
display(dat);
while(1);
} 展开
2个回答
展开全部
你把数组换成 uint num_table[]={0,1,2,3,4,5,6,7,8,9};
追问
不行啊 ,你有没有可以正常读取的程序,发一份给我1021352516谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
STM32F103R8T6是ST旗下的一款常用的增强型系列微控制器,是一款基于ARM Cortex-M内核的微控制器。STM32F103R8T6主要面向消费类电子产品、工业控制、医疗仪器、汽车电子等领域,可用于开发各种类型的应用。STM32...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
应该是软件的问题...
更多追问追答
追问
那你有没有可以正常读取的程序,发一份给我,谢谢
追答
程序太长了
怕不好懂哦.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询