DS18B20温度传感器详解带c程序
18b20详细中文资料及C语言程序
//此值被写入 TL
DS18B20_writebyte(0x1f|(res<<5)); //设置精度 0 res[1-0] 11111
}
/*****************************
DS18B20 温度读取函数
*****************************/
long DS18B20_GetTemperature()
************************************/
uchar DS18B20_readbyte()
{
uchar i,j,dat;
dat=0;
j=1;
for(i=0;i<8;i++)
{
if(DS18B20_readbit())
{
dat=dat+(j<<i);
}
}
return (dat);
DQ=1;
//数据线拉高
i++;i++; //延时 4 微秒
x=DQ;
//读数据线状态
Delay_50us();//延时 50 微秒
return (x); //返回数值
}
/***********************************
DS18B20 写一位函数
1、将数据线拉高
2、延时大于 1 微秒(两次写片段的间隙)
内部 RAM 中 9 字节的内容
写暂存 器
发出向内部 RAM 的 3、4 字节写上、下 4EH 限温度数据命令,紧跟该命令之后,是传送
两字节的数据。
复制暂 存器
将 RAM 中第 3、4 字节的内容复制到 48H EEPROM 中。
DS18B20智能温度控制器(附软件程序)
DS18B20智能温度控制器DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、 DS1822 “一线总线”数字化温度传感器同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V 的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
DS18B20的内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
温度传感器ds18b20(c语言版)函数以及头文件
//读温度值(低位放 tempL;高位放 tempH;) float ReadTemperature(void)
{
float sdate;
unsigned char tempL,tempH;
unsigned int tt;
//*********************** **写一个字节**************************// void WriteOneChar(unsigned char dat);
//读温度值(低位放 tempL;高位放 tempH;) float ReadTemperature(void) ; #endif
if(tempH>0x7f)
//最高位为 1 时温度是负
{ tempL=~tempL;
//补码转换,取反加一
tempH=~tempH+1;
fg=0;
//读取温度为负时 fg=0
}
tt=tempL+tempH*256;
sdate=tt*0.0625;
return sdate;
}
//头文件 #ifndef _ds18b20_h_ #define _ds18b20_h_
void delay(unsigned char i);
//***********************************************************
//
延时子程序
//************************************************************ void delay1ms();
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);}}。
ds18b20详解及程序
d s18b20详解及程序(总1页) -CAL-FENGHAI.-(YICAI)-Company One1
-CAL-本页仅作为文档封面,使用请直接删除
最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.
DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。
DS18B20 产品的特点:
(1)、只要求一个I/O 口即可实现通信。
(2)、在DS18B20 中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为
±5℃;
(5)、数字温度计的分辨率用户可以从9 位到12 位选择。
将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置。
DS18B20引脚分布图
DS18B20 详细引脚功能描述:
1、GND 地信号;
2、DQ数据输入出引脚。
开漏单总线接口引脚。
当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平. 通常要求外接一个约5kΩ的上拉电阻.
3、VDD可选择的VDD 引脚。
电压范围:3~5.5V; 当工作于寄生电源时,此引脚必须接地。
DS18B20存储器结构图
暂存储器的头两个字节为测得温度信息的低位和高位字节;。
DS18B20介绍、流程图和程序源代码
DS18B20单线数字温度传感器DALLAS半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器,体积更小、适用电压更宽、更经济。
一线总线独特而且经济的特点,使用户可轻松地组建温度传感器网络,为测量系统的构建引入全新概念。
DS18B20、DS1822 “一线总线”数字化温度传感器同DS1820一样,支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C,而DS1822的精度较差为± 2°C 。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。
DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C,分辨率设定,以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS1822与DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
1、 DS18B20性能特点DS18B20的性能特点:①采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位),②测温范围为-55℃-+125℃,测量分辨率为0.0625℃,③内含64位经过激光修正的只读存储器ROM,④适配各种单片机或系统机,⑤用户可分别设定各路温度的上、下限,⑥内含寄生电源。
单片机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); }/*****************************************时序:初始化时序、读时序、写时序。
DS18B20的c读写程序
1.//这是关于DS18B20的c读写程序,数据脚P1.0,晶振12MHZ2.//采用的是启东单片机开发板AY-MPU89S51E3.//进行温度显示,这里我们考虑用四位数码管来显示温度4.//显示范围-55.0到+99.5度,显示精度为0.5度5.//关于程序中的延时请参考ds18b20的读写时序6.7.#include <reg52.h>8.#define uchar unsigned char9.10.uchar tempint,tempdf; //温度整数部分和小数部分11.12.sbit TMDAT = P1^0; //根据实实际情况设定13.sbit ld7=P1^7; //初始化成功标志led14.sbit ld6=P1^6; //负温度标志led15.sbit point=P0^7; //小数点显示16.uchar f; //负温度标志17.18.code unsigned char ledmap[]={19. 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xBF};20. //7段数码管0~9数字的共阳显示代码和负号位代码(最后一位)21.22.void set_ds18b20(); //初始化DS18B20子程序23.void get_temperature(); //获得温度子程序24.void read_ds18b20(); //读DS18B20子程序25.void write_ds18b20(uchar command);//向DS18B20写1字节子程序26.void delayms(uchar count); //延时count毫秒子程序27.void disp_temp(); //显示温度子程序28.29.void main()30.{31.SP=0x60; //设置堆栈指针32.while(1)33.{34.get_temperature(); //获得温度35.if(tempdf>=8)36. { //0.5度精度显示37.tempdf=5;38. }39.else40. {41.tempdf=0;42. }43.disp_temp(); //显示温度44.}45.}46.47.void set_ds18b20()48.{49. while(1)50. {51. uchar delay,flag;52. flag=0;53. TMDAT=1;54. delay=1;55. while(--delay);56. TMDAT=0; //数据线置低电平57. delay=250;58. while(--delay); //低电平保持500us59. TMDAT=1; //数据线置高电平60. delay=30;61. while(--delay); //高电平保持60us62. while(TMDAT==0) //判断DS18B20是否发出低电平信号63. {64. delay=210; //DS18B20响应,延时420us65. while(--delay);66. if(TMDAT) //DS18B20发出高电平初始化成功,返回67. {68. flag=1; //DS18B20初始化成功标志69. ld7=0; //初始化成功LED标志70. break;71. }72. }73. if(flag) //初始化成功,再延时480us,时序要求74. {75. delay=240;76. while(--delay);77. break;78. }79. }80.}81.82.void get_temperature() //温度转换、获得温度子程序83.{84. set_ds18b20(); //初始化DS18B2085. write_ds18b20(0xcc); //发跳过ROM匹配命令86. write_ds18b20(0x44); //发温度转换命令87. disp_temp(); //显示温度,等待AD转换88. set_ds18b20();89. write_ds18b20(0xcc); //发跳过ROM匹配命令90. write_ds18b20(0xbe); //发出读温度命令91. read_ds18b20(); //将读出的温度数据保存到tempint和tempdf处92.93.}94.95.void read_ds18b20()96.{97. uchar delay,i,j,k,temp,temph,templ;98. j=2; //读2位字节数据99. do100. {101. for(i=8;i>0;i--) //一个字节分8位读取102. {103. temp>>=1; //读取1位右移1位104. TMDAT=0; //数据线置低电平105. delay=1;106. while(--delay);107. TMDAT=1; //数据线置高电平108. delay=4;109. while(--delay); //延时8us110. if(TMDAT) //读取1位数据111. temp|=0x80;112. delay=25; //读取1位数据后延时50us113. while(--delay);114. }115. if(j==2) //读取的第一字节存templ116. templ=temp;117. else118. temph=temp; //读取的第二字节存temph119. }while(--j);120. f=0;121. if((temph & 0xf8)!=0x00) //若温度为负的处理,对二进制补码的处理122. {123. f=1; //为负温度f置1124. ld6=0;125. temph=~temph;126. templ=~templ;127. k=templ+1;128. templ=k;129. if(k>255)130. {131.temph++;132. }133. }134. tempdf=templ & 0x0f; //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf135. templ>>=4;136. temph<<=4;137. tempint=temph|templ;138.}139.140.void write_ds18b20(uchar command)141.{142. uchar delay,i;143. for(i=8;i>0;i--) //将一字节数据一位一位写入144. {145. TMDAT=0; //数据线置低电平146. delay=6; //延时12us147. while(--delay);148. TMDAT=command&0x01; //将数据放置在数据线上149. delay=25; //延时50us150. while(--delay);151. command=command>>1; //准备发送下一位数据152. TMDAT=1; //发送完一位数据,数据线置高电平153. }154.}155.156.void disp_temp()157.{158. uchar tempinth,tempintl,cnt;159.160. tempinth=tempint/10; //整数高半字节161. tempintl=tempint%10; //整数低半字节162. cnt=200; //循环显示200次163. while(--cnt)164. {165. while(f==1)166. {167. P0=ledmap[10];168. if(tempinth==0)169. {170.P2=0xef;171.delayms(1);172.173.goto loop;174. }175. else176. {P2=0xdf;}177. }178. delayms(1);179.180. P0=ledmap[tempinth];181. P2=0xef; //开十位182. delayms(1);183.184.loop:P0=ledmap[tempintl];185. P2=0xf7; //开个位186. point=0; //小数点显示187. delayms(1);188.189. P0=ledmap[tempdf];190. P2=0xfb; //开十分位191. delayms(1);192. }193.}194.195.void delayms(uchar count) //延时count ms子程序196.{197. uchar i,j;198. do199. {200. for(i=5;i>0;i--)201. for(j=98;j>0;j--);202. }while(--count);203.}/bbs/read.php?tid=1695第一节DS18B20通讯协议DS18B20采用Dallas公司1-WIRE网络协议通讯,这里就围绕着DS18B20介绍1-WIRE网络协议。
DS18B20温度传感器C程序
DS18B20温度传感器C程序单片机型号:STC89C54RD+, STC89C52RC测试通过。
晶震频率:11.05924使用时只需要修改对应的外部管脚即可。
MAIN.C:#include <reg52.h>#include <intrins.h>sbit IO_18B20 = P3^2; //18B20通讯引脚。
extern void DelayX10us(unsigned char t);extern bit Get18B20Temp(int *temp);extern bit Get18B20Ack();extern bit Start18B20();unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; //数码管编码0-F unsigned char LedBuff[12] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};int temp=1;unsigned char flg;unsigned char T0RH,T0RL;void ConfigTimer0(unsigned int ms) //开内部定时器延时,到时间后触发中断。
{unsigned long tmp;tmp = 11059200 / 12;tmp = (tmp * ms) / 1000;tmp = 65536 - tmp;tmp = tmp + 18;T0RH = (unsigned char)(tmp>>8);T0RL = (unsigned char)tmp;TMOD &= 0xF0;TMOD |= 0x01;TH0 = T0RH;TL0 = T0RL;ET0 = 1;TR0 = 1;}void LedScan() //数码管扫描程序。
DS18B20中文资料+C程序
DS18B20中文资料+C程序18b20温度传感器应用解析温度传感器的种类众多,在应用与高精度、高可靠性的场合时dallas(达拉斯)公司生产的ds18b20温度传感器当仁不让。
超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得ds18b20更受欢迎。
对于我们普通的电子爱好者来说,ds18b20的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。
了解其工作原理和应用可以拓宽您对单片机开发的思路。
ds18b20的主要特征:全系列数字温度切换及输入。
??一流的单总线数据通信。
最高12位分辨率,精度可达土0.5摄氏度。
12十一位分辨率时的最小工作周期为750毫秒。
??可选择真菌工作方式。
检测温度范围为c55°c~+125°c(c67°f~+257°f)??内置eeprom,限温报警功能。
64十一位光刻rom,内置产品序列号,便利多机了变。
??多样PCB形式,适应环境相同硬件系统。
ds18b20芯片PCB结构:ds18b20引脚功能:gnd电压地dq单数据总线vdd电源电压nc空插槽ds18b20工作原理及应用领域:ds18b20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。
其一个工作周期可分为两个部分,即温度检测和数据处理。
在讲解其工作流程之前我们有必要了解18b20的内部存储器资源。
18b20共有三种形态的存储器资源,它们分别是:rom只读存储器,用作放置ds18b20id编码,其前8位就是单线系列编码(ds18b20的编码就是19h),后面48位就是芯片唯一的序列号,最后8位就是以上56的位的crc码(缓存校验)。
数据在出产时设置无可奈何用户修改。
ds18b20共64十一位rom。
ram数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,ds18b20共9个字节ram,每个字节为8位。
第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户eeprom(常用于温度报警值储存)的镜像。
DS18B20温度计C程序最终版
i = 100; //拉低约800us, 符合协议要求的480us以上
while(i>0) i--;
ds = 1; //产生一个上升沿, 进入等待应答状态
i = 4;
while(i>0) i--;
}
void dsWait()
}
//获取当前温度值
int getTmpValue()
{
unsigned int tmpvalue;
int value; //存放温度数值
float t;
unsigned char low, high;
sendReadCmd();
//连续读取两个字节数据
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#include <math.H> //要用到取绝对值函数abs()
//通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55~ +125度
{
uchar j;
while(x--)
{
for(j=0;j<100;j++);
}
}
void delay(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j = 0; j < 125; j++);
tmpvalue <<= 8;
ds18b20温度检测程序(C语言)
//18B20单线温度检测的应用样例程序#include<REG52.H>#include<math.h>#include<INTRINS.H>#include<stdio.h>#define uchar unsigned char#define uint unsigned int;/*****************************************************************************/ sbit seg1=P2^0;sbit seg2=P2^1;sbit seg3=P2^2;sbit DQ=P1^7;//ds18b20 端口sfr dataled=0x80;//显示数据端口/**********************************************************************/uchar temp;uchar flag_get,count,num,minute,second;uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阳uchar str[3];/***********************************************************************/void delay1(uchar MS);unsigned char ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);void INITchuangkou(void);//void Initdingshiqi1(void);/************************************************************************/main(){TMOD|=0x21;//定时器设置TH0=0xef;TL0=0xf0;EA=1;TR0=1;//Initdingshiqi1();INITchuangkou();P2=0x00;count=0;while(1){str[2]=0x39;//显示C符号str[0]=tab[temp/10]; //十位温度str[1]=tab[temp%10]; //个位温度if(flag_get==1) //定时读取当前温度{temp=ReadTemperature();printf("%d",temp);flag_get=0;}}}void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔{TH0=0xef;//定时器重装值TL0=0xf0;num++;if (num==50){num=0;flag_get=1;//标志位有效second++;if(second>=60){second=0;minute++;}}count++;if(count==1){P2=0;dataled=str[0];}//数码管扫描if(count==2){P2=1;dataled=str[1];}if(count==3){ P2=2;dataled=str[2];count=0;}}/******************************************************************************void delay(unsigned int i)//延时函数{while(i--);}/****************************************************************************** *********///18b20初始化函数void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(10);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(5);}//读一个字节unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;delay(5);}return(dat);}//写一个字节void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;}delay(5);}//读取温度unsigned char ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned char t=0;//float tt=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();b=ReadOneChar();b<<=4;b+=(a&0xf0)>>4;t=b;//tt=t*0.0625;//t= tt*10+0.5; //放大10倍输出并四舍五入return(t);}void INITchuangkou(void){SCON=0X50;TH1=0XFD;TR1=1;TI=1;}/*void Initdingshiqi1(void);{TMOD=0X11;TH1=0XFD;TL1=0XFD; TR1=1;}*/。
DS18B20温度传感器详细注解及驱动程序解析
DS18B20独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条线即可实现微处理器与DS18B20的双向通讯。
测温范围-55℃~+125℃,固有测温误差(注意,不是分辨率,这里之前是错误的)1℃。
支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
工作电源:3.0~5.5V/DC(可以数据线寄生电源)在使用中不需要任何外围元件。
测量结果以9~12位数字量方式串行传送。
如果使用51单片机的话,那么中间那个引脚必须接上4.7K~10K的上拉电阻,否则,由于高电平不能正常输入/输出,要么通电后立即显示85℃,要么用几个月后温度在85℃与正常值上乱跳。
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
读ROM 33H 读DS1820温度传感器ROM中的编码(即64位地址)发出此命令之后,接着发出64 位ROM 编码,访问单总线上与该编码相符合ROM 55H对应的DS1820 使之作出响应,为下一步对该DS1820 的读写作准备。
用于确定挂接在同一总线上DS1820 的个数和识别64 位ROM 地址。
为搜索ROM FOH操作各器件作好准备。
跳过ROM CCH 忽略64 位ROM 地址,直接向DS1820 发温度变换命令。
告警搜索ECH 执行后只有温度超过设定值上限或下限的片子才做出响应。
RAM命令启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75m温度变换44Hs)。
结果存入内部第0、1字节RAM中。
1、复位操作复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
DS18B20温度传感器详解带c程序
00A2H
+0.5
0000 0000 0000 000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 0110 1110
FF5EH
-25.0625
1111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {
单片机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); }/*****************************************时序:初始化时序、读时序、写时序。
18B20详细介绍及程序
1.DS18B20基本知识DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
1、DS18B20产品的特点(1)、只要求一个端口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55。
C到+125。
C之间。
(5)、数字温度计的分辨率用户可以从9位到12位选择。
(6)、内部有温度上、下限告警设置。
2、DS18B20的引脚介绍TO-92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。
(底视图)图1表1DS18B20详细引脚功能描述3.DS18B20的使用方法由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
DS18B20的复位时序DS18B20的读时序对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
DS18B20温度传感器的C语言程序
下面是DS18B20的子程序,#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar a;sbit DQ=P2^0;void reset(); //DS18B20复位函数void write_byte(uchar val); //DS18B20写命令函数uchar read_byte(void); //DS18B20读1字节函数void read_temp(); //温度读取函数void work_temp(); //温度数据处理函数uchar data temp_data[2]={0x00,0x00};uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //对于温度显示值值uchar codeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//温度小数部分查表main(){while(1){reset();write_byte(a);read_byte();read_temp();work_temp();}}void delay1(uint t) {for(;t>0;t--);}///////温度控制子函数void reset(){uchar presence=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;}void write_byte(uchar val){uchar i;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_();}uchar read_byte(void){uchar i;uchar value=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);}void read_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);}void work_temp(){if(temp_data[1]>127){temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);}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;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C.写暂存器
[4EH] 将数据写入暂存器的 TH、TL 字节
D.复制暂存器
[48H] 把暂存器的 TH、TL 字节写到 E2RAM 中
E.重新调 E2RAM [B8H] 把 E2RAM 中的 TH、TL 字节写到暂存器 TH、TL 字节 F.读电源供电方式 [B4H] 启动 DS18B20 发送电源供电方式的信号给主 CPU
DQ=0; DQ=dat&0x01; delay(4);//DS18B20 采样单片机写给 DQ 线上的数据(45us)*************** DQ=1; dat>>=1; } delay(4); } /******************读一个字节函数****************/ uchar read_byte() { uchar vaul,i; DQ=1; //先拉高电平,为读作准备 for(i=0;i<8;i++) { DQ=0; vaul>>=1; DQ=1; if(DQ) vaul|=0x80; delay(4); } return vaul; } /******************读取温度值函数****************/ int read_temper() { uchar templ,temph, flag; int temp; reset_ds18b20();//复位操作 write_byte(0xcc);//跳过 ROM write_byte(0x44);//温度转换 delay(300);//***************************
0xed,0xfd,0x87,0xff,0xef};//所以各位后要显示小数点,所以需要重新编码(0—9) uchar code numfh[]={0x40,0x00}; //温度 + — 符号位 /******************1ms 延时函数****************/ void delay0(uint z) {
运行流程 4.1 多个读取步骤
4.2 单个读取步骤 4.3 读取到的字节
时序介绍
5.1 初始化
Vpu 单总线
GND
主控器发送脉冲 至少480us
DS18B20 等待15~60us
主控器接收
DS18B20发送 至少480us
存在脉冲 60~240us
5.2 写时间隙
5.3 读时间隙
6.开发板原理图
uchar i,zf,bai,shi,ge,fen; if(num<0) {
zf=0;//温度 — 符号位 num=num*(-1); } else zf=1;//温度 + 符号位 bai=num/1000; shi=num%1000/100; ge=num%100/10; fen=num%10; for(i=0;i<6;i++) { wei=1; P1=numw[i]; wei=0; P1=0x00;//消影
break; case 2: if(zf==0&&shi!=0)
//因为存在脉冲检测结束后自动拉高*/ //return stat; } /******************写一个字节函数****************/ void write_byte(uchar dat) { uchar i; DQ=1; //先拉高电平,为写作准备 for(i=0;i<8;i++) {
00A2H
+0.5
0000 0000 0000 1000
0008H
0
0000 0000 0000 0000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 01111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {
reset_ds18b20();//复位操作 write_byte(0xcc);//跳过 ROM write_byte(0xbe);//读内部 RAM 内容 templ=read_byte(); temph=read_byte(); flag=(temph&0x80)>>7;//判断高字节符号位是 1 还是 0(1 为负温度,0 为正温度) if(flag==0) //temp=(temph<<=4)+((templ&=0xf0)>>4); temp=(templ+temph*256)*0.625;//将精度 0.0625 扩大 10 倍,因为 temp 为整形,小数部分读不到
路 图 路 电 电 振 理 源 晶 电 路 原 电 器 板 电 继 路 发 电 收 开 接 外 红 作 小 块 模 祥 信 通 必 口 路 串 电 器 全 鸣 蜂 路 电 位 复 块 模 机 电 块 进 模 步 盘 键 阵 ) 矩 流 端 限 地 接 加 接 处 ( 节接 源 处 此 极极 调处 接 电 此 据 正负 度此 处 为 ) 数 灯灯 比) 此 脚 接 光光 对 引 背背 为(( 路 块 电 模 块 灯 管 模 码 晶 数 液
跳过 ROM//用于总线只有一个 1820 搜索 ROM//用于一次读取多个 1820 的 64 位编码 报警搜索 ROM//从多个 1820 中搜索哪个在报警
(3)DS18B20 功能指令(暂存器指令集)
A.温度转换
[44H] 启动 DS18B20 进行温度转换
B.读暂存器
[BEH] 读暂存器 9 个字节内容
1.2 外形与接线
引脚图
接线图
DS18B20 引脚定义: DQ 为数字信号输入/输出端; GND 为电源地; VDD 为外接供电电源输入端(在寄生电源接线方式时接地)。
内部结构与介绍 2.1 内部结构
存储器和控制器
64位
温度灵敏元件
ROM
电
和
源
单线
检
接口
测
高速 缓存 存储器
低温触发器TL 高温触发器TH
else if(zf==0&&shi==0) P1=numdg[ge]; else if(zf!=0&&bai!=0) P1=numd[shi]; else if(zf!=0&&bai==0&&shi!=0) P1=numdg[ge]; else
if(zf!=0&&bai==0&&shi==0) P1=numd[fen];
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
配置寄存器
8位CRC生成器
内部结构图
2. 2 DS18B20 内部存储器及温度数据格式
对于 DS18B20 内部存储器结构(见下图),它包括一个暂存 RAM 和一个非易失性电可擦除 EERAM,后者存
放报警上下限 TH、TL。当改变 TH、T L 中的值时,数据首先被写进暂存器的第二、三字节中,主机可再读
uchar stat=0; DQ=1; delay(8); DQ=0; delay(80); //600us/12mhz DQ=1; delay(8); stat=DQ; //高电平为存在,低电平为不存在(stat 应该为 0) delay(4); // while(!DQ);/*等待 DQ 变为高电平
以 12 位转化为例说明温度高低字节存放形式(温度的存储形式如表 3.1)及计算:12 位转化后得到的 12
位数据,存储在 18B20 的两个高低 8 位的 RAM 中,二进制中的前面 5 位是符号位。如果测得的温度大于 0,
这 5 位为 0,只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0,这 5 位为 1,测到的数值
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
出其中内容进行验证。如果正确,当主机发送复制暂存器命令,暂存器的第二、三字节将被复制到 TH、TL
中,这样处理有利于确保该数据在单总线上传输的完整性[7]。
(暂存 RAM)
EERAM 结构(电可擦写 RAM)
暂存存储器作用是在单线通信时确保数据的完整性,它由 8 字节组成,头两个字节表示测得的温度读数。
需要取反加 1,再乘于 0.0625 才能得到实际温度[8]。
表 3.1 温度的存储形式
高8位 S
S
S
S
S
26
25
24
低8位