标题:
stc89c52单片机ds18b20传感器,仿真能够获取温度,但是实物却是0
[打印本页]
作者:
21312232213
时间:
2023-5-11 14:41
标题:
stc89c52单片机ds18b20传感器,仿真能够获取温度,但是实物却是0
stc89c52单片机ds18b20传感器,仿真能够获取温度,但是实物却是0,测试过传感器没有问题。
温度获取代码:
/*温度函数*/
void delay_18B20(unsigned int i) //延时1微秒
{
while(i--);
}
/*ds1820复位*/
void ds1820rst(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(40); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
/*读数据*/
uchar ds1820rd(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
/*写数据*/
void ds1820wr(uchar wdata)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
/*读取温度值并转换*/
unsigned int get_temp(void)
{
unsigned int tvalue=0;
uchar a,b;
ds1820rst();
delay_18B20(1);
ds1820wr(0xcc); //跳过读序列号/
ds1820wr(0x44);
delay_18B20(1); //启动温度转换/
ds1820rst();
ds1820wr(0xcc); //跳过读序列号/
ds1820wr(0xbe); //读取温度/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff) ; // tflag=0;
else tvalue=0; // {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625); //温度值扩大10倍,精确到1位小数
return(tvalue);
}
作者:
21312232213
时间:
2023-5-11 14:51
连接单片机sbit DQ=P3^1;
作者:
lkc8210
时间:
2023-5-11 14:57
30块包邮的逻辑分析仪,你值得拥有
作者:
wc86110
时间:
2023-5-11 16:17
仿真≠实物,只有软硬件完美结合才会没问题
作者:
人中狼
时间:
2023-5-11 21:56
代码有问题,确定这个代码在仿真里能用??
作者:
wulin
时间:
2023-5-12 11:33
代码没有什么问题,可能是晶振不合适,延时函数可能不准确导致18b20时序不准所致。下面是在TX-1C实验板上测试,串口返回的数据,晶振11.0592MHz,
/*温度函数*/
void delay_18B20(unsigned int i) //12MHz T=i*9+16us
{
while(i--);}
无标题.jpg
(79.52 KB, 下载次数: 20)
下载附件
2023-5-12 16:28 上传
下面是测试程序,楼主代码部分没有任何改动
#include<reg51.H>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit DQ=P2^2;
uchar data dis_buf[]="000.0\n"; //缓存数组
uint temp;
uchar i;
/*温度函数*/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
/*ds1820复位*/
void ds1820rst(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(40); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
/*读数据*/
uchar ds1820rd(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
/*写数据*/
void ds1820wr(uchar wdata)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
/*读取温度值并转换*/
unsigned int get_temp(void)
{
unsigned int tvalue=0;
uchar a,b;
ds1820rst();
delay_18B20(1);
ds1820wr(0xcc); //跳过读序列号/
ds1820wr(0x44);
delay_18B20(1); //启动温度转换/
ds1820rst();
ds1820wr(0xcc); //跳过读序列号/
ds1820wr(0xbe); //读取温度/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff); // tflag=0;
else tvalue=0; // {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
void InitUART(void)
{
PCON = 0x00;
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}
void main()
{
InitUART();
while(1)
{
temp=get_temp();
dis_buf[0]=temp/1000%10+'0';
dis_buf[1]=temp/100%10+'0';
dis_buf[2]=temp/10%10+'0';
dis_buf[4]=temp%10+'0';
for(i=0;i<6;i++)
{
SBUF=dis_buf[i];
while(!TI);
TI=0;
}
delay_18B20(50000);
}
}
复制代码
作者:
人中狼
时间:
2023-5-12 13:50
if(tvalue<0x0fff) ; // tflag=0;
else tvalue=0; // {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625); //温度值扩大10倍,精确到1位小数
不太理解这一段
作者:
名字不是重点
时间:
2023-5-12 14:06
代码有问题:
if(tvalue<0x0fff) ;
else tvalue=0;
//有这样的语法吗?
作者:
rayin
时间:
2023-5-12 17:01
核对软件时候,不要忘记查下硬件线路有没问题, 与18B20数据脚相连的脚是不是软件定义的那个IO口.不要焊错线了.
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1