导航:首页 > 编程语言 > ds18b20温度传感器编程

ds18b20温度传感器编程

发布时间:2023-05-15 02:53:21

1. ds18b20温度传感器程序 求解释!!! 延时时间怎么计算的

比如
while(t--)
{
_nop_();
}
t在delayus(10)中已经赋值,即t=10,饥清_nop_()是一个空操作NOP(汇编语言中),即一个机器周期,主掘肢举判碧频12Mhz中就是1um.

2. DS18B20温度采集模块编程思想

DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的,也就是你要做的是配置寄存器。根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功让启敏后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号旁缺后等待16~60微秒左右坦枝,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。

3. 急需用温度传感器ds18b20,数码管显示温度的单片机的C语言程序,运用的是89c52单片机,附上电路图,谢谢!

#include<销举闹reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^4; //ds18b20与单片机连接口
unsignedcharcodestr[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴数码管字答早码表
unsignedcharcodestr1[]={0x0bf,0x86,0x0db,0x0cf,0x0e6,0x0ed,0x0fd,0x87,0x0ff,0x0ef};//个位带小数点字码表
unsignedcharcodewei[]={0x0fe,0x0fd,0x0fb,0x0f7};
uchardatadisdata[5];
uint tvalue; //温度值
uchartflag; //温度正负标志
/**********ds1820程序************/
voiddelay_18B20(unsignedinti) //延时1微秒
{
while(i--);
}
voidds1820rst() /*ds1820复位*/
{
unsignedcharx=0;
DQ=1; //DQ复位
delay_18B20(4); //延时
DQ=0; //DQ拉低
delay_18B20(100);//精确延时大于 480us
DQ=1; //拉高
delay_18B20(40);
}
uchards1820rd() /*读数据*/
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0; //给脉冲信号
dat>>=1;
DQ=1; //给脉冲信号
if(DQ) dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata) /*写数据*/
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp() /*读取温度值并转换*/
{
uchara,b;
ds1820rst();
ds1820wr(0xcc);//跳过读序列亏罩号
ds1820wr(0x44);//启动温度转换
ds1820rst();
ds1820wr(0xcc);//跳过读序列号
ds1820wr(0xbe);//读取温度
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+2;tflag=1; //负温度
}
tvalue=tvalue*(0.625); //温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*********************************/
voidds1820disp() //温度值显示
{
uchari;
disdata[0]=tvalue/1000; //百位数
disdata[1]=tvalue%1000/100;//十位数
disdata[2]=tvalue%100/10; //个位数
disdata[3]=tvalue%10; //小数位
if(tflag==0)
{
if(disdata[0]==0x00)
{
disdata[0]=0x0a; //百位数位为0不显示
if(disdata[1]==0x00) disdata[1]=0x0a; //十位数位为0不显示
}
}
else //负温度
{
disdata[0]=0x0b; //负温度百位显示负号:-
if(disdata[1]==0x00) disdata[1]=0x0a; //十位数位为0不显示
}
for(i=0;i<150;i++)
{
P2=wei[0];
P0=str[disdata[3]];
delay_18B20(20);
P2=wei[1];
P0=str1[disdata[2]];
delay_18B20(20);
P2=wei[2];
P0=str[disdata[1]];
delay_18B20(20);
P2=wei[3];
P0=str[disdata[0]];
delay_18B20(20);
}
}
/************主程序**********/
voidmain()
{
ds1820rst(); //初始化显示
while(1)
{
read_temp(); //读取温度
ds1820disp(); //显示
}
}

4. 跪求用温度传感器ds18b20显示温度的单片机程序

把返回值放到你数码管显示子程序中分解显示即可
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=tive*0.0625; //采用12位分辨率所以每次的增量是0.0625

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

return(temper);
}

阅读全文

与ds18b20温度传感器编程相关的资料

热点内容
魔兽60宏命令大全 浏览:475
php志愿者网站源码 浏览:872
贸易pdf 浏览:495
dbug命令 浏览:351
开逛app如何加好友 浏览:958
ftpdos命令下载文件 浏览:75
华为如何打开语音服务器 浏览:242
python中的idle 浏览:1000
五轴联动数控编程 浏览:965
换一台电脑如何远程云服务器 浏览:132
阿里云怎么买云服务器 浏览:664
java提取文字 浏览:97
阿里云服务器同人账号问题 浏览:420
5分钟解压轴题 浏览:341
安卓桌面二级文件夹 浏览:188
eps文档加密 浏览:261
手机怎么做pdf 浏览:162
ug曲面pdf 浏览:279
液化气还是压缩气 浏览:950
阿里云公共ntp服务器地址 浏览:991