概述 DS18B20数字温度传感器接线方便Word文档下载推荐.docx
《概述 DS18B20数字温度传感器接线方便Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《概述 DS18B20数字温度传感器接线方便Word文档下载推荐.docx(17页珍藏版)》请在冰点文库上搜索。
一线总线"
串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
9、负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
2.DS18B20工作原理
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图3所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图2:
DS18B20测温原理框图
3.系统结构框图
单片机系统框图
4.C语言程序
#include<
reg52.h>
stdio.h>
#include"
18b20.h"
1602.h"
delay.h"
bitReadTempFlag;
//定义读时间标志
voidInit_Timer0(void);
//定时器初始化
/*------------------------------------------------
串口通讯初始化
------------------------------------------------*/
voidUART_Init(void)
{
SCON=0x50;
//SCON:
模式1
TMOD|=0x20;
//TMOD:
timer1,mode2,8-bit重装
TH1=0xFD;
//TH1:
重装值9600波特率晶振11.0592MHz
TR1=1;
//TR1:
timer1打开
TI=1;
}
voidmain(void)
{
inttemp;
floattemperature;
chardisplaytemp[16];
//定义显示区域临时存储数组
LCD_Init();
//初始化液晶
DelayMs(20);
//延时有助于稳定
LCD_Clear();
//清屏
Init_Timer0();
UART_Init();
Lcd_User_Chr();
//写入自定义字符
LCD_Write_Char(13,1,0x01);
//写入温度右上角点
LCD_Write_Char(14,1,'
C'
);
//写入字符C
while
(1)//主循环
{
if(ReadTempFlag==1)
ReadTempFlag=0;
temp=ReadTemperature();
temperature=(float)temp*0.0625;
sprintf(displaytemp,"
Temp%7.1f"
temperature);
//打印温度值
LCD_Write_String(0,1,displaytemp);
//显示第二行
}
}
}
定时器初始化子程序
voidInit_Timer0(void)
TMOD|=0x01;
//使用模式1,16位定时器,使用"
|"
符号可以在使用多个定时器时不受影响
//TH0=0x00;
//给定初值
//TL0=0x00;
EA=1;
//总中断打开
ET0=1;
//定时器中断打开
TR0=1;
//定时器开关打开
定时器中断子程序
voidTimer0_isr(void)interrupt1
staticunsignedintnum;
TH0=(65536-2000)/256;
//重新赋值2ms
TL0=(65536-2000)%256;
num++;
if(num==300)//
num=0;
ReadTempFlag=1;
//读标志位置1
sbitRS=P2^4;
//定义端口
sbitRW=P2^5;
sbitEN=P2^6;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
判忙函数
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&
0x80);
写入命令函数
voidLCD_Write_Com(unsignedcharcom)
//while(LCD_Check_Busy());
//忙则等待
DelayMs(5);
RW_CLR;
DataPort=com;
写入数据函数
voidLCD_Write_Data(unsignedcharData)
//while(LCD_Check_Busy());
RS_SET;
DataPort=Data;
清屏函数
voidLCD_Clear(void)
LCD_Write_Com(0x01);
写入字符串函数
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
if(y==0)
{
LCD_Write_Com(0x80+x);
//表示第一行
}
else
LCD_Write_Com(0xC0+x);
//表示第二行
}
while(*s)
LCD_Write_Data(*s);
s++;
写入字符函数
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
LCD_Write_Com(0x80+x);
LCD_Write_Data(Data);
初始化函数
voidLCD_Init(void)
LCD_Write_Com(0x38);
/*显示模式设置*/
LCD_Write_Com(0x08);
/*显示关闭*/
/*显示清屏*/
LCD_Write_Com(0x06);
/*显示光标移动设置*/
LCD_Write_Com(0x0C);
/*显示开及光标设置*/
/*------------------------------------------------
设定二个自定义字符,LCD1602中自定义字符的地址为0x00--0x07,
即可定义8个字符
这里我们设定把一个自定义字符放在0x00位置(000),
另一个放在0x01位子(001)
voidLcd_User_Chr(void)
{//第一个自定义字符
LCD_Write_Com(0x40);
//"
01000000"
第1行地址(D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))
LCD_Write_Data(0x00);
XXX11111"
第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)
LCD_Write_Com(0x41);
01000001"
第2行地址
LCD_Write_Data(0x04);
XXX10001"
第2行数据
LCD_Write_Com(0x42);
01000010"
第3行地址
LCD_Write_Data(0x0e);
XXX10101"
第3行数据
LCD_Write_Com(0x43);
01000011"
第4行地址
第4行数据
LCD_Write_Com(0x44);
01000100"
第5行地址
第5行数据
LCD_Write_Com(0x45);
01000101"
第6行地址
LCD_Write_Data(0x1f);
XXX01010"
第6行数据
LCD_Write_Com(0x46);
01000110"
第7行地址
第7行数据
LCD_Write_Com(0x47);
01000111"
第8行地址
XXX00000"
第8行数据
//第二个自定义字符
LCD_Write_Com(0x48);
01001000"
第1行地址
LCD_Write_Data(0x03);
XXX00001"
第1行数据
LCD_Write_Com(0x49);
01001001"
XXX11011"
LCD_Write_Com(0x4a);
01001010"
XXX11101"
LCD_Write_Com(0x4b);
01001011"
XXX11001"
LCD_Write_Com(0x4c);
01001100"
LCD_Write_Com(0x4d);
01001101"
LCD_Write_Com(0x4e);
01001110"
LCD_Write_Com(0x4f);
01001111"
第8行数据
}
#include"
18b20初始化
bitInit_DS18B20(void)
bitdat=0;
DQ=1;
//DQ复位
DelayUs2x(5);
//稍做延时
DQ=0;
//单片机将DQ拉低
DelayUs2x(200);
//精确延时大于480us小于960us
//拉高总线
DelayUs2x(50);
//15~60us后接收60-240us的存在脉冲
dat=DQ;
//如果x=0则初始化成功,x=1则初始化失败
DelayUs2x(25);
//稍作延时返回
returndat;
读取一个字节
unsignedcharReadOneChar(void)
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
//给脉冲信号
dat>
>
=1;
if(DQ)
dat|=0x80;
return(dat);
写入一个字节
voidWriteOneChar(unsignedchardat)
unsignedchari=0;
for(i=8;
i>
i--)
DQ=dat&
0x01;
DelayUs2x(25);
读取温度
unsignedintReadTemperature(void)
unsignedchara=0;
unsignedintb=0;
unsignedintt=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
DelayMs(10);
//跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
//低位
b=ReadOneChar();
//高位
b<
<
=8;
t=a+b;
return(t);
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
voidDelayUs2x(unsignedchart)
while(--t);
mS延时函数,含有输入参数unsignedchart,无返回值
0~255这里使用晶振12M,精确延时请使用汇编
voidDelayMs(unsignedchart)
while(t--)
//大致延时1mS
DelayUs2x(245);