请高手帮忙看看DS18B20的程序,20分:51单片机,读老读出0xff,初始化程序正常完成.晶振11.0592M,电路无问题.

请高手帮忙看看DS18B20的程序,20分:51单片机,读老读出0xff,初始化程序正常完成.晶振11.0592M,电路无问题.,第1张

试试我的驱动(12MHz):

//

//DS18B20温度传感器驱动(显示0至60度)

//

void Delay(int num){//延时函数

while(num--) ;

}

//

void Init_DS18B20(void){//初始化ds1820

unsigned char x=0;

DQ = 1; //DQ复位

Delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低

Delay(80); //精确延时 大于 480us

DQ = 1; //拉高总线

Delay(14);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

Delay(20);

}

//

unsigned char ReadOneChar(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(4);

}

return(dat);

}

//

void WriteOneChar(unsigned char dat){//写一个字节

unsigned char i=0;

for (i=8; i>0; i--){

DQ = 0;

DQ = dat&0x01;

Delay(5);

DQ = 1;

dat>>=1;

}

}

//

unsigned int ReadTemperature(void){//读取温度

unsigned char a=0;

unsigned char b=0;

unsigned int t=0;

float tt=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的 *** 作

WriteOneChar(0x44); // 启动温度转换

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的 *** 作

WriteOneChar(0xBE); //读取温度寄存器

a=ReadOneChar(); //读低8位

b=ReadOneChar(); //读高8位

t=b;

t<<=8;

t=t|a;

tt=t00625;

t= tt10+05; //放大10倍输出并四舍五入

return(t);

把返回值放到你数码管显示子程序中分解显示即可

sbit DQ=P1^6; //采集温度数据线

sbit SPK=P3^7;

unsigned char tflag;

unsigned int tive;

float temper;

/

函数功能:短暂延时

入口参数:num

出口参数:

/

void delay(unsigned int num)

{

while(num--);

}

/

函数功能:DS18B20初始化

入口参数:

出口参数:

/

void init_DS18B20(void)

{

//主机发送复位脉冲

DQ=1;

DQ=0;

delay(600); //x

DQ=1;

//等待DS18B20发送应答信号

delay(60); //防止DS18B20本身问题而读不出数据采用确认法

while(!DQ);

// delay(480); //DS18B20本身没有问题,可以延时将应答过程忽略

}

/

函数功能:读一个字节

入口参数:

出口参数:

/

readchar(void) //从低位开始读

{

unsigned char i=0;

unsigned char dat=0;

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

{

DQ=1;

DQ=0;

delay(10); //CPU缓冲时间 采样时间

dat>>=1; //从高到低先存放一位数据

DQ=1;

if(DQ) //如果是1,将数据存放

dat|=0x80;

DQ=1;

delay(9); //数据读取时间,下一次数据读取前需要延时

}

return(dat);

}

/

函数功能:写一个字节

入口参数:

出口参数:

/

writechar(unsigned char dat)

{

unsigned char i=0;

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

{

DQ=1;

DQ=0; //等待接收缓冲区的来临,整个过程的时间为60~120us

delay(15); //

DQ=dat&0x01; //第一次写最低位,将字节变为位

delay(15); //

dat>>=1; //准备写入下一位数据。

}

}

/

函数功能:读取温度

入口参数:

出口参数:

/

read_temperature(void)

{

unsigned int a,b;

init_DS18B20(); //初始化子程序

writechar(0xcc); //写入指令

writechar(0x44);

init_DS18B20();

writechar(0xcc);

writechar(0xbe);

a=readchar(); //低八位

b=readchar(); //高八位

tive=b;

tive<<=8;

tive=tive|a;

if(tive>0x0800) //温度为负温度第13位到15为为1,温度为正温度 //第13位到15为为0,所以值小于0x800说明为正温度

tive=~tive+1;

else

tive=tive;

temper=tive00625; //采用12位分辨率所以每次的增量是00625

temper=temper10; //保留小数点后面一位

return(temper);

}

//18B20单线温度检测的应用样例程序

//青岛理工大学琴岛学院

#include<REG52H>

#include<mathh>

#include<INTRINSH>

#define uchar unsigned char

#define uint unsigned int;

//

sbit seg1=P2^0;

sbit seg2=P2^1;

sbit seg3=P2^2;

sbit DQ=P1^7;//ds18b20 端口

sfr dataled=0x80;//显示数据端口

//

uchar temp;

uchar flag_get,count,num,minute,second;

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//7段数码管段码表共阳

uchar str[3];

//

void delay1(uchar MS);

unsigned char ReadTemperature(void);

void Init_DS18B20(void);

unsigned char ReadOneChar(void);

void WriteOneChar(unsigned char dat);

void delay(unsigned int i);

//

main()

{

TMOD|=0x01;//定时器设置

TH0=0xef;

TL0=0xf0;

IE=0x82;

TR0=1;

P2=0x00;

count=0;

while(1)

{

str[2]=0xc6;//显示C符号

str[0]=tab[temp/10]; //十位温度

str[1]=tab[temp%10]; //个位温度

if(flag_get==1) //定时读取当前温度

{

temp=ReadTemperature();

flag_get=0;

}

}

}

void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔

{

TH0=0xef;//定时器重装值

TL0=0xf0;

num++;

if (num==50)

{num=0;<br> flag_get=1;//标志位有效<br> second++;<br> if(second>=60)<br> {second=0;<br> minute++; <br> }

}

count++;

if(count==1)

{P2=0xf7;<br> dataled=str[0];}//数码管扫描

if(count==2)

{P2=0xfb;<br> dataled=str[1];}

if(count==3)

{ P2=0xfd;

dataled=str[2];

count=0;}

}

//

void delay(unsigned int i)//延时函数

{

while(i--);

}

//

//18b20初始化函数

void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay(80); //精确延时 大于 480us

DQ = 1; //拉高总线

delay(10);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay(5);

}

//读一个字节

unsigned char ReadOneChar(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(5);

}

return(dat);

}

//写一个字节

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay(5);

DQ = 1;

dat>>=1;

}

delay(5);

}

//读取温度

unsigned char ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

//float tt=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的 *** 作

WriteOneChar(0x44); // 启动温度转换

delay(200);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的 *** 作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar();

b=ReadOneChar();

b<<=4;

b+=(a&0xf0)>>4;

t=b;

//tt=t00625;

//t= tt10+05; //放大10倍输出并四舍五入

return(t);

}

以上就是关于请高手帮忙看看DS18B20的程序,20分:51单片机,读老读出0xff,初始化程序正常完成.晶振11.0592M,电路无问题.全部的内容,包括:请高手帮忙看看DS18B20的程序,20分:51单片机,读老读出0xff,初始化程序正常完成.晶振11.0592M,电路无问题.、跪求用温度传感器ds18b20显示温度的单片机程序、ds18b20编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9330411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存