DS18B20温度传感器设计原理图及c程序代码

合集下载

DS18B20原理及程序编写

DS18B20原理及程序编写

DS18B20原理及程序编写(一)概述DS18B20为单总线12位(二进制)温度读数。

内部有64位唯一的ID编码。

工作电压从3.0~5.5V。

测量温度范围从-55℃~125℃。

最高±0.0625℃分辩率。

其内部结构如下图所示。

DS18B20的核心功能是直接数字温度传感器。

温度传感器可以配置成9、10、11和12位方式。

相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。

默认的分辨率为12位。

DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。

主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。

接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。

如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。

DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。

地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。

DS18B20内部寄存器映射如下图所示。

配置寄存器的格式如表2和表3所示。

DS18B20内部寄存器映射表1 温度寄存器的格式表2 配置寄存器的格式表3 温度分辨率配置DS18B20使用单总线工作方式,其通信协议以电平的高平时间作为依据,其基本时序有复位时序,写时序、读时序。

//********************************************************************** //** 文件名:DS18B20.c//** 说明:DS18B20驱动程序文件//----------------------------------------------------------------------//** 单位://** 创建人:张雅//** 创建时间:2010-01-20//** 联系方式:QQ:276564402//** 版本:V1.0//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯片:AT89S52//** 时钟:11.0592MHz//** 其它:这个文档为18B20的驱动程序,引用了数码管的驱动。

DS18B20原理及应用实例(源程序+原理图+Proteus仿真)

DS18B20原理及应用实例(源程序+原理图+Proteus仿真)

2、DS18B20 结构:如右图所示,DS18B20 有三只引脚,
VCC、DQ 和 GND。DQ 为数字信号输入/输出端(DQ 一般接控制器(单片机)的一个 I/O 口上,由于单总线为开漏所以需要外接一个 4.7K 的上拉电阻) ;GND 为电源地;VDD 为外 接供电电源输入端 (在寄生电源接线方式时接地) 。 DS18B20 内部结构主要由四部分组成: 64 位光刻 ROM、温度传感器、非挥发的温度报警触发器 TH 和 TL、配置寄存器。 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列 码。64位光刻ROM的排列是:开始8位是产品类型标号,接着的48位是该DS18B20自身的序 列号,最后8位是前面56位的CRC校验码(循环冗余校验码)。光刻ROM的作用是使每一个 DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 温度传感器可完成对温度的测量,以12位转化为例,用16位符号扩展的二进制补码读 数形式提供。 RAM数据暂存器,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。如 下图所示, 当温度转换命令发布后, 经转换所得的温度值以二字节补码形式存放在暂存器的 第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,第2、3 字节是用户EEPROM(常用于温度报警值储存)的镜像,用户用来设置最高报警和最低报 警值,在上电复位时其值将被刷新。第4个字节则是用户第3个EEPROM的镜像,用来配置 9~12位的转换精度(即分辨率) 。第5、6、7个字节为计算机自身使用。第8个字节为前8个字 节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警 值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。

DS18B20单片机数码管显示原理图和程序

DS18B20单片机数码管显示原理图和程序

最近天气热了,想要是做个能显示温度的小设备就好了,于是想到DIY个电子温度计,网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。

作为单片机小虾的我做这个用了2天时间,当然是下班后,做工不行见谅了。

主要元件用到了单片机STC89C54RD+,DB18B20温度传感器,4为共阳数码管,PNPS8550三极管等。

先上原理图:洞洞板布局图:然后就是实物图了:附上源程序:程序是别人写的,我只是自己修改了下,先谢谢原程序者的无私奉献。

#include"reg52.h"#define uchar unsigned char#define uint unsigned intsbit DQ=P3^4; //温度数据口sbit wx1=P2^0; //位选1sbit wx2=P2^1; //位选2sbit wx3=P2^2; //位选3sbit wx4=P2^3; //位选4unsigned int temp, temp1,temp2, xs;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, //共阳数码管0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};/******延时程序*******/void delay1(unsigned int m){unsigned int i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}void delay(unsigned int m) //温度延时程序{while(m--);}void Init_DS18B20(){unsigned char x=0;DQ = 1; //DQ复位ds18b20通信端口delay(8); //稍做延时DQ = 0; //单片机将DQ拉低delay(80); //精确延时大于480usDQ = 1; //拉高总线delay(4);x=DQ; //稍做延时后如果x=0那么初始化成功x=1那么初始化失败delay(20);}/***********ds18b20读一个字节**************/uchar ReadOneChar(){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(4);}return(dat);}/*************ds18b20写一个字节****************/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0; //从高电平拉至低电平时,写周期的开始DQ = dat&0x01; //数据的最低位先写入delay(5); //60us到120us延时DQ = 1;dat>>=1; //从最低位到最高位传入}}/**************读取ds18b20当前温度************/void ReadTemperature(){unsigned char a=0;unsigned b=0;unsigned t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作/WriteOneChar(0x44); // 启动温度转换delay(5); // this message is wery importantInit_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度存放器等〔共可读9个存放器〕前两个就是温度/ delay(5);a=ReadOneChar(); //读取温度值低位/b=ReadOneChar(); //读取温度值高位/temp1=b<<4; //高8位中后三位数的值temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值temp1室温整数值temp2=a&0x0f; //小数的值temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值zhenshuxs=temp2*0.0625*10; //小数位,假设为0.5那么算为5来显示xs小数xiaoshu }void wenduxianshi(){wx1=0;P0=table[temp/10]; //显示百位delay1(5);wx1=1;wx2=0;P0=table[temp%10]+0x80; //显示十位加上0x80就显示小数点了。

温度传感器ds18b20(c语言版)函数以及头文件

温度传感器ds18b20(c语言版)函数以及头文件
delay(5); DQ=1; dat>>=1; } delay(4); }
//读温度值(低位放 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温度传感器

DS18B20温度传感器

DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

单总线,意味着没有时钟线,只有一根通信线。

单总线读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格,这也是DS18B20驱动编程的难点。

一.DS18B20温度传感器1.引脚图2.DS18B20内部结构图主要由2部分组成:64位ROM、9字节暂存器,如图所示。

(1) 64 位ROM。

它的内容是64 位序列号,它可以被看作是该DS18B20 的地址序列码,其作用是使每个DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。

(2) 9字节暂存器包含:温度传感器、上限触发TH高温报警器、下限触发TL低温报警器、高速暂存器、8位CRC产生器。

3.64位ROM结构图8位CRC:是单总线系列器件的编码,DS18B20定义为28H。

48位序列号:是一个唯一的序列号。

8位系列码:由CRC产生器生产,作为ROM中的前56位编码的校验码。

4.9字节暂存器结构图以上是内部9 个字节的暂存单元(包括EEPROM)。

字节0~1 是温度存储器,用来存储转换好的温度。

字节2~3 是用户用来设置最高报警和最低报警值。

这个可以用软件来实现。

字节4 是配置寄存器,用来配置转换精度,让它工作在9~12 位。

字节5~7 保留位。

字节8 CRC校验位。

是64位ROM中的前56位编码的校验码。

由CRC发生器产生。

5.温度寄存器结构图温度寄存器由两个字节组成,分为低8位和高8位。

一共16位。

其中,第0位到第3位,存储的是温度值的小数部分。

第4位到第10位存储的是温度值的整数部分。

第11位到第15位为符号位。

全0表示是正温度,全1表示是负温度。

表格中的数值,如果相应的位为1,表示存在。

如果相应的位为0,表示不存在。

6.配置寄存器精度值:9-bit 0.5℃10-bit 0.25℃11-bit 0.125℃12-bit 0.0625℃7.温度/数据关系注意:如果温度是一个负温度,要将读到的数据减一再取反二.单总线协议1.单总线通信初始化初始化时序包括:主机发出的复位脉冲和从机发出的应答脉冲。

DS18B20温度传感器设计原理图及c程序代码

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的传感器数码管显示的设计原理及程序

DS18B20的传感器数码管显示的设计原理及程序

以下是原理图:以下是原理图的程序设计:#include <reg52.h>#include<math.h>#define uchar unsigned charsbit DQ=P1^6;unsigned char tempL=0;unsigned char tempH=0;unsigned int tempa;uchar display_data[4]={0};uchar flag_fu=0; //温度正负值标志位float temperature; //温度值void DS18_delay(int useconds)//延时函数{int s;for (s=0; s<useconds;s++);}unsigned char Init_DS18B20(void){unsigned char x=0;DQ=0; //发送复位脉冲DS18_delay(29); //延时(>480ms)DQ=1; //拉高数据线DS18_delay(3); //等待(15~60ms) 等待存在脉冲x=DQ; //获得存在信号(用于判断是否有器件)DS18_delay(25); // 等待时间隙结束return(x); //返回存在信号,0 = 器件存在, 1 = 无器件}ReadOneChar(void)//读一个字节{unsigned char i=0;unsigned char dat=0;for (i=8;i>0;i--){DQ=1;DS18_delay(1);DQ=0;dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值) DQ=1;if(DQ)dat|=0x80;DS18_delay(4);}return(dat);}WriteOneChar(unsigned char dat){unsigned char i=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;DS18_delay(5);DQ=1;dat>>=1;}DS18_delay(4);}unsigned int ReadTemperature(void){Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0x44);DS18_delay(125);Init_DS18B20();WriteOneChar(0xcc);WriteOneChar(0xbe);tempL=ReadOneChar();tempH=ReadOneChar();tempa=((tempH*256)+tempL);if(tempa&0x8000){tempa=~tempa;tempa+=1;flag_fu=1;}else{flag_fu=0;}//温度转换,把高低位做相应的运算转化为实际温度temperature=tempa*0.625*8;DS18_delay(200);return temperature ;}void display(){unsigned char code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f,0xff};P3=0x01;P2=dis[display_data[0]];DS18_delay(10);P3=0x02;P2=dis[display_data[1]];DS18_delay(10);P3=0x04;P2=dis[display_data[2]]+0x80;DS18_delay(10);P3=0x08;P2=dis[display_data[3]];DS18_delay(10);}void main(){unsigned int temp;uchar i;while(1){temp=ReadTemperature();if(flag_fu==0){ if(temp>=1000){display_data[0]=temp/1000;display_data[1]=(temp/100)%10;display_data[2]=(temp/10)%10;display_data[3]=temp%10;}else if(temp>=100){display_data[0]=12;display_data[1]=temp/100;display_data[2]=(temp%100)/10;display_data[3]=temp%10;}else{ display_data[0]=12;display_data[1]=12;display_data[2]=temp/10;display_data[3]=temp%10;}}else{ if(abs(temp)>100){display_data[0]=10;display_data[1]=abs(temp)/100;display_data[2]=(abs(temp)%100)/10;display_data[3]=abs(temp)%10;}else{display_data[0]=12;display_data[1]=10;display_data[2]=abs(temp)/10;display_data[3]=abs(temp)%10;}}for(i=0;i<250;i++)display();}}。

基于89C52和DS18B20的温湿度采集系统 原理图+C语言源代码

基于89C52和DS18B20的温湿度采集系统 原理图+C语言源代码
delay(1);//延时
WrByte(0xcc);// skip rom命令
WrByte(0x44);// convert T命令
}
/*读取温度值*/
void RdTemp(void)
{
TxReset();//产生复位脉冲,初始化DS18B20
RxWait();//等待DS18B20给出应答脉冲
delay(1);//延时
}
else
{
/*写0 */
DQ = 0;
i = 8;
while(i>0) i--;//保持低在60us到120us之间
DQ = 1;
i++;
i++;
}
}
}
/*启动温度转换*/
void convert(void)
{
TxReset();//产生复位脉冲,初始化DS18B20
RxWait();//等待DS18B20给出应答脉冲
#include "DigThermo.h"
/*延时t毫秒*/
void delay(uint t)
{
uint i;
while(t--)
{
/*对于11.0592M时钟,约延时1ms */
for (i=0;i<125;i++)
{}
}
}
/*产生复位脉冲初始化DS18B20 */
void TxReset(void)
tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
5位为符号位。真正通过数码管输出时,需要进行到十进
制有符号实数(包括小数部分)的转换。*/
void main(void)

DS18B20温度传感器C程序.docx

DS18B20温度传感器C程序.docx

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程序
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];
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++) {
以 12 位转化为例说明温度高低字节存放形式(温度的存储形式如表 3.1)及计算:12 位转化后得到的 12
位数据,存储在 18B20 的两个高低 8 位的 RAM 中,二进制中的前面 5 位是符号位。如果测得的温度大于 0,
这 5 位为 0,只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0,这 5 位为 1,测到的数值
配置寄存器
8位CRC生成器
内部结构图
2. 2 DS18B20 内部存储器及温度数据格式
对于 DS18B20 内部存储器结构(见下图),它包括一个暂存 RAM 和一个非易失性电可擦除 EERAM,后者存
放报警上下限 TH、TL。当改变 TH、T L 中的值时,数据首先被写进暂存器的第二、三字节中,主机可再读
表 3.2 DS18B20 温度/数字对应关系表

DS18B20温度传感器使用方法以及代码

DS18B20温度传感器使用方法以及代码

第7章DS18B20温度传感器7.1 温度传感器概述温度传感器是各种传感器中最常用的一种,早起使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就可以计算出当前环境温度。

随着科技的进步,现代的温度传感器已经走向数字化,外形小,接口简单,广泛应用在生产实践的各个领域,为我们的生活提供便利。

随着现代仪器的发展,微型化、集成化、数字化、正成为传感器发展的一个重要方向。

美国DALLS半导体公司推出的数字化温度传感器DS18B20采用单总线协议,即单片机接口仅需占用一个I/O端口,无需任何外部元件,直接将环境温度转化为数字信号,以数码方式串行输出,从而大大简化了传感器与微处理器的接口。

7.2 DS18B20温度传感器介绍DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。

与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。

可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。

因而使用DS18B20可使系统结构更趋简单,可靠性更高。

他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。

1.DS18B20温度传感器的特性①独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

②在使用中不需要任何外围元件。

③可用数据线供电,电压范围:+3.0~ +5.5 V。

④测温范围:-55 ~+125 ℃。

固有测温分辨率为0.5 ℃。

⑤通过编程可实现9~12位的数字读数方式。

单片机代码-温度传感器18b20

单片机代码-温度传感器18b20

#include<reg52.h>#include<intrins.h> //为了使用这个头文件中的_nop_()延时函数sbit sda=P2^2; //DS18B20的数据总线sbit hc573_sg_le=P2^6; //对用于锁存段数据的573锁存LE端进行定义sbit hc573_bit_le=P2^7; //对用于锁存位选通数据的573锁存LE端进行定义sbit lcd_rs=P1^0; //数据/命令选择端,高电平执行数据操作,低电平执行命令操作sbit lcd_rw=P1^1; //读/写控制端高电平时读,低电平写sbit lcd_en=P2^5; //读写控制使能信号,它为高脉冲信号才可执行读写操作sbit sta7=P0^7; //1602忙信号检测位,为1则忙,需等待,为0表示空闲unsigned char code lcd_line1[]={"Temperature:"}; //定义第一行液晶显示的格式字符数组unsigned char code lcd_line2[]={" ."}; //定义第二行液晶显示的格式字符数组void lcd_busy_check(void) //1602忙信号检测,忙则等待{P0=0xff;do{lcd_rs=0; //读状态操作,为0lcd_rw=1; //读操作为1lcd_en=0;lcd_en=1; //读状态,需为高电平}while (sta7==1); //如果为1则忙,等待...直到为0lcd_en=0;}void lcd_write_cmd(unsigned char cmd) //液晶写命令函数{lcd_busy_check(); //每次操作之前都要进行忙信号检测lcd_rs=0; //执行命令操作,为0lcd_rw=0; //写操作,为0P0=cmd; //送指令到液晶数据端口P0,准备执行命令_nop_(); //这是一个延时函数,可延时一个机器周期,它在“intrins.h”中lcd_en=1; //高电平,指令送入液晶控制器_nop_(); //保持一会儿,使指令可靠地送入液晶控制器lcd_en=0; //低电平,执行命令}void lcd_write_data(unsigned char dat) //液晶写数据函数{lcd_busy_check(); //每次操作之前都要进行忙信号检测lcd_rs=1; //执行数据操作,为1lcd_rw=0; //写操作,为0P0=dat; //送数据到液晶数据端口P0,准备执行数据操作_nop_();lcd_en=1; //高电平,数据送入液晶液晶数据RAM_nop_(); //保持一会儿,使显示数据可靠地送入液晶数据RAM lcd_en=0; //低电平,显示数据}void lcd1602_init() //液晶显示初始化操作{P0=0xff;hc573_sg_le=0; //关闭HC573使数码管不显示hc573_bit_le=0;lcd_en=0; //为0,为实现高脉冲作准备lcd_write_cmd(0x38); //设置为5x7显示lcd_write_cmd(0x0c); // 打开显示-不显示示光标lcd_write_cmd(0x6); //地址加一,光标右移,整屏显示不移动lcd_write_cmd(0x01); //清屏}/*--毫秒级延时函数,参数为多少则延时多少毫秒--*/void delay_ms(unsigned int t){unsigned int a,b;for(a=0;a<t;a++){for(b=0;b<113;b++){;}}}void _nop5_() //5个机器周期的延时,延时5us多点{_nop_();_nop_();_nop_();_nop_();_nop_();}void _nop20_() //20个机器周期的延时,延时20us多点{_nop5_();_nop5_();_nop5_();_nop5_();}void _nop60_() //60个机器周期的延时,延时60us多点{_nop20_();_nop20_();_nop20_();}/*DS18B20的初始化函数每对DS18B20进行一次操作之前,都要初始化*/void ds18b20_init(){sda=0; //拉低delay_ms(1); //等待至少480us,(我们这里为1ms)sda=1; //单片机释放总线while(sda==1); //单片机等待DS18B20在总线发出存在信号(存在信号为低电平)while(~sda==1); //18B20发出存在信号后,单片机等待18B20释放总线delay_ms(1); //释放总线后,延时一段时间,最好大于480us(这里为1ms)}/*函数功能:单片机向ds18b20发送(写)一个字节的数据传递参数:要发送的字节数据返回数值:无*/void ds18b20_write_byte(unsigned char dat){unsigned char i;bit b; //定义一个位变量,用来判断本次的发送的位数据为1还是为0 for(i=8;i>0;i--) //重复8次才能将一个字节的数据逐位发送出去{b=dat&0x01; //发送的数据是由低位到高位顺序发送的,这里取最低位的位数据给bdat=dat>>1; //右移一位,使要发送的位数据永远放在最低位if(b==0) //如果本次要发送的数据为0,那么就按如下的操作发送0{sda=0; //总线拉低,开始新的写时序_nop60_(); //使总线拉低至少持续60us(这里为60多us),以使18b20可以采样到数据0sda=1; //60多us的时间过去,发送0完毕后,释放总线,为传输下一位数据作准备_nop_(); //写每位数据之间至少要有1us的恢复时间的间隔}else //如果本次要发送的数据为1,那么就按如下的操作发送1{sda=0; //总线拉低,开始新的写时序_nop_(); //拉低持续时间要大于1us,但一定要小于15us,否则18b20将错过本次采样sda=1; //发送入数据1到总线,18b20将采样到此数据_nop60_(); //发送一位数据的时序时间要大于60us} //写0时,本来整个时序就大于60us了,不用刻意延时了,但写1时,要刻意延时!}}/*函数功能:单片机从18b20读一个字节的数据传递参数:无返回数值:读到的一个字节数据*/unsigned char ds18b20_read_byte(){unsigned char i;unsigned char dat=0; //用于接收读到的数据for(i=8;i>0;i--) //重复8次才能从18b20读出一个字节的数据{sda=0; //总线拉低,开始新的读时序dat>>=1; //右移一位,用最高位接收新收到的位数据,(数据从最低位到最高位顺序接收)_nop_(); //拉低持续时间要大于1us,但要小于15us,否则18b20发送的位数据将可能会失效sda=1; //释放总线,准备接收位数据if(sda==1) //如果接受到的位数据为1dat=dat|0x80; //那么我就让dat的最高位为1,(如果位数据为0呢,那么最高位还是0,不用管)_nop60_(); //读一位数据的时序时间要大于60us }return dat; //8个循环的读取位数据操作结束了,这样就读到了一个字节数据,将它返回}/*函数功能:从18b20获取两个字节的温度数据,并将这两个温度数据整合成一个16位的数据,并将这个数据返回传递参数:无返回数值:为整合后的16位的数据*/unsigned int get_temp_data(){unsigned char data1,data2; //用于接收从18b20读到的两个字节的数据unsigned int temp_data=0; //用于将data1和data2整合成一个16位数据ds18b20_init(); //初始化ds18b20_write_byte(0xcc); //由于只有一个18b20,我们跳过ROM检查ds18b20_write_byte(0x44); //让18b20进行温度转换,18b20会将转换得到的两位数据保存在内部RAM中while(sda==0); //单片机等待18b20温度转换结束,(12位精度最长转换时间为750ms)ds18b20_init(); //再次初始化ds18b20_write_byte(0xcc); //跳过检查ds18b20_write_byte(0xbe); //读取18b20内部RAM数据(主要是读前两个字节的温度数据)data1=ds18b20_read_byte(); //读取温度数据的低8位data2=ds18b20_read_byte(); //读取温度数据的高8位temp_data=temp_data|data2; //整合成16位的数据,将高字节数据放到temp_data=(temp_data<<8)|data1; //高8位,将低字节数据放到低8位return temp_data;}/*函数功能:获得16位温度数据的小数部分传递参数:整合后的16位温度数据返回数值:为实际的小数值乘以1000后的整数值,以利于传递和处理*/unsigned int ds18B20_data0_convert(unsigned int temp_data){if((temp_data&0xf800)==0) //如果数据的高5位全为0,说明为正温度{temp_data=(temp_data>>1)&0x0007;//整体右移一位再提取低3位数据(小数部分)temp_data=temp_data*125; //11位的温度分辨率放大1000倍后,再乘以小数部分//这样做是为了方便数据的传输与处理(到时还原即可)return temp_data; //返回放大1000倍的温度值的小数部分的温度值}else{ //如果数据的高5位全为1,说明为负温度temp_data=~temp_data+1; //负温度数据是以补码形式存放的,要取反加1才能得到真实数据temp_data=(temp_data>>1)&0x0007;//整体右移一位再提取低3位数据(小数部分)temp_data=temp_data*125;return temp_data;}}/*函数功能: 获得16位温度数据的整数部分传递参数:整合后的16位温度数据返回数值:提取出的温度数据的整数部分。

基于51单片机DS18B20温度传感器的C语言程序和电路

基于51单片机DS18B20温度传感器的C语言程序和电路

基于51单片机DS18B20温度传感器的C语言程序和电路DS18B20在外形上和三极管很像,有三只脚。

电压范围为3.0 V至5.5 V 无需备用电源测量温度位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置应用范围包敏感系统。

下面是DS18B20的子程序,本人用过完全可行的:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit 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 code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x0数部分查表main(){while(1){自己添加;}}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]);n=1; //需要前面宏定义}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;}电路:。

基于ds18b20的温度计设计代码

基于ds18b20的温度计设计代码

基于DS18B20的温度计设计代码一、介绍DS18B20温度计DS18B20是一种数字温度传感器,由美国达拉斯半导体公司生产。

它采用单总线通信协议,并可以通过单总线接口进行多级串联。

DS18B20具有精度高、稳定性好、响应速度快等特点,因此在各种温度测量应用中被广泛使用。

二、DS18B20温度计设计代码在使用DS18B20温度传感器时,我们通常需要编写相应的代码来读取传感器的数据并进行温度计算。

以下是基于Arduino评台的DS18B20温度计设计代码:```c#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2 // 设置DS18B20数据线连接的Arduino 引脚OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);void setup() {Serial.begin(9600);sensors.begin();}void loop() {sensors.requestTemperatures(); // 发送获取温度命令float temperatureC = sensors.getTempCByIndex(0); // 获取温度值(摄氏度)float temperatureF = sensors.toFahrenheit(temperatureC); // 转换为华氏度Serial.print("Temperature: ");Serial.print(temperatureC);Serial.print("°C / ");Serial.print(temperatureF);Serial.println("°F");delay(1000); // 延时1s}```以上代码使用了OneWire库和DallasTemperature库来实现对DS18B20的温度测量。

DS18B20的接口电路及程序

DS18B20的接口电路及程序
else
{
fg=1;
return(-ftemp);
}
}
/***********************数据显示函数****************************/
void display1(uint i)
{
com1=0;
P0=tab[i];
tempwritebyte(0xcc); //跳过读序列号的操作
tempwritebyte(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=tempread(); //读出温度的低位LSB
tempH=tempread(); //读出温度的高位MSB
DS18B20的使用方法。由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89C52单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
if(tempH>0x7f) //最高位为1时温度是负
{
tempL=~tempL+1; //补码转换,取反加一
tempH=~tempH;
fg=0; //读取温度为负时fg="0"

DS18B20介绍、流程图和程序源代码.docx

DS18B20介绍、流程图和程序源代码.docx

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(含程序)

数字温度传感器DS18B20(含程序)

数字温度传感器DS18B20摘要DS-18B20 数字温度传感器具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

应用范围广泛,适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域,轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制和汽车空调、冰箱、冷柜、以及中低温干燥箱等。

一、引脚图DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)二、DS18B20的主要特性1.1、电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电1.2、DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯1.3、多个DS18B20可以并联在唯一的三线上,实现组网多点测温1.4、DS18B20在使用中不需要任何外围元件1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力1.9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

三、DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

DS18B20内部结构图四、DS18B20工作原理DS18B20的温度转换时的延时时间由2s 减为750ms。

DS18B20测温原理如图3所示。

DS18B20温度传感器实现代码

DS18B20温度传感器实现代码

DS18B20温度传感器实现代码平台: freescale CodeWarriorMCU:MC9S12G128(汽车级芯⽚)#include "Ds18b20.h"/************************************************************* DS18B20 status initialization************************************************************/#pragma MESSAGE DISABLE C12056 //屏蔽警告INT8U Ds18b20StsInit(void){INT8U ack = DB_OK;INT16U outTime = 500;//DisableInterrupts/* 初始化状态 */BUS_DIR = HIGH;BUS = HIGH;DelayUs(8);/* 拉低BUS,延时500us */BUS = LOW;DelayUs(480);/* BUS上拉,延时15us-60us */BUS = HIGH;DelayUs(30);/* BUS设置为输⼊ */BUS_DIR = LOW;/* 等待DS18B20存在脉冲做出回应,0正常,60-240us */DelayUs(8);while(BUS){--outTime; //超时处理if(outTime == 0){ack = DB_ERR;break;}}/* 等待DS18B20恢复稳定 */DelayUs(128);/* BUS上拉 */BUS_DIR = HIGH;BUS = HIGH;DelayUs(280);//EnableInterruptsreturn (ack);}/************************************************************* Write data to ds18b20************************************************************/PRIVATE void Ds18b20WriteData(INT8U cmd){INT8U i;DisableInterruptsfor(i = 0; i < 8; i++){//BUS = LOW; //HIGH->LOW 启动写时序//Tim_Delay8Us(2);if(cmd & 0x01) //从低位开始发送数据,15us完成 {BUS = 0; //写1时序DelayUs(5);BUS = 1;}else{BUS = 0; //写0时序DelayUs(5);}DelayUs(60); //等待从器件采集数据BUS = HIGH; //拉⾼总线,起始状态DelayUs(8);cmd >>= 0x01;}EnableInterrupts}#if 1/************************************************************* Read data from ds18b20************************************************************/ PRIVATE INT8U Ds18b20ReadData(void){INT8U i;INT8U data = 0x00;BUS = HIGH;DelayUs(8);DisableInterruptsfor(i = 0; i < 8; i++){data >>= 0x01;BUS = LOW; //拉低总线,进⾏读时序操作 DelayUs(8);BUS = HIGH; //拉低总线,进⾏读时序操作 DelayUs(8);BUS_DIR = LOW; //配置为输⼊asm("nop");//Tim_Delay8Us(1);if(BUS){data |= 0x80;}DelayUs(60); //等待数据读缓存BUS_DIR = HIGH;BUS = HIGH;DelayUs(8);}EnableInterruptsreturn (data);#endifINT8U Dt = 0, Dt1 = 0;/************************************************************* Get data from ds18b20************************************************************/INT16U Ds18b20GetTemperature(void){INT16U data = CLEAR;INT8U temp[2] = {0};Dt = Ds18b20StsInit();Ds18b20WriteData(0xcc); //跳过rom命令Ds18b20WriteData(0x44); //启动温度转换Dt1 = Ds18b20StsInit();Ds18b20WriteData(0xcc); //跳过rom命令Ds18b20WriteData(0xbe); //读暂存寄存器temp[0] = Ds18b20ReadData();temp[1] = Ds18b20ReadData();data = (temp[1] << 8) | temp[0];return (data);}调试DS18B20遇到采集数据不稳定情况: 不稳定现象:每读到⼏个正常数据后会有⼏个不正常的数据 不稳定原因:因为中断在打断我数据的读写以及采集 解决办法:因为DS18B20单总线读写时对时序要求很严格,每次读写时关闭中断即可得到稳定数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*******************代码部分**********************/ /*************** writer: ******************/#include <>#include <>#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);}}。

相关文档
最新文档