89C52单片机 DS18B20问题

请问DS18B20中的只要延时的时间大于最小值小于最大值就行了吗
还有以下是数码管显示温度的程序,请问哪出错了,总显示8.5,是不是读与写那些程序的延时的时间弄错了,小弟刚开始学单片机,请大侠指教!
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dq=P1^3;
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
uchar table2[]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};
void start(void);
uchar read(void);
void write(uchar d);
void delay(uchar z);
uchar readtp(void);
void main()
{
while(1)
{
uchar w=200;
uchar temp=0;
p10=1;
p11=0;
p12=0;
temp=readtp();
P0=table2[(temp/10)-1];
while(w)
{
delay(250);
w--;
}
w=200;
delay(256);
P0=table2[(temp%10)-1];
// p10=0;
// p11=0;
// p12=0;
while(w)
{
delay(250);
w--;
}

}
}

//***********************************
void start()
{
uchar a=0;
dq=1;
delay(6);
dq=0;
delay(200);
dq=1;
delay(6);
a=dq;
delay(30);
}
//*******************************
void write(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
dq=0;
delay(3);
dq=dat&0x01;
delay(9);
dq=1;
dat>>=1;
};
delay(6);
}
//**********************

uchar read(void)
{
uchar i;
uchar value;
for(i=0;i<8;i++)
{
dq=0;
value>>=1;
dq=1;
if(dq)
value=value|0x80;
delay(11);
}
return value;
}

//******************************

void delay(uchar z)//z为3是定时10微秒
{
while(z)
z--;

}

//****************************
uchar readtp (void)
{
uchar a;
uchar b;
start();
write(0xcc);
write(0x44);
delay(200);

start();
write(0xcc);
write(0xbe);
a=read();
b=read();
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
还有接的外部晶振是11.0592,数码管应该没问题,注意帮我看看,DS18B20那里有没有什么弄错的

第1个回答  2012-04-12
不知道你硬件怎样连接的,给你一个我写的程序,你对比一下,在我的机子上试验成功
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//sbit beep=P2^3;
sbit dula=P2^6;
sbit wela=P2^7;
sbit ds=P2^2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code table1[]={
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uint temp;
float f_temp;
void delayus(uint z,uint x)
{
uint i,j;
for(i=z;i>0;i--)
for(j=x;j>0;j--);
}
void dreset(void) //初始化
{
uint i;
// ds=1;
// _nop_();
ds=0;
delayus(7,15);
ds=1;
i=4;
while(i>0)
i--;
delayus(1,100);
}
bit tempreadbit(void) //读一位数据
{
uint i;
bit dat;
// ds=1;i++;
ds=0;
_nop_();
ds=1;
i++;i++;
dat=ds;
i=8;
while(i>0)i--;
return(dat);
}
uchar tempread(void) //读一个字节函数
{
uchar i,j,dat;
dat=0;
for(i=0;i<8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tempwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=0;j<8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++; //延时确定时间15US
ds=1;
i=8;
while(i>0)i--;
}
else
{
ds=0;
// i=8;
// while(i>0)i--;
delayus(1,5);
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20温度转换
{
dreset();
delayus(1,113);
tempwritebyte(0xcc); //跳过度ROM指令
tempwritebyte(0x44);//温度转换指令
}
uint get_temp()//读取寄存器中存储的温度数据
{
uchar a,b;
dreset();
delayus(1,113);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
// f_temp=f_temp+0.05;
return temp;
}
void display(uint y)
{
uchar bai,shi,ge;
bai=y/100;
shi=(y%100)/10;
ge=(y%100)%10;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayus(5,113);

dula=1;
P0=table1[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayus(3,113);

dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayus(3,113);
}
void main()
{
uchar a;
while(1)
{
tempchange();
// delayus(1,113);
// get_temp();
for(a=10;a>0;a--)
{
get_temp();
display(temp);
}
}
}
我的最开始也是显示8.5,这是因为没有正确对DS18B20输入命令,自己看吧追问

你以前是在延时上出错吗

追答

不是。
根据DS18B20时序图,编写延时程序,你可用KEIL调试,以确定延时的时间!

本回答被提问者采纳

...温度的单片机的C语言程序,运用的是89c52单片机,附上电路图,谢谢...
include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P1^4; \/\/ds18b20与单片机连接口 unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; \/\/共阴数码管字码表unsigned char code str1[]={0x0bf,0x86,...

大学生比赛—蓝桥杯单片机
在比赛中,仅需使用onewire.h文件,代码相对简单。值得注意的是,2020年竞赛资源包提供的DS18B20底层驱动的头文件适用于基于12T的89C52运行环境,但蓝桥杯竞赛所使用的1T的IAP15F2K61S2单片机运行速度是89C52的8~12倍,因此,为保持DS18B20时序中的延时长度一致,底层驱动文件中的延时参数需放大10倍。数码...

DXP中怎样查找元器件的封装 比如说 DS18B20的封装 我怎么在lib里找到呢...
P89C52X2BN(就是89C52),在Philips Microcontroller 8-Bit.IntLib库里 P89C51RC2BN\/01(就是89C51),在Philips Microcontroller 8-Bit.IntLib库里。一般,型号后的数字中有字母或型号中没有字母,可以在中间加个通配符*试试,不要追求搜到的型号完全一样,只要引脚数相同就行,当然要是引脚功能文字相...

单片机如何将DS18B20温度传感器的数据采集后,通过无线串口发送至PC端...
PC串口收到数据,在串口助手中勾选16进制显示,就是16进制的温度了,或者单片机把16进制的温度转化成字符串形式发到PC,这样串口助手不用勾选16进制显示,直接就能显示成温度。

理解89c52单片机开发板的电路原理图
这个图应该很清楚了,各个功能模块都归纳到一个方框里面:1、LCD1602显示模块接口2、LCD12864显示模块接口3、LED接口4、蜂鸣器接口5、ISP下载接口6、PL2303驱动电路7、电源电路8、数码管电路接口及独立按键接口9、DS18B20温度传感器接口及红外接收电路接口10、CPU11、复位电路和时钟电路。这个开发板缺少4*4矩阵...

郭天祥单片机开发板能用到什么程度
1、89C52单片机,支持USB口或者是串口两种下载程序方式,也就是你不用买单片机烧写器也能够随时烧写程序到你的片子里查看您编写的程序状况。2、6位数码管(做动态扫描及静态显示实验)。3、8位LED发光二极管(做流水灯实验)。4、MAX232芯片RS232通讯接口(可以做为与计算机通迅的接口同时也可做为STC...

dxp中怎么找at89c51?我要具体方法
1. DXP的库文件都是以公司的名字为索引方式,DS18B20你可以去“Dallas Semiconductor”目录下寻找“Dallas Sensor Temperature Sensor”库;AT89S51你可以去“Atmel”目录下的的8位控制器库内寻找。2. DS18B20安装地址:Library\\Dallas Semiconductor\\Dallas Sensor Temperature Sensor.IntLib,...

微控制器系统版和开发板有什么区别。
可以模拟标准的 89C51 , 89C52 , 89C58 等全部51核心的微控制器。 51模拟器占用T2定时器、UART口。使用模拟插针可更换结构,模拟插针可以取下,方便断针后更换,即使断针,也能自行处理,不必返修,小功能,大用处,尤其是对一些比较粗心的人而言。可切换晶振电路,一般使用使用者板上的晶振,也可用本机自带,多一种...

单片机开发板哪个比较优质
1、一个CH340的USB转UART芯片,实现USB下载程序,为无串口的笔记本电脑提供下载方便。2、电源入口有自恢复保险丝,可以有效的保护您的电脑主板和开发板。加上这个保险,作为初学的你,即使不小心短路了,也不会烧主板和单片机。3、单片机芯片TC89C52RC,有8K的程序空间和512字节的数据空间.4、18个LED小...

毕业论文资料收集(采纳追加1000分)
·DS18B20温度检测控制·6KW电磁采暖炉电气设计·基于电流型逆变器的中频冶炼电气设计·新型电磁开水炉设计·新型洗浴器设计·中频淬火电气控制系统设计·中型电弧炉单片机控制系统设计·基于单片机的电火箱调温器·LCD数字式温度湿度测量计·单片机与计算机USB接口通信·万年历的设计·基于单片机的家电远程控制系统设计·超声...

相似回答