百度推广 帮做网站吗,工资8000以上的工作,园区官方网站建设,wordpress 添加icoDS18B20温度传感器 13.1DS18B20温度传感器基础知识1.DS18B20介绍2.引脚及应用电路3.内部结构框图4.存储器框图5.单总线介绍6.单总线电路规范7.单总线时序结构8.DS18B20操作流程9.DS18B20数据帧 13.2DS18B20温度读取和温度报警器代码1.DS18B20温度读取#xff08;1#xff09;… DS18B20温度传感器 13.1DS18B20温度传感器基础知识1.DS18B20介绍2.引脚及应用电路3.内部结构框图4.存储器框图5.单总线介绍6.单总线电路规范7.单总线时序结构8.DS18B20操作流程9.DS18B20数据帧 13.2DS18B20温度读取和温度报警器代码1.DS18B20温度读取1工程目录2main.c函数3DS18B20.c函数4OneWire.c函数 2.DS18B20温度报警器1工程目录2main.c函数 13.1DS18B20温度传感器基础知识
1.DS18B20介绍
DS18B20是一种常见的数字温度传感器其控制命令和数据都是以数字信号的方式输入输出相比较于模拟温度传感器具有功能强大、硬件简单、易扩展、抗干扰性强等特点 测温范围-55°℃到125°℃ 通信接口1-Wire(单总线)·其它特征可形成总线结构、内置温度报警功能、可寄生供电
2.引脚及应用电路 3.内部结构框图 64-BITROM作为器件地址用于总线通信的寻址 SCRATCHPAD(暂存器)用于总线的数据交互 EEPROM用于保存温度触发阈值和配置参数
4.存储器框图 5.单总线介绍
单总线(1-WireBUS)是由Dallas公司开发的一种通用数据总线 一根通信线**DQ** 异步、半双工 单总线只需要一根通信线即可实现数据的双向传输当采用寄生供电时还可以省去设备的VDD线路此时供电加通信只需要DQ和GND两根线
6.单总线电路规范
设备的DO均要配置成开漏输出模式 DO添加一个上拉电阻阻值一般为4.7K左右 若此总线的从机采取寄生供电则主机还应配一个强上拉输出电路
7.单总线时序结构
初始化主机将总线拉低至少480us.然后释放总线等待15-60us后存在的从机会拉低总线60~240us以响应主机之后从机将释放总线 发送一位主机将总线拉低60120us.然后释放总线表示发送0主机将总线拉低115us.然后释放总线表示发送1。从机将在总线拉低30us后(典型值)读取电平整个时间片应大于60us 发送一位主机将总线拉低60120us.然后释放总线表示发送0主机将总线拉低115us.然后释放总线表示发送1。从机将在总线拉低30us后(典型值)读取电平整个时间片应大于60us
8.DS18B20操作流程
初始化从机复位主机判断从机是否响应 ROM操作ROM指令本指令需要的读写操作 功能操作功能指令本指令需要的读写操作
9.DS18B20数据帧 13.2DS18B20温度读取和温度报警器代码
1.DS18B20温度读取
1工程目录 2main.c函数
#include REGX52.H
#include Delay.h
#include LCD1602.h
#include DS18B20.hfloat T;void main()
{LCD_Init();LCD_ShowString(1,1,Temperature:);while(1){DS18B20_ConvertT();TDS18B20_ReadT();if(T0){LCD_ShowChar(2,1,-);T-T;}else{LCD_ShowChar(2,1,);}LCD_ShowNum(2,2,T,3);LCD_ShowChar(2,5,.);LCD_ShowNum(2,6,(unsigned long)(T*10000)%10000,4);}
}3DS18B20.c函数
#include REGX52.H
#include OneWire.h#define DS18B20_SKIP_ROM 0xCC
#define DS18B20_CONVERT_T 0x44
#define DS18B20_READ_SCRATCHPAD 0xBEvoid DS18B20_ConvertT(void)
{OneWire_Init();OneWire_SendByte(DS18B20_SKIP_ROM);OneWire_SendByte(DS18B20_CONVERT_T);
}float DS18B20_ReadT(void)
{unsigned char TLSB,TMSB;int Temp;float T;OneWire_Init();OneWire_SendByte(DS18B20_SKIP_ROM);OneWire_SendByte(DS18B20_READ_SCRATCHPAD);TLSBOneWire_ReceiveByte();TMSBOneWire_ReceiveByte();Temp(TMSB8)|TLSB;TTemp/16.0;return T;
}4OneWire.c函数
#include REGX52.H
sbit OneWire_DQP3^7;unsigned char OneWire_Init(void)
{unsigned char i;unsigned char AckBit;OneWire_DQ1;OneWire_DQ0;i 227;while (--i);//Delay 500usOneWire_DQ1;i 29;while (--i);//Delay 70usAckBitOneWire_DQ;i 227;while (--i);//Delay 500usreturn AckBit;
}void OneWire_SendBit(unsigned char Bit)
{unsigned char i;OneWire_DQ0;i 3;while (--i);//Delay 10usOneWire_DQBit;i 22;while (--i);//Delay 50usOneWire_DQ1;
}unsigned char OneWire_ReceiveBit(void)
{unsigned char i;unsigned char Bit;OneWire_DQ0;i 1;while (--i);//Delay 5usOneWire_DQ1;i 1;while (--i);//Delay 5us BitOneWire_DQ;i 22;while (--i);//Delay 50us return Bit;
}void OneWire_SendByte(unsigned char Byte)
{unsigned char i;for(i0;i8;i){OneWire_SendBit(Byte(0x01i));}
}unsigned char OneWire_ReceiveByte(void)
{unsigned char i;unsigned char Byte0x00;for(i0;i8;i){if(OneWire_ReceiveBit()){Byte|(0x01i);}}return Byte;
}
2.DS18B20温度报警器
1工程目录 2main.c函数
#include REGX52.H
#include DS18B20.h
#include AT24C02.h
#include LCD1602.h
#include Key.h
#include Delay.hfloat T,TShow;
char TLow,THigh;
unsigned char KeyNum;
void main()
{DS18B20_ConvertT();Delay(1000);THighAT24C02_ReadByte(0);TLowAT24C02_ReadByte(1);if(THigh125||TLow-55||THighTLow){THigh20;TLow15;}LCD_Init();LCD_ShowString(1,1,T:);LCD_ShowString(2,1,TH:);LCD_ShowString(2,9,TL:);LCD_ShowSignedNum(2,4,THigh,3);LCD_ShowSignedNum(2,12,TLow,3);while(1){KeyNumKey();/*温度读取及显示*/DS18B20_ConvertT();TDS18B20_ReadT();if(T0){LCD_ShowChar(1,3,-);TShow-T;}else{LCD_ShowChar(1,3,);TShowT;}LCD_ShowNum(1,4,TShow,3);LCD_ShowChar(1,7,.);LCD_ShowNum(1,8,(unsigned char)(TShow*100)%100,2);/*阈值判断及显示*/if(KeyNum){if(KeyNum1){THigh;if(THigh125){THigh125;}}if(KeyNum2){THigh--;if(THighTLow){THigh;}}if(KeyNum3){TLow;if(TLowTHigh){TLow--;}}if(KeyNum4){TLow--;if(THigh-55){TLow-55;}}LCD_ShowSignedNum(2,4,THigh,3);LCD_ShowSignedNum(2,12,TLow,3);AT24C02_WriteByte(0,THigh);Delay(5);AT24C02_WriteByte(0,TLow);Delay(5);}if(TTHigh){LCD_ShowString(1,13,OV:H);}else if(TTLow){LCD_ShowString(1,13,OV:L);}else{LCD_ShowString(1,13, );}}
}只能先敲出程序慢慢理解了