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