stm32制作ds18b20温度传感器
基于STM32的室内温度控制系统
基于STM32的室内温度控制系统题目基于STM32的室内温度控制系统_______学生姓名学号_____所在学院理工学院____________专业班级电子信息工程________________ 指导教师 __________________完成地点物理与电信工程实验室__________基于STM32的室内温度控制系统[摘要] 本设计是以STM32单片机为核心的温度控制系统。
采用DS18B20温度传感器实现对温度的采集,并用TFT液晶屏对温度进行显示。
通过对元器件的选择,设计系统的硬件电路,从而设计相关应用程序,制作实物,实现温度采集、显示、控制等功能。
结果表明,所设计的温度控制系统基本能够完成所需功能,并且具有测量精准高、实时性好、使用方便等特点。
[关键词] 温度控制; DS18B20;STM32单片机Indoor temperature control system based on STM32Abstract This design is based on STM32 microcontroller as the core of the temperature control ing DS18B20 temperature sensor to achieve the temperature of the collection, the use of TFT LCD screen to display the temperature. the hardware circuit of the system is designed through the selection of components; So as to design the related application, make the object, realize the function of temperature acquisition, display, control and other functions.The results show that the designed temperature control system can basically complete the required functions, and has the characteristics of high precision, good real-time performance, easy to use, and so on.Keywords temperature control;DS18B20;STM32 single chip microcompute目录绪论 (1)1 系统总体设计 (2)1.1系统功能要求 (2)1.2系统方案论证 (2)1.3系统设计框图 (2)1.4 具体控制选择 (2)1.4.1 控制器选择 (2)1.4.2 温度传感器 (3)2 硬件设计 (4)2.1硬件构成 (4)2.2 控制模块 (4)2.2.1 STM32简介 (4)2.2.2 STM32的主要优点 (5)2.2.3 STM32开发板 (6)2.3 最小系统设计 (7)2.4 温度采集模块 (8)2.4.1 DS18B20的介绍 (8)2.4.2 DS18B20工作原理介绍 (8)2.4.3 DS18B20使用中的注意事项 (9)2.4.4 DS18B20与STM32单片机的连接电路 (9)2.5 显示模块 (10)2.5.1 TFTLCD液晶显示简介 (10)2.5.2 ALIENTEK 2.8液晶简介 (10)2.6 按键模块 (11)2.7 电源模块 (12)2.8 风机模块 (12)3 系统软件设计 (13)3.1 主程序 (13)3.2 温度采集子程序 (14)3.4 按键子程序 (16)4 系统调试 (17)4.1 硬件调试 (17)4.2 软件调试 (17)4.3 联合调试 (17)4.4 故障分析 (17)5 总结与展望 (19)5.1 总结 (19)5.2 展望 (19)致谢 (20)参考文献 (21)附录A 外文及翻译 (22)原文 (22)译文 (29)附录B 系统电路图 (35)附录C 实物图 (36)附录D 程序清单 (37)绪论在人类的生活环境中,温度扮演着极其重要的角色。
使用DS18B20制作电子温度计
使用DS18B20制作电子温度计——中北大学:马政贵本制作中使用单总线数字温度传感器DS18B20进行温度的测定,并通过51单片机控制1602液晶进行显示。
制作好的电子温度计如下图所示(显示当前温度为20.5摄氏度):第一部分:DS18B20的使用先介绍一下单总线的特点:单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。
单总线通常要求外接一个约为 4.7K —10K 的上拉电阻,这样,当总线闲置时其状态为高电平。
再介绍一下DS18B20的特点:( 1 )采用单总线的接口方式,与微处理器连接时,仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。
单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
( 2 )测量温度范围宽,测量精度高: DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范围内,精度为 ± 0.5°C 。
( 3 )在使用中不需要任何外围元件。
( 4 )支持多点组网功能:多个 DS18B20 可以并联在惟一的单线上,实现多点测温。
( 5 )供电方式灵活:DS18B20 可以通过内部寄生电路从数据线上获取电源。
因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。
( 6 )测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
( 7 )负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
( 8 )掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。
DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
DS18B20温度传感器设计原理图及c程序代码
/*******************代码部分**********************//*************** writer:shopping.w ******************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}sbit DQ = P3^3;sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;uchar code Temp_Disp_Title[]={"Current Temp : "};uchar Current_Temp_Display_Buffer[]={" TEMP: "};uchar code Temperature_Char[8] ={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};uchar code df_Table[]=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};uchar CurrentT = 0;uchar Temp_Value[]={0x00,0x00}; uchar Display_Digit[]={0,0,0,0};bit DS18B20_IS_OK = 1;void DelayXus(uint x){uchar i;while(x--){for(i=0;i<200;i++);}}bit LCD_Busy_Check(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN=0;return result;}void Write_LCD_Command(uchar cmd) {while(LCD_Busy_Check());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void Write_LCD_Data(uchar dat){while(LCD_Busy_Check());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}void LCD_Initialise(){Write_LCD_Command(0x01);DelayXus(5);Write_LCD_Command(0x38);DelayXus(5);Write_LCD_Command(0x0c);DelayXus(5);Write_LCD_Command(0x06);DelayXus(5);}void Set_LCD_POS(uchar pos){Write_LCD_Command(pos|0x80); }void Delay(uint x){while(--x);}uchar Init_DS18B20(){uchar status;DQ = 1;Delay(8);DQ = 0;Delay(90);DQ = 1;Delay(8);DQ = 1;return status;}uchar ReadOneByte(){uchar i,dat=0;DQ = 1;_nop_();for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;_nop_();_nop_();if(DQ)dat |= 0X80;Delay(30);DQ = 1;}return dat;}void WriteOneByte(uchar dat) {uchar i;for(i=0;i<8;i++){DQ = 0;DQ = dat& 0x01;Delay(5);DQ = 1;dat >>= 1;}}void Read_Temperature(){if(Init_DS18B20()==1)DS18B20_IS_OK=0;else{WriteOneByte(0xcc);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0xbe);Temp_Value[0] = ReadOneByte();Temp_Value[1] = ReadOneByte();DS18B20_IS_OK=1;}}void Display_Temperature(){uchar i;uchar t = 150, ng = 0;if((Temp_Value[1]&0xf8)==0xf8){Temp_Value[1] = ~Temp_Value[1];Temp_Value[0] = ~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;ng = 1;}Display_Digit[0] = df_Table[Temp_Value[0]&0x0f];CurrentT = ((Temp_Value[0]&0xf0)>>4) | ((Temp_Value[1]&0x07)<<4);Display_Digit[3] = CurrentT/100;Display_Digit[2] = CurrentT%100/10;Display_Digit[1] = CurrentT%10;Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';Current_Temp_Display_Buffer[10] = '.';Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';Current_Temp_Display_Buffer[8] = Display_Digit[2] + '0';Current_Temp_Display_Buffer[7] = Display_Digit[3] + '0';if(Display_Digit[3] == 0)Current_Temp_Display_Buffer[7] = ' ';if(Display_Digit[2] == 0&&Display_Digit[3]==0)Current_Temp_Display_Buffer[8] = ' ';if(ng){if(Current_Temp_Display_Buffer[8] == ' ')Current_Temp_Display_Buffer[8] = '-';else if(Current_Temp_Display_Buffer[7] == ' ')Current_Temp_Display_Buffer[7] = '-';elseCurrent_Temp_Display_Buffer[6] = '-';}Set_LCD_POS(0x00);for(i=0;i<16;i++){Write_LCD_Data(Temp_Disp_Title[i]);}Set_LCD_POS(0x40);for(i=0;i<16;i++){Write_LCD_Data(Current_Temp_Display_Buffer[i]);}Set_LCD_POS(0x4d);Write_LCD_Data(0x00);Set_LCD_POS(0x4e);Write_LCD_Data('C');}void main(){LCD_Initialise();Read_Temperature();Delay(50000);Delay(50000);while(1){Read_Temperature();if(DS18B20_IS_OK)Display_Temperature();DelayXus(100);}}。
stm32--温度传感器DS18B20使用
void Delay_us(u32 Nus)
{
SysTick->LOAD=Nus*9;
//时间加载
SysTick->CTRL|=0x01;
//开始倒数
while(!(SysTick->CTRL&(1<<16))); //等待时间到达
SysTick->CTRL=0X00000000;
//关闭计数器
SysTick->VAL=0X00000000;
//清空计数器
}
unsigned char ResetDS18B20(void) { unsigned char resport; SetDQ(); Delay_us(50);
ResetDQ(); Delay_us(500); //500us (该时间的时间范围可以从480到960微秒) SetDQ(); Delay_us(40); //40us //resport = GetDQ(); while(GetDQ()); Delay_us(500); //500us SetDQ(); return resport; }
void DS18B20WriteByte(unsigned char Dat) { unsigned char i; for(i=8;i>0;i--) {
ResetDQ(); //在15u内送数到数据线上,DS18B20在15-60u读数 Delay_us(5); //5us if(Dat & 0x01) SetDQ(); else ResetDQ(); Delay_us(65); //65us SetDQ(); Delay_us(2); //连续两位间应大于1us Dat >>= 1; } }
STM制作DSB温度传感器定稿版
S T M制作D S B温度传感器HUA system office room 【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】折腾了一晚上,才把DS18B20的驱动移植到STM32上来。
以前在51上使用过单个和多个连接的DS18B20,有现成的程序了,以为很快就能弄好,结果还是被卡住了,下面说下几个关键点吧:首先是延时的问题,STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。
相比之下用SysTick来的简单方便点。
接着是STM32 IO脚的配置问题,因为51是双向的IO,所以作为输入输出都比较方便。
STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。
于是我也按规定做了,但调了老半天都不成功,是因为DS18B20没有响应的信号。
在烦躁之际只有试下将接DQ的IO分别拉低和拉高看能不能读入正确的信号。
结果果然是读入数据不对,原来我将IO配成开漏输出后相当然的以为读数据是用GPIO_ReadOutputDataBit(),这正是问题所在,后来将读入的函数改为GPIO_ReadInputDataBit()就OK了。
现在温度是现实出来了,但跟我家里那台德胜收音机上显示的温度相差2度,都不知道是哪个准了,改天再找个温度计验证下。
下面引用一段DS18B20的时序描述,写的很详细:DS18B20的控制流程根据DS18B20的通信协议,DS18B20只能作为从机,而单片机系统作为主机,单片机控制DS18B20完成一次温度转换必须经过3个步骤:复位、发送ROM指令、发送RAM指令。
每次对DS18B20的操作都要进行以上三个步骤。
复位过程为:单片机将数据线拉低至少480uS,然后释放数据线,等待15-60uS让DS18B20接收信号,DS18B20接收到信号后,会把数据线拉低60-240uS,主机检测到数据线被拉低后标识复位成功;发送ROM指令:ROM指令表示主机对系统上所接的全部DS18B20进行寻址,以确定对那一个DS18B20进行操作,或者是读取某个DS18B20的ROM序列号。
基于STM32开发板的多功能温度计设计报告
生产实习设计报告设计题目:基于STM32F107开发板的多功能温度计设计一、概述本设计基于STM32F107开发板,利用核心板上的STM32控制基板上的温度传感器DS18B20,实现DS18B20与STM32的双向通信;通过DS18B20实现温度测量,然后STM32对DS18B20转换后的数据进行读取和处理,转换成实际温度值后得到温度显示码,最后在OLED显示测得的温度(显示出温度值的符号位和整数位,以及一位小数)。
该多功能温度计除具备测温功能外,还有如下附加功能:可手动切换显示温度、日期、星期和时间;手动校时、调整日期;最高∕最低温度记忆功能;℃∕℉切换显示;每日闹钟功能;可通过RS232串口传输当前温度和时间至PC机。
本设计最终通过Matlab实现了温度标定,提高了测温准确度。
二、总体设计1.总体系统结构2.模块划分⑴.测温模块⑵.OLED显示模块⑶.按键、拨码开关模块⑷.蜂鸣器模块⑸.串行通信模块3.人员分工张家明完成源程序的编写,以及代码的修改、编译、下载、调试等工作;孙凯强、魏国祥、温琛林、王学良负责DS18B20、OLED相关资料的搜集和整理;王植阳、魏征、田开负责日历时钟芯片PCF8563相关资料的搜集和整理;王如胜、王江、王圣南负责最后产品各项功能的验证。
三、关键模块设计⑴.测温模块DS18B20是由DALLAS半导体公司推出的一种“一线总线”接口的温度传感器。
DS18B20工作在3V~5.5V 的电压范围,可以程序设定9~12位的分辨率,测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。
本设计中,DS18B20通过程序将其分辨率设为12位(温度分辨为0.0625℃)。
DS18B20与STM32的连接电路⑵.OLED显示模块OLED使用的控制器为SSD1305,可通过写入不同的命令字来设置对比度、显示开关、电荷泵、页地址等。
OLED被配置为使用I2C的方式。
STM32 实验22 DS18B20实验
} //从 DS18B20 读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void)
// read one bit
{
u8 data;
DS18B20_IO_OUT();//SET PA0 OUTPUT
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_OUT(); //SET PA0 OUTPUT DS18B20_DQ_OUT=0; //拉低 DQ delay_us(750); //拉低 750us DS18B20_DQ_OUT=1; //DQ=1 delay_us(15); //15US } //等待 DS18B20 的回应 //返回 1:未检测到 DS18B20 的存在 //返回 0:存在 u8 DS18B20_Check(void) { u8 retry=0; DS18B20_IO_IN();//SET PA0 INPUT while (DS18B20_DQ_IN&&retry<200) {
DS18B20 的介绍就到这里,更详细的介绍,请大家参考 DS18B20 的技术手册。
3.22.2 硬件设计
由于开发板上标准配置是没有 DS18B20 这个传感器的,只有接口,所以大家需要自己焊接 一个 DS18B20 上去。
本节实验功能简介:开机的时候先检测是否有 DS18B20 存在,如果没有,则提示错误。 只有在检测到 DS18B20 之后才开始读取温度并显示在 LCD 上,如果发现了 DS18B20,则程 序每隔 200ms 左右读取一次数据,并把温度显示在 LCD 上。同样我们也是用 LED0 来指示程 序正在运行。
51单片机DS18B20温度测量制作(有程序电路)
51单片机DS18B20温度测量制作(有程序电路)单总线温度传感器DS18B20简介DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。
它具有3引脚TO-92小体积封装形式,温度测量范围为-55 ℃~+125 ℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625 ℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
DS18B20外形及引脚说明外形及引脚如图2所示:图2 管脚排列图在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:1(GND):地2(DQ):单线运用的数据输入输出引脚3(VDD):可选的电源引脚DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成 -55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
DS18B20温度传感器实训教程
(2)程序编写、编译。
a.编写主函数程序main.c如下:
#include "reg52.h"
#include"temp.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
2硬件连接3程序烧入芯片1选择单片机型号串口号打开程序文件关闭单片机电源再点击下载程序然后打开电源程序显示下载操作成功即可
DS18B20
1、
1、掌握DS18B20温度传感器设计与制作及其特性;
2、熟练KeiluVision5软件及程序烧入软件基础运用;
3、了解并使用单片机开发试验仪做基础实验。
4、学会基础的C51单片机程序编写并看懂较为复杂的程序。
{
Ds18b20Init();
Delay1ms(1);
Ds18b20WriteByte(0xcc);//跳过ROM操作命令
Ds18b20WriteByte(0xbe);//发送读取温度命令
}
/*******************************************************************************
for(j=8; j>0; j--)
{
DSPORT = 0;//先将总线拉低1us
i++;
DSPORT = 1;//然后释放总线
i++;
i++;//延时6us等待数据稳定
bi = DSPORT;//读取数据,从最低位开始读取
DS18B20温度传感器电路设计(参考)
关键词:单片机AT89C51;温度传感器DS18B20;数码显示实现功能:可以测得的温度范围0~125度并显示一位小数有报警功能当15度<T<30度时两个都灯不亮(默认上限温度为30 下限温度为15)当T>30度时红灯亮T<15度时绿灯亮有调整上下限温度功能按下相应按钮可以调整报警温度范围元件清单AT89C51单片机芯片1块DS18B20温度传感器1个4位共阳极数码管1块红色发光二极管1个绿色发光二极管1个八分之一W 1K电阻10个1W 4.7K电阻1个弹性开关3个本方案设计的系统由单片机系统、数字温度传感器、LED显示模块、按键控制模块、温度报警模块组成,其总体架构如下图1.图1 系统总体方框图DS18B20性能1独特的单线接口仅需一个端口引脚进行通信2简单的多点分布应用3无需外部器件4可通过数据线供电5零待机功耗6测温范围-55~+125℃,以0.5℃递增7可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃8温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字9应用包括温度控制、工业系统、消费品、温度计和任何热感测系统10负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作。
DS18B20外形及引脚说明图3 DS18B20外形及引脚GND:地DQ:单线运用的数据输入/输出引脚VD:可选的电源引脚存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,实际温度=07D0H*0.0625=2000*0.0625=125℃。
例如-55℃的数字输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作运算),实际温度=370H*0.0625=880*0.0625=55℃。
(完整word版)基于单片机的DS18B20设计实验报告
第1章引言在日常生活及工农业生产中经常要涉及到温度的检测及控制,传统的测温元件有热点偶,热敏电阻还有一些输出模拟信号得温度传感器,而这些测温元件一般都需要比较多的外部硬件支持。
其硬件电路复杂,软件调试繁琐,制作成本高,阻碍了其使用性。
因此美国DALLAS半导体公司又推出了一款改进型智能温度传感器——DS18B20。
本设计就是用DS18B20数字温度传感器作为测温元件来设计数字温度计。
本设计所介绍的数字温度计与传统温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于测温比较准确得场所,或科研实验室使用。
该设计控制器使用单片机STC89C51,测温传感器使用DS18B20,显示器使用LED.第2章任务与要求2.1测量范围-50~110°C,精确到0.5°C;2.2利用数字温度传感器DS18B20测量温度信号;2.3所测得温度采用数字显示,计算后在液晶显示器上显示相应得温度值;第3章方案设计及论证3.1温度检测模块的设计及论证由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。
而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。
3.2显示模块的设计及论证LED是发光二极管Light Emitting Diode 的英文缩写。
LED显示屏是由发光二极管排列组成的一显示器件。
DS18B20温度计制作全过程
DS18B20温度计制作全过程(转载请注明出处,谢谢)元件盒一直躺着几只DS18B20,从没试过,决定用它做个电子温度计,说干就干......1、构思Mega8做大脑、小塑料盒做外壳、3位LED数码管显示、废弃手机电池做电源、线路板热转印制作、设2个开关(1个按键式、1个拨动式可常开)、RS232升级程序。
先想这些吧,开始干了。
2、画电路出图电路原理图很简单,很快用PROTEL99SE画完;根据小塑料盒大小设计PCB板,布好线,这步也不复杂。
裁好热转印纸,准备出图了,我喜欢打印时选择"Show Holes",这样在焊盘上就有孔。
用我刚买的HP3050Z一体机,那天逛科技市场,看了感觉不错就搬回来了,从没用它打过转印纸,还不知道效果呢。
......图出来了,还不错!比较满意。
3、制作线路板①找块单面敷铜板, 按合适尺寸裁好,用很细很细的沙纸打磨光亮,冲洗干净,吹干。
千万别省事,一定要干净,否则转印效果不好。
也可以用稀三氯化铁擦涂一下,能提高转印效果。
②对好位置,将打好的热转印 纸盖到敷铜板上,用不干胶粘到平整的耐热材料上,强烈建议别直接放在你家的红木写字台上,我用的是铺剩的复合地板。
用电熨斗进行转印,慢慢移动,使图及板受热均匀,尤其是边缘部分,要特别照顾一下。
力量和时间我全是靠经验,大概20秒左右,稍用力。
③加热后,纸与板粘在一起了,很烫,一定小心,别烫了你的小手。
扔到洗手池里,用凉水降温,我实在等不及它自然冷却。
④板子凉了,从一边轻轻撕下转印纸,看看效果吧,很不错!是10Mil的线啊,没断一根。
⑤扔到三氯化铁熔液里腐蚀。
要想速度快,最好是热熔液+搅拌+毛刷轻刷。
应该好了吧,看看......⑥洗净炭粉。
你们都是用什么洗啊,我用汽油,气味大点,但非常好用,用纸巾蘸一点就擦干净了,擦后用肥皂洗一下板子。
什么?你没有汽油,这好办,拿个钢钉,拿把锤子,拿个瓶子,趁没人的时候到你家楼下找辆底盘高点的车,爬到车底下,在油箱上凿个洞,汽油就流出来了,接汽油的时候千万别抽烟,切记。
18b20在stm32上驱动并附18b20详细资料[1]
光刻 rom 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 ds18b20 的地址序列码。64 位光刻 rom 的排列是:开始 8 位(地址: 28h )是产品类 型标号,接着的 48 位是该 ds18b20 自身的序列号,并且每个 ds18b20 的序 列号都不相同,因此它可以看作是该 ds18b20 的地址序列码;最后 8 位则是 前面 56 位的循环冗余校验码( crc=x8+x5+x4+1 )。由于每一个 ds18b20 的 rom 数据都各不相同,因此微控制器就可以通过单总线对多个 ds18b20 进行寻 址,从而实现一根总线上挂接多个 ds18b20 的目的。
配置寄存器
配置寄存器是配置不同的位数来确定温度和数字的转化。
TM
R1
RO
1
1
1
1
1
低五位一直都是"1",TM 是测试模式位,用于设置 DS18B20 在工作模式还是 在测试模式。在 DS18B20 出厂时该位被设置为 0,用 户不要去改动。R1 和 R0 用来设置分辨率(DS18B20 出厂时被设置为 12 位)
二、DS18B20 结构.............................................................................................. 4 1.DS18B20 芯片封装结构:........................................................................... 4 2.DS18B20 内部结构: ................................................................................. 5
单片机DS18B20温度传感器C语言程序含CRC校验
单片机中使用DS18B20温度传感器C语言程序(参考1)/******************************************************************************** DS18B20 测温程序硬件:AT89S52(1)单线ds18b20接 P2.2(2)七段数码管接P0口(3)使用外部电源给ds18b20供电,没有使用寄生电源软件:Kei uVision 3**********************************************************************************/ #include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为 int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){ while(us--); }void delay(uint count) //延时子函数{ uint i;while(count){ i=200;while(i>0)i--;count--; } }/*串口初始化,波特率9600,方式1 */void init_com(){ TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示 */void display(uint temp){ uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1); }/*****************************************时序:初始化时序、读时序、写时序。
(完整word版)STM32温度报警传感器代码
主函数、main.c#include "led.h"#include "delay.h"#include ”sys.h"#include "usart。
h"#include ”lcd.h"#include "ds18b20.h" #include ”key。
h”#include <string.h> #include 〈stdio。
h>#include <stdlib.h>int temp_low = 22;int temp_high = 32;int zanshi_low=0;int zanshi_hign=0;void TIM3_Int_Init(u16 arr,u16 psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能TIM_TimeBaseStructure。
TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500msTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率TIM_TimeBaseStructure。
TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct 中指定的参数初始化TIMx的时间基数单位TIM_ITConfig( //使能或者失能指定的TIM中断TIM3,//TIM2TIM_IT_Update ,ENABLE //使能);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断NVIC_InitStructure。
基于STM32的温湿度检测系统设计及实现
基于STM32的温湿度检测系统设计及实现一、本文概述本文旨在探讨基于STM32的温湿度检测系统的设计与实现。
我们将详细介绍整个系统的硬件组成、软件设计以及实现方法,并通过实验验证其性能和可靠性。
我们将概述STM32微控制器的特点和优势,以及为什么选择它作为温湿度检测系统的核心。
然后,我们将详细介绍系统的硬件设计,包括温湿度传感器的选择、电路设计和搭建等。
接下来,我们将阐述软件设计思路,包括传感器数据的读取、处理、显示以及传输等关键问题的解决方案。
我们将通过实验数据来验证系统的性能和可靠性,并讨论可能存在的改进和优化方案。
通过本文的阐述,读者可以对基于STM32的温湿度检测系统有一个全面而深入的了解,为相关研究和应用提供参考和借鉴。
二、系统总体设计本设计旨在开发一个基于STM32的温湿度检测系统,该系统能够实现环境温湿度的实时监测,并将数据通过适当的接口进行传输,以便进行后续的数据处理和分析。
设计目标包括高精度测量、低功耗运行、良好的用户界面以及易于扩展和集成。
系统的硬件架构主要由STM32微控制器、温湿度传感器、电源管理模块、通信接口以及显示模块组成。
STM32微控制器作为核心处理器,负责数据的采集、处理和控制逻辑的实现。
温湿度传感器用于实时采集环境中的温度和湿度信息。
电源管理模块负责为系统提供稳定的电源供应,保证系统的稳定运行。
通信接口用于将采集到的数据传输到外部设备或网络,实现远程监控和数据分析。
显示模块则提供用户友好的界面,展示当前的温湿度信息。
软件架构的设计主要包括操作系统选择、任务划分、数据处理流程以及通信协议等方面。
考虑到STM32的性能和功耗要求,我们选择使用嵌入式实时操作系统(RTOS)进行任务管理和调度。
任务划分上,我们将系统划分为数据采集任务、数据处理任务、通信任务和显示任务等,确保各个任务之间的独立性和实时性。
数据处理流程上,我们采用中断驱动的方式,当传感器数据采集完成后,通过中断触发数据处理任务,确保数据的及时处理。
37. DS18B20温度传感器实验
普中STM32开发板带您进入ARM世界
DS18B20 的典型温度读取过程为:复位→发 SKIP ROM 命令( 0XCC )→发开始转换命令( 0X44)→延时→复位→发送 SKIP ROM 命令( 0XCC)→发读存储器命令( 0XBE)→连续读出两个字节数据(即温度)→ 结束。
数据线供电 2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线
即可实现微处理器与DS18B20的双向通讯。 3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,
实现组网多点测温。 4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集
成在形如一 只三极管的集成电路内。 5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。
普中STM32开发板带您进入ARM世界
3.硬件电路
本实验使用到硬件资源如下: (1)D1指示灯 (2)串口1 (3)DS18B20温度传感器
D1指示灯、串口1电路在前面章节都介绍过,这里就不多说,DS18B20 温度传感器模块电路如图。
普中STM32开发板带您进入ARM世界
4.编写DS18B20温度控制程序
普中stm32开发板带您进入arm世界ds18b20外观实物如图普中stm32开发板带您进入arm世界ds18b20内部结构如图ds18b20温度传感器的内部存储器包括一个高速的暂存器ram和一个非易失性的可电擦除的eeprom后者存放高温度和低温度触发器thtl和配置寄存器
普中STM32开发板带您进入ARM世界
DS18B20温度传感器(基于STM32)
#include "stm32f10x.h"
#include "stdio.h"
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* TIM IT enable */
// TIM_ITConfig(TIM2, TIM_IT_CC1 , ENABLE);
/* TIM2 enable counter */
// TIM_Cmd(TIM1, ENABLE);
//TIM_Cmd(TIM2, ENABLE);
printf(" ok");
#include "platform_config.h"
#include "misc.h"
#include "DS18b20.h"
#include "Systick_Delay.h"
/** @addtogroup StdPeriph_Examples
* @{
*/
unsigned char sign , interger ;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
STM32制作DS18B20-温度传感器
折腾了一晚上,才把DS18B20的驱动移植到STM32上来。
以前在51上使用过单个和多个连接的DS18B20,有现成的程序了,以为很快就能弄好,结果还是被卡住了,下面说下几个关键点吧:首先是延时的问题,STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。
相比之下用SysTick来的简单方便点。
接着是STM32 IO脚的配置问题,因为51是双向的IO,所以作为输入输出都比较方便。
STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。
于是我也按规定做了,但调了老半天都不成功,是因为DS18B20没有响应的信号。
在烦躁之际只有试下将接DQ的IO分别拉低和拉高看能不能读入正确的信号。
结果果然是读入数据不对,原来我将IO配成开漏输出后相当然的以为读数据是用GPIO_ReadOutputDataBit(),这正是问题所在,后来将读入的函数改为GPIO_ReadInputDataBit()就OK了。
现在温度是现实出来了,但跟我家里那台德胜收音机上显示的温度相差2度,都不知道是哪个准了,改天再找个温度计验证下。
下面引用一段DS18B20的时序描述,写的很详细:DS18B20的控制流程根据DS18B20的通信协议,DS18B20只能作为从机,而单片机系统作为主机,单片机控制DS18B20完成一次温度转换必须经过3个步骤:复位、发送ROM指令、发送RAM指令。
每次对DS18B20的操作都要进行以上三个步骤。
复位过程为:单片机将数据线拉低至少480uS,然后释放数据线,等待15-60uS让DS18B20接收信号,DS18B20接收到信号后,会把数据线拉低60-240uS,主机检测到数据线被拉低后标识复位成功;发送ROM指令:ROM指令表示主机对系统上所接的全部DS18B20进行寻址,以确定对那一个DS18B20进行操作,或者是读取某个DS18B20的ROM序列号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
折腾了一晚上,才把DS18B20的驱动移植到STM32上来。
以前在51上使用过单个和多个连接的DS18B20,有现成的程序了,以为很快就能弄好,结果还是被卡住了,下面说下几个关键点吧:首先是延时的问题,STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。
相比之下用SysTick来的简单方便点。
接着是STM32 IO脚的配置问题,因为51是双向的IO,所以作为输入输出都比较方便。
STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。
于是我也按规定做了,但调了老半天都不成功,是因为DS18B20没有响应的信号。
在烦躁之际只有试下将接DQ的IO分别拉低和拉高看能不能读入正确的信号。
结果果然是读入数据不对,原来我将IO配成开漏输出后相当然的以为读数据是用GPIO_ReadOutputDataBit(),这正是问题所在,后来将读入的函数改为GPIO_ReadInputDataBit()就OK了。
现在温度是现实出来了,但跟我家里那台德胜收音机上显示的温度相差2度,都不知道是哪个准了,改天再找个温度计验证下。
下面引用一段DS18B20的时序描述,写的很详细:DS18B20的控制流程根据DS18B20的通信协议,DS18B20只能作为从机,而单片机系统作为主机,单片机控制DS18B20完成一次温度转换必须经过3个步骤:复位、发送ROM指令、发送RAM指令。
每次对DS18B20的操作都要进行以上三个步骤。
复位过程为:单片机将数据线拉低至少480uS,然后释放数据线,等待15-60uS让DS18B20接收信号,DS18B20接收到信号后,会把数据线拉低60-240uS,主机检测到数据线被拉低后标识复位成功;发送ROM指令:ROM指令表示主机对系统上所接的全部DS18B20进行寻址,以确定对那一个DS18B20进行操作,或者是读取某个DS18B20的ROM序列号。
发送RAM指令:RAM指令用于单片机对DS18B20内部RAM进行操作,如读取寄存器的值,或者设置寄存器的值。
具体的RAM和RAM指令请查阅DS18B20的数据手册。
下面简单介绍:1、ROM操作命令:DS18B20采用一线通信接口。
因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。
一旦总线检测到从属器件的存在,它便可以发出器件ROM操作指令,所有ROM 操作指令均为8位长度,主要提供以下功能命令:1 )读ROM(指令码0X33H):当总线上只有一个节点(器件)时,读此节点的64位序列号。
如果总线上存在多于一个的节点,则此指令不能使用。
2 )ROM匹配(指令码0X55H):此命令后跟64位的ROM序列号,总线上只有与此序列号相同的DS18B20才会做出反应;该指令用于选中某个DS18B20,然后对该DS18B20进行读写操作。
3 )搜索ROM(指令码0XF0H):用于确定接在总线上DS18B20的个数和识别所有的64位ROM序列号。
当系统开始工作,总线主机可能不知道总线上的器件个数或者不知道其64位ROM序列号,搜索命令用于识别所有连接于总线上的64位ROM序列号。
4 )跳过ROM(指令码0XCCH):此指令只适合于总线上只有一个节点;该命令通过允许总线主机不提供64位ROM序列号而直接访问RAM,以节省操作时间。
5 )报警检查(指令码0XECH):此指令与搜索ROM指令基本相同,差别在于只有温度超过设定的上限或者下限值的DS18B20才会作出响应。
只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值,或者改变TH或TL的设置使得测量值再一次位于允许的范围之内。
储存在EEPROM内的触发器用于告警。
2、RAM指令DS18B20有六条RAM命令:1)温度转换(指令码0X44H):启动DS18B20进行温度转换,结果存入内部RAM。
2)读暂存器(指令码0XBEH):读暂存器9个字节内容,此指令从RAM 的第1个字节(字节0)开始读取,直到九个字节(字节8,CRC值)被读出为止。
如果不需要读出所有字节的内容,那么主机可以在任何时候发出复位信号以中止读操作。
3)写暂存器(指令码0X4EH):将上下限温度报警值和配置数据写入到RAM的2、3、4字节,此命令后跟需要些入到这三个字节的数据。
4)复制暂存器(指令码0X48H):把暂存器的2、3、4字节复制到EEPROM 中,用以掉电保存。
5)重新调E2RAM(指令码0XB8H):把EEROM中的温度上下限及配置字节恢复到RAM的2、3、4字节,用以上电后恢复以前保存的报警值及配置字节。
6)读电源供电方式(指令码0XB4H):启动DS18B20发送电源供电方式的信号给主CPU。
对于在此命令送至DS18B20后所发出的第一次读出数据的时间片,器件都会给出其电源方式的信号。
“0”表示寄生电源供电。
“1”表示外部电源供电。
下面是结合实际测试总结出来的DS18B20的操作流程:1、DS18B20的初始化(1)先将数据线置高电平“1”。
(2)延时(该时间要求的不是很严格,但是尽可能的短一点)。
(3)数据线拉到低电平“0”。
(4)延时490微秒(该时间的时间范围可以从480到960微秒)。
(5)数据线拉到高电平“1”。
(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。
据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1”后结束。
2、DS18B20的写操作(1)数据线先置低电平“0”。
(2)延时确定的时间为2(小于15)微秒。
(3)按从低位到高位的顺序发送字节(一次只发送一位)。
(4)延时时间为62(大于60)微秒。
(5)将数据线拉到高电平,延时2(小于15)微秒。
(6)重复上(1)到(6)的操作直到所有的字节全部发送完为止。
(7)最后将数据线拉高。
3、 DS18B20的读操作(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时2(小于15)微秒。
(5)将数据线拉高“1”,同时端口应为输入状态。
(6)延时4(小于15)微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时62(大于60)微秒。
顺便把程序也贴上来吧,给大家参考下。
使用的方法:只要调用一次 ds18b20_start() 来初始化DS18B20,然后每次读温度时直接调用 ds18b20_read()就可以了。
如ds18b20_start();while(1){for(i=1000000;i>0;i--);val = ds18b20_read();}1//========================================================23// By ligh45//========================================================67#include "STM32Lib//"8#include ""9101112#define EnableINT()13#define DisableINT()1415#define DS_PORT GPIOA16#define DS_DQIO GPIO_Pin_117#define DS_RCC_PORT RCC_APB2Periph_GPIOA18#define DS_PRECISION 0x7f //精度配置寄存器 1f=9位; 3f=10位; 5f=11位; 7f=12位; 19#define DS_AlarmTH 0x6420#define DS_AlarmTL 0x8a21#define DS_CONVERT_TICK 10002223#define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO)24#define SetDQ() GPIO_SetBits(DS_PORT,DS_DQIO)25#define GetDQ() GPIO_ReadInputDataBit(DS_PORT,DS_DQIO)262728static unsigned charTempX_TAB[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x0 9,0x09};293031void Delay_us(u32 Nus)32{33 SysTick->LOAD=Nus*9; //时间加载34 SysTick->CTRL|=0x01; //开始倒数35while(!(SysTick->CTRL&(1<<16))); //等待时间到达36 SysTick->CTRL=0X00000000; //关闭计数器37 SysTick->VAL=0X00000000; //清空计数器38}39404143{44 unsigned char resport;45 SetDQ();46 Delay_us(50);4748 ResetDQ();49 Delay_us(500); //500us (该时间的时间范围可以从480到960微秒)50 SetDQ();51 Delay_us(40); //40us52 //resport = GetDQ();53while(GetDQ());54 Delay_us(500); //500us55 SetDQ();56return resport;57}5859void DS18B20WriteByte(unsigned char Dat)60{61 unsigned char i;62for(i=8;i>0;i--)63 {64 ResetDQ(); //在15u内送数到数据线上,DS18B20在15-60u读数65 Delay_us(5); //5us66if(Dat & 0x01)67 SetDQ();68else69 ResetDQ();70 Delay_us(65); //65us71 SetDQ();73 Dat >>= 1;74 }75}767778unsigned char DS18B20ReadByte(void)79{80 unsigned char i,Dat;81 SetDQ();82 Delay_us(5);83for(i=8;i>0;i--)84 {85 Dat >>= 1;86 ResetDQ(); //从读时序开始到采样信号线必须在15u内,且采样尽量安排在15u的最后87 Delay_us(5); //5us88 SetDQ();89 Delay_us(5); //5us90if(GetDQ())91 Dat|=0x80;92else93 Dat&=0x7f;94 Delay_us(65); //65us95 SetDQ();96 }97return Dat;98}99100101void ReadRom(unsigned char *Read_Addr)103 unsigned char i;104105 DS18B20WriteByte(ReadROM);106107for(i=8;i>0;i--)108 {109 *Read_Addr=DS18B20ReadByte();110 Read_Addr++;111 }112}113114115void DS18B20Init(unsigned char Precision,unsigned char AlarmTH,unsigned char AlarmTL) 116{117 DisableINT();118 ResetDS18B20();119 DS18B20WriteByte(SkipROM);120 DS18B20WriteByte(WriteScratchpad);121 DS18B20WriteByte(AlarmTL);122 DS18B20WriteByte(AlarmTH);123 DS18B20WriteByte(Precision);124125 ResetDS18B20();126 DS18B20WriteByte(SkipROM);127 DS18B20WriteByte(CopyScratchpad);128 EnableINT();129130while(!GetDQ()); //等待复制完成 ///////////131}134void DS18B20StartConvert(void)135{136 DisableINT();137 ResetDS18B20();138 DS18B20WriteByte(SkipROM);139 DS18B20WriteByte(StartConvert);140 EnableINT();141}142143void DS18B20_Configuration(void)144{145 GPIO_InitTypeDef GPIO_InitStructure;146147 RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE);148149 = DS_DQIO;150 = GPIO_Mode_Out_OD; //开漏输出151 = GPIO_Speed_50MHz; //2M时钟速度152 GPIO_Init(DS_PORT, &GPIO_InitStructure);153}154155156void ds18b20_start(void)157{158 DS18B20_Configuration();159 DS18B20Init(DS_PRECISION, DS_AlarmTH, DS_AlarmTL); 160 DS18B20StartConvert();161}164unsigned short ds18b20_read(void)165{166 unsigned char TemperatureL,TemperatureH;167 unsigned int Temperature;168169 DisableINT();170 ResetDS18B20();171 DS18B20WriteByte(SkipROM);172 DS18B20WriteByte(ReadScratchpad);173 TemperatureL=DS18B20ReadByte();174 TemperatureH=DS18B20ReadByte();175 ResetDS18B20();176 EnableINT();177178if(TemperatureH & 0x80)179 {180 TemperatureH=(~TemperatureH) | 0x08;181 TemperatureL=~TemperatureL+1;182if(TemperatureL==0)183 TemperatureH+=1;184 }185186 TemperatureH=(TemperatureH<<4)+((TemperatureL&0xf0)>>4); 187 TemperatureL=TempX_TAB[TemperatureL&0x0f];188189 //bit0-bit7为小数位,bit8-bit14为整数位,bit15为正负位190 Temperature=TemperatureH;191 Temperature=(Temperature<<8) | TemperatureL;193 DS18B20StartConvert();194195return Temperature;196}197198199200201202//============================================203204//205206//============================================207208#ifndef __DS18B20_H209#define __DS18B20_H210211#define SkipROM 0xCC //跳过ROM212#define SearchROM 0xF0 //搜索ROM213#define ReadROM 0x33 //读ROM214#define MatchROM 0x55 //匹配ROM215#define AlarmROM 0xEC //告警ROM216217#define StartConvert 0x44 //开始温度转换,在温度转换期间总线上输出0,转换结束后输出1218#define ReadScratchpad 0xBE //读暂存器的9个字节219#define WriteScratchpad 0x4E //写暂存器的温度告警TH和TL220#define CopyScratchpad 0x48 //将暂存器的温度告警复制到EEPROM,在复制期间总线上输221#define RecallEEPROM 0xB8 //将EEPROM的温度告警复制到暂存器中,复制期间输出0,复制完成后输出1222#define ReadPower 0xB4 //读电源的供电方式:0为寄生电源供电;1为外部电源供电223224225void ds18b20_start(void);226unsigned short ds18b20_read(void);227228229#endif。