DS18B20温度传感器与模拟信号的采集实验
基于C51单片机设计的简单程序,利用DS18B20温度传感器采集温度,该传感器是数字传感器,所以单片机可以直接读取;另外本实验还添加了模拟电压信号的采集,通过滑动变阻器改变电压信号,完成信号的采集。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
一、DS18B20温度传感器
DS18B20是一款常用的温度传感器,该传感器只有个引脚,分别是VDD、DATA、GND,其中DATA是传感器的信号发送端,通过该引脚可以采集到温度值。
二、仿真图
三、部分代码
ds18b20.c:
#include "18b20.h"
#include "delay.h"
bit tflag = 0;
void dsreset(void)//send reset and initialization command
{
uint i;
DQ=0;
i=103;
while(i>0)i--;
DQ=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void)//read a bit
{
uint i;
bit dat;
DQ=0;i++; //i++ for delay
DQ=1;i++;i++;
dat=DQ;
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void)//read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//
}
return(dat);
}
void tempwritebyte(uchar dat)//write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//write 1
{
DQ=0;
i++;i++;
DQ=1;
i=8;while(i>0)i--;
}
else
{
DQ=0;//write 0
i=8;while(i>0)i--;
DQ=1;
i++;i++;
}
}
}
void tempchange(void) //
{
dsreset();
delay(10);
tempwritebyte(0xcc);// address all drivers on bus
tempwritebyte(0x44); //initiates a single temperature conversion
}
uint get_temp()//»ñȡζÈת»»Æ÷µÄÖµ
{
uint temp=0;
float tt;
uchar a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;//two byte? compose a int variable
temp=temp|a;
if(temp<0x0FFF)
{
tflag=0; //
}
else
{
tflag=1;
temp = ~temp+1; //
}
temp = temp*0.0625;
// tt=temp*0.0625;
// temp=tt*10+0.5;
// tt=tt+0.05;
return temp;
}
ds18b20.h:
#ifndef __18B20_H__
#define __18B20_H__
#include <reg51.h>
#include "intrins.h"
sbit DQ=P3^7;
#define uint unsigned int
#define uchar unsigned char
void dsreset(void);
bit tempreadbit(void);
uchar tempread(void);
void tempwritebyte(uchar dat);
void tempchange(void);
uint get_temp();
#endif
main(主函数调用)main.c
int main()
{
while(1)
{
tempchange();
T = get_temp();
LcdGotoXY(1,0);
LcdPrintStr("T:");
LcdGotoXY(1,2);
WENDULcdPrintNum(T);
LcdGotoXY(1,5);
LcdWriteData(0xdf);
LcdWriteData(0x43);
}
}
总结
基于C51单片机的温度采集系统比较简单,重要的是掌握DS18B20的时序,这样就可以对采集的信号进行处理,本次程序设计封装性比较好,直接调用即可,希望能帮到大家。