请教关于DS18B20温度传感器的温度读取

请教关于DS18B20温度传感器的温度读取,第1张

我这有个现成的C源程序,你参考一下吧!

三通道18B20温度测量数码管显示。-55-+125℃,用1位数码管显示当前通道号,4位数码管显示18B20当前通道温度值(一位小数),负号位与正温度百位1用同一位数码管显示,该位为0不显示,如:0 279、1 1231、2 -356。连接方法:三个18B20均接P37,P0口(JP10)接8位数码管段码口(J12)。

#include <reg52h>

#include <intrinsh>

typedef unsigned char uint8;

typedef unsigned int uint16;

sbit ADDR0 = P2^2;

sbit ADDR1 = P2^3;//定义38译码器地址

sbit ADDR2 = P2^4;

uint8 x,h;//定义通道

uint16 ans,ansb[3],f,g,p; //ans各通道温度值,f符号值,g为小数部分,p为1秒的计数变量

code uint8 number[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x80};//0,1,2,3,4,5,6,7,8,9,-,灭,小数点

sbit DQ = P3^7; //温度DQ一线输入口

#define nops(); {_nop_(); _nop_(); _nop_(); _nop_();} //定义空指令

uint8 romid[3][8]={//romid二维数组存放每个芯片ROM编号

{0x28,0xA2,0xb4,0x0A,0x00,0x00,0x00,0x83},//0通道

{0x28,0xA2,0xb4,0x0A,0x03,0x00,0x00,0x83},//1通道

{0x28,0xA2,0xb4,0x0A,0x05,0x00,0x00,0x83},//2通道

};

// 定时器初始化

void T1_init(void)

{

TMOD = 0x10; //定时器1工作在方式1(显示扫描定时)

TH1 = 0xfc;

TL1 = 0x67;//T1定时1ms初值

TR1 = 1;//启动T1

}

void delay(uint16 n)

{

while (n--);

}

// 18B20复位函数

void DS18b20_reset(void)

{

bit flag=1;

while (flag)

{

while (flag)

{

DQ = 1;

delay(1);

DQ = 0;

delay(50); // 550us

DQ = 1; //给18B20发出复位信号

delay(6); // 66us

flag = DQ; //检测18B20发出的存在脉冲"0",判断复位是否成功

}

delay(45); //延时500us

flag = ~DQ; //18B20存在脉冲过后变"1",取反后仍为"0"

}

DQ=1;

}

//18B20写1个字节函数 向1-WIRE总线上写一个字节

void write_byte(uint8 val)

{

uint8 i;

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

{

DQ = 1;

_nop_();

DQ = 0;

nops(); //4us,110592晶振时每个时钟周期约1us

DQ = val & 0x01; //最低位移出

delay(6); //66us

val >>= 1; //右移一位

}

DQ = 1;

delay(1);

}

//18B20读1个字节函数 从1-WIRE总线上读取一个字节

uint8 read_byte(void)

{

uint8 i, value=0;

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

{

DQ=1;

_nop_();

value >>= 1;

DQ = 0;

nops(); //4us

DQ = 1;

nops(); //4us

if (DQ)

value|=0x80;

delay(6); //66us

}

DQ=1;

return(value);

}

// 启动温度转换

void start_temp_sensor(void)

{

DS18b20_reset();

write_byte(0xCC); // 发Skip ROM命令

write_byte(0x44); // 发转换命令

}

// 读出温度,多点多个18B20测温主程序:

void read_temp() //读取通道x的温度值

{

uint8 i,temp_data[2];//读出温度暂放

uint16 temp;

for(x=0;x<3;x++)

{

DS18b20_reset(); //复位

write_byte(0x55); // 发匹配ROM命令

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

write_byte(romid[x][i]);//写8位器件ID(从左到右),如:28 A2 b4 0A 03 00 00 83。

write_byte(0xBE);//读RAM命令,共9个字节,只取前两温度字节

temp_data[0]=read_byte(); //温度低8位

temp_data[1]=read_byte(); //温度高8位

temp=temp_data[1];//温度高字节

temp=temp<<8;//移到高8位中

temp+=temp_data[0];//温度低字节

ansb[x]=temp;

}

}

// 刷新5位数码管程序

void refresh()

{

static uint8 j = 0,a;//j为数码管位数,a为临时存放红外数据高或低4位

P0 = 0x00;//防止重影

switch(j)

{

case 0: ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;j++;//最右边一位数码管,一位小数

a=g625/1000;//只取小数点后一位,625把16进制换算成对应的10进制

P0 = number[a];break;

case 1: ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;j++;

a = ans%10;//取个位

P0 = number[a];break;

case 2: ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;j++;

a = ans/10%10;//取十位

P0 = number[a];break;

case 3: ADDR0 = 0;ADDR1 = 0;ADDR2 = 1;j++;

a = ans/100%10;//取百位

if (f!=0){a=10;}//若为负显示-号

else if (a!=1){a=11;}//若小于100度该位熄灭

P0 = number[a];break;//为1则正常显示

case 4: ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;j++;

a = 12;//个位显示小数点

P0 = number[a];break;

case 5: ADDR0 = 0;ADDR1 = 1;ADDR2 = 0;j=0; //通道显示

P0 = number[h];break;//显示通道号

default: break;

}

}

main()

{

T1_init();//定时器初始化

while(1)

{

if(TF1==1)

{

TF1 = 0;

TH1 = 0xfc;

TL1 = 0x67;

start_temp_sensor();//启动温度转换

p++;

if(p==1000)// 延时约1秒

{

read_temp();//读各通道温度值

switch(h)

{//切换温度显示通道

case 0: ans=ansb[1];h++;break;//1通道

case 1: ans=ansb[2];h++;break;//2通道

case 2: ans=ansb[0];h=0;break;//0通道

default: break;

}

f=ans&0xF800;//取符号位

g = ans&0x000f;//取小数部分

ans>>=4;//去除小数部分

if (f!=0)

{

ans=~ans+1;

}

p=0;

}

refresh();

}

}

}

您好,三菱PLC读取热电偶温度的程序需要以下步骤:

1首先,您需要将热电偶连接到PLC模块上,确保热电偶与PLC模块之间的连接良好。

2然后,您需要在PLC编程软件中编写程序,以读取热电偶的温度数据。

3接下来,您需要将编写的程序上传到PLC模块中,以便PLC模块能够正确读取热电偶的温度数据。

4最后,您需要在PLC编程软件中设置报警值,以便在热电偶温度超出设定范围时发出警报。

通过以上步骤,您就可以完成三菱PLC读取热电偶温度的程序。

#include<stdioh>

int main()

{float c,f;

printf("请输入摄氏温度:");

scanf("%f",&c);

f=c9/5+32;

printf("华氏温度是%2f\n",f);

return 0;

}

如图所示,西门子S7-200系列PLC的CPU 226加上EM231(模拟量输入RTD模块),就可以直接读取PT100的温度了,第一路PT100的温度就保存在AIW0中,AIW0是按照01℃保存温度的,例如AIW0=123,就是123℃。因此将整数字AIW0的转成整数双字VD0,整数双字VD0转成实数VD4,VD4再除以10等于VD8,VD8就是实际采集到的PT100的温度值了。

望采纳。。。。。。

转换后的温度是一个二进制数,但是不与十进制的实际温度相对应,这几句只是把温度转换成实际的温度值,而且转换的方法也不止这一种,就像楼上说的,不懂得芯片多查查手册吧,很详细的

/ds18b20读一个字节/

unsigned char ReadOneChar(void)

{

uchar i=0; //定义i用于循环

uchar dat = 0; //读取的8位数据

for (i=8;i>0;i--) //8次循环

{

DQ = 0; //拉低DQ总线开始读时序

dat>>=1; //dat左移一位

DQ = 1; //释放DQ总线

if(DQ) //如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat即为读取的数据)

//DQ=0,就跳过

dat|=0x80;

delay_18B20(4); // 延时以完成此次读时 序,之后再读下一数据

}

return(dat); //返回读取的dat

}

DQ = dat&0x01;这句语句是错误的。DQ为位变量,而dat为 unsigned char

如果真要这么写的话,应该是这样 :DQ = (bit)dat&0x01;

把我写的给你做个参考吧:

extern uchar8 sig; //sig判定温度符号

/延时函数/

void delay (int us) //DELAY-110592MHZ 调用程序大约为24us,每次循环为16us

{

int s;

for(s=0;s<us;s++);

}

void delayms(int z) //z为毫秒数

{

int x,y;

for(x=z;x>0;x--)

for(y=125;y>0;y--);

}

/复位程序/

unsigned char reset(void)

{

uchar8 presence;

DQ=0; //拉低总线。当总线停留在低电平480us-960us ,总线上所以器件都将被复位

delay(30); //保持低电平504us

DQ=1; //释放总线,让其恢复高电平

delay(3); //等待芯片应答信号

presence=DQ; //获取应答信号

delay(25); //延时以完成整个时序

return(presence); //返回应答信号。有芯片应答返回0,否则返回1。

}

/写一位数据/

void write_bit(char bitval)

{

DQ=0; //拉低DQ总线,开始时序

if(bitval==1) //如果写入的为1,则返回高电平

DQ=1;

delay(5); //延时104us,以完成整个时序

DQ=1;

}

/写一字节数据/

void write_byte(char val)

{

uchar8 i,temp;

for (i=0;i<8;i++) //写入一个字节的数据,一个时序中写一次

{

temp=val>>i; //右移i位

temp&=0x01; //复制那位数据到temp

write_bit(temp); //调用write_bit()

}

delay(5); //延时104us以完成此次时序,之后再写下一数据

}

/读一位数据/

uchar8 read_bit(void)

{

uchar8 i;

DQ=0; //拉低DQ,开始读时序

DQ=1; //释放DQ总线

for(i=0;i<3;i++); //从时序开始延时15us

return(DQ); //返回DQ值

}

/读一字节数据/

uchar8 read_byte(void)

{

uchar8 i,value=0;

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

{

if(read_bit()) //读一字节数据,一个时序中读一次,并作移位处理

value|=0x01<<i;

delay(6); //延时以完成此次读时序,之后再读下一数据

}

return(value);

}

/温度转化/

void tmconvert(void)

{

reset(); //复位

delay(1);

write_byte(0xcc); //仅一个DS18b20 ,跳过ROM

write_byte(0x44); //温度变换

}

/读取温度/

long gettm(void)

{

uchar8 LSB=0,MSB=0; //用于存储读取的温度

long temp;

reset(); //复位

write_byte(0xcc); //写指令,跳过ROM,仅一个DS18b20

write_byte(0xbe); //写指令,读暂存存储器

LSB = read_byte(); //读LSB

MSB = read_byte(); //读MSB

sig=(MSB>>4==0X0F);

if(sig) //判断符号位是否为负值,是负值了,转去处理

{

LSB=~LSB; //温度处理

MSB=~MSB;

LSB=LSB+1;

}

temp=MSB256+LSB; //十六进制转换为10进制

temp=temp100/16; //12位精度,最小分辨率为00625°C

return temp; //获得001°C 的精度并返回

}

以上就是关于请教关于DS18B20温度传感器的温度读取全部的内容,包括:请教关于DS18B20温度传感器的温度读取、三菱plc读取热电偶温度的程序、怎么样写温度转换的c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存