基于51单片机DS18B20温度传感器的C语言程序和电路.doc
《基于51单片机DS18B20温度传感器的C语言程序和电路.doc》由会员分享,可在线阅读,更多相关《基于51单片机DS18B20温度传感器的C语言程序和电路.doc(4页珍藏版)》请在冰豆网上搜索。
基于51单片机DS18B20温度传感器的C语言程序和电路
DS18B20在外形上和三极管很像,有三只脚。
电压范围为3.0V至5.5V无需备用电源测量温度范围为-55至+125℃。
温度传感器可编程的分辨率为9~12位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置应用范围包括恒温控制,工业系统,消费电子产品温度计,或任何热敏感系统。
下面是DS18B20的子程序,本人用过完全可行的:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P2^0;
voidreset(); //DS18B20复位函数
voidwrite_byte(ucharval); //DS18B20写命令函数
ucharread_byte(void); //DS18B20读1字节函数
voidread_temp(); //温度读取函数
voidwork_temp(); //温度数据处理函数
uchardatatemp_data[2]={0x00,0x00};
uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00}; //对于温度显示值值
ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //温度小数部分查表
main()
{
while
(1)
{
自己添加;
}
}
voiddelay1(uintt)
{
for(;t>0;t--);
}
///////温度控制子函数
voidreset()
{
ucharpresence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();
DQ=0;
delay1(50);
DQ=1;
delay1(6);
presence=DQ;
}
delay1(45);
presence=~DQ;
}
DQ=1;
}
voidwrite_byte(ucharval)
{
uchari;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=val&0x01;
delay1(6);
val=val/2;
}
DQ=1;
_nop_();
}
ucharread_byte(void)
{
uchari;
ucharvalue=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;_nop_();_nop_();_nop_();_nop_();
if(DQ)value|=0x80;
delay1(6);
}
DQ=1;
return(value);
}
voidread_temp()
{
reset();
write_byte(0xcc);
write_byte(0xbe);
temp_data[0]=read_byte();
temp_data[1]=read_byte();
reset();
write_byte(0xcc);
write_byte(0x44);
}
voidwork_temp()
{
if(temp_data[1]>127)
{
temp_data[1]=(256-temp_data[1]);
temp_data[0]=(256-temp_data[0]);
n=1; //需要前面宏定义
}
display[4]=temp_data[0]&0x0f; //低位的低4位
display[0]=ditab[display[4]]; //小数点后的数值
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); //小数点前的数值
display[3]=display[4]/100;
display[1]=display[4]%100;
display[2]=display[1]/10;
display[1]=display[1]%10;
}
电路: