行业资讯
你可以参考一下我的程序,18B20中的负温度是以补码表示的!!!!!!
/*******DS18B20程序读取温度******/
uchar ReadTemperature(void)
{
uchar a;
uchar b;
uint t=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共咐斗可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低8位
b=ReadOneChar(); //高8位
t=b;
t=8;
t=t|a;
if(t=2048)//最高位为一说明是个负温
{
t^=0xffff;
dis_buf[0]=17;//在数码管上显示“-”,你可以用一个程序旦简帆标志位的0,1来表示正温模雹负温
}
else
{
dis_buf[0]=16;
}
t=t4;//*0.0625; //数值转换
return((uchar)t);
}
1、利用串口通讯将单片机采集的温度数据传给上位机,譬如上位机可以用VC++开发
2、上位机在串口接收数据事件中,可参考如下代码:
void
CSCommTestDlg::OnComm()
{
//
TODO:
Add
your
control
notification
handler
code
here
VARIANT
variant_inp;
COleSafeArray
safearray_inp;
LONG
len,k;
BYTE
rxdata[2048];
//设置BYTE数组
An
8-bit
integerthat
is
not
signed.
CString
strtemp;
if(m_ctrlComm.GetCommEvent()==2)
/培掘/配烂核事件值为2表示接收缓冲区内有字历仿符
{
variant_inp=m_ctrlComm.GetInput();
//读缓冲区
safearray_inp=variant_inp;
//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();
//得到有效数据长度
for(k=0;klen;k++)
safearray_inp.GetElement(k,rxdata+k);//转换为BYTE型数组
for(k=0;klen;k++)
//将数组转换为Cstring型变量
{
BYTE
bt=*(char*)(rxdata+k);
//字符型
strtemp.Format("%d",bt);
//将字符送入临时变量strtemp存放
m_strRXData=strtemp;
//加入接收编辑框对应字符串
}
}
UpdateData(FALSE);
//更新编辑框内容
}
void delay_18B20(unsigned int i)
{
while(i--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; /燃哪/DQ复位
delay_18B20(80); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(800); //精确延时 大于 480us
DQ = 1; //拉高总线皮虚码
delay_18B20(140);
x=DQ; delay_18B20(200);
}
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i0;i--)
{
DQ = 0; // 给脉冲信号
dat=1;
DQ = 1; /誉团/ 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(40); //40
}
return(dat);
}
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i0; i--)
{
DQ = 0;
DQ = dat0x01;
delay_18B20(50); //50
DQ = 1;
dat=1;
}
}
unsigned int ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int temp_value=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
delay_18B20(1000);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(1000);
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
temp_value = b8;
temp_value |= a;
return temp_value;
}
这两句话是在读取18B20里面的数据,这个温度传感器是将温度已16个字节链雹上传的,高5位表示的时温度的正负,后面启戚12位表示的是无符号悄唤陵数值。最大精度为0.0625度。第一句是将16字节数据的低8位读出来,第二局是将数据的高8位读出来。
如果是模拟的温度传感器,它会把温度转化为对应范围的电压或电流,比如传感器的测温范围是0到100°,那对应输出的电压是0到5V或禅胡碰者4到20mA,如果用单片做吵机识别还要加AD转换器。
如果是数字的温度传感器,它会把温度转化为对应范围的二进制代码,比如传感器的测贺谈温范围是0到100°,那对应输出的二进制代码是0x00到0xFF,因为已经是数字信号,单片机可以直接识别,不需要ADC
上面只是举例而已,具体的参考器件手册
通信者拦
数字式温度传感器(简称SWC),又称集成数字脉冲式感温探头,是一种新型的三端温度变送器件。该器件采用集成模块化设计,可以直接将被测温度信辩兄号转化为数字脉冲信号输出,具有传输距离远,首灶胡抗干扰能力强,转换精度高等优点。它可以方便地与51系列单片机接口,而省去A/D转换集成电路,降低成本,提高可靠性,缩小体积,可广泛应用于军事、医药卫生、食品及自动化测控系统中。
SWC三条引脚的名称分别为控制线(K)、信号线(S)、公共线(G)。其K端实际上也是电源线,其工作方式为加电启动或宽脉冲触发式。当对其控制线加电(或宽脉冲)触发时,经复位时间TQ之后信号线上便输出一串脉冲。该串脉冲的个数即表示被测温度的数字量(见图1)。
一点销电子网
Yidianxiao Electronic Website Platform