试试我的驱动(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编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)