DS18B20温度传感器PIC测温并用1602显示屏显示温度

发布者:知者如渊最新更新时间:2016-11-17 关键字:DS18B20  温度传感器  PIC测温  1602显示屏 手机看文章 扫描二维码
随时随地手机看文章

//************************************************** 
//实验目的: 
//熟悉使用单片机运用DS18B20温度传感器测试温度,并用1602显示屏显示温度 
//1、第一行显示:Temperature 
//2、第二行显示:实测温度值 
//************************************************** 

//************************************************** 
//硬件设置: 
//1、SW2,SW4开关全部断开 
//2、插上DS18B20温度传感器 
//************************************************** 

//************************************************** 
//*****************定义头文件********************** 
//************************************************** 
#include 
#include "delay.h" 

//************************************************** 
//******************定义配置位********************* 
//************************************************** 
__CONFIG(0x3545);        
//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护 
//RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器 

//************************************************** 
//******************定义常量*********************** 
//************************************************** 
#define uchar unsigned char 
#define uint  unsigned int 

//************************************************** 
//***************定义DS18B20引脚******************* 
//************************************************** 
#define DQ     RE0 
#define DQ_IO  TRISE0  

//************************************************** 
//******************定义LCD引脚********************* 
//************************************************** 
#define RS RA1 
#define RW RA2 
#define E  RA3 
  

//************************************************** 
//******************定义变量*********************** 
//************************************************** 
uchar lowtemp,hightemp;  //低8位温度变量,高8位温度变量 
uchar zhengshu,xiaoshu;  //温度整数变量,温度小数变量 
uint temperature;        //转换后的温度值BCD码形式 
uchar temp[7];           //转换后温度存放变量 

//************************************************** 
//******************定义数据*********************** 
//************************************************** 
//显示:  Temperature 
//显示:WWW.PICAVR.COM 
const uchar name[16]= 
//{0x20,0x20,0x20,0x54,0x65,0x6d,0x70,0x65,0x72,0x61,0x74,0x75,0x72,0x65,0x20,0x20}; 
{0x20,0x57,0x57,0x57,0x2E,0x50,0x49,0x43,0x41,0x56,0x52,0x2E,0x43,0x4F,0x4D,0x20};  
  

//*********************************************** 
//函 数 名:delayms(uchar time); 
//入口参数:time 
//出口参数:无 
//函数作用:毫秒延时 
//说    明: 
//*********************************************** 
void delayms(uchar time) 

  uint i; 
  while(time--) 
  { 
    for(i=93;i>0;i--){;} 
  } 


//*********************************************** 
//函 数 名:port_init(); 
//入口参数:无 
//出口参数:无 
//函数作用:端口初始化 
//说    明: 
//*********************************************** 
void port_init(void) 

  ADCON1=0X07;   //设置RA,RE口为数字口 
  TRISA=0X00;    //设置RA口为输出口 
  TRISD=0X00;    //设置RD口为输出口 
  TRISE=0X00;    //设置RE口为输出口 
  OPTION=0X8F;   //分频给WDT,分频比为128 


//*********************************************** 
//函 数 名:lcd_enable(); 
//入口参数:无 
//出口参数:无 
//函数作用:LCD写使能 
//说    明: 
//*********************************************** 
void lcd_enable(void) 

  RS=0;         //写命令 
  RW=0;         //写操作 
  E=0;          //低电平信号 
  delayms(10);  //低电平信号保持 
  E=1;          //拉高电平信号 


//*********************************************** 
//函 数 名:lcd_writebyte(uchar data); 
//入口参数:data 
//出口参数:无 
//函数作用:LCD写一个字节数据 
//说    明: 
//*********************************************** 
void lcd_writebyte(uchar data) 

  PORTD=data;   //向RD口写数据 
  RS=1;         //写数据 
  RW=0;         //写操作 
  E=0;          //低电平信号 
  delayms(10);  //低电平信号保持 
  E=1;          //拉高电平信号 


//*********************************************** 
//函 数 名:lcd_writedata(const uchar *ptt); 
//入口参数:*ptt 
//出口参数:无 
//函数作用:LCD写数据块函数 
//说    明: 
//*********************************************** 
void lcd_writedata(const uchar *ptt) 

  uchar i; 
  for(i=0;i<16;i++)         //写16个字节数据 
  { 
    lcd_writebyte(ptt[i]);  //查表写数据 
  } 


//*********************************************** 
//函 数 名:lcd_init(); 
//入口参数:无 
//出口参数:无 
//函数作用:LCD初始化 
//说    明: 
//*********************************************** 
void lcd_init(void) 

  PORTD=0X01;    //清除显示 
  lcd_enable(); 
  PORTD=0X38;    //8位2行5*7点阵 
  lcd_enable(); 
  PORTD=0X0e;    //显示开,光标开,闪烁 
  lcd_enable(); 
  PORTD=0X06;    //文字不动,光标右移 
  lcd_enable(); 


//*********************************************** 
//函 数 名:ds18b20_reset(); 
//入口参数:无 
//出口参数:无 
//函数作用:DS18B20复位 
//说    明: 
//*********************************************** 
void ds18b20_reset(void) 

  uchar x=1; 
  while(x) 
  {  
    DQ_IO=0;       //设置RE0为输出口 
    DQ=0;          //RE0输出低电平 
    DelayUs(201);  //延时503us(最短480us低电平信号) 
    DQ_IO=1;       //释放总线,进入接收(设置RE0为输入口) 
    DelayUs(29);   //延时70us(18b20检测到上升沿时,等待15-60us) 
    if(DQ){x=1;}   //有应答信号,跳出 
    else {x=0;}    //没有应答信号,继续复位(低电平持续在60-240us) 
    DelayUs(172);  //延时430us 
   } 


//*********************************************** 
//函 数 名:ds18b20_writebyte(uchar data); 
//入口参数:data 
//出口参数:无 
//函数作用:DS18B20写一个字节数据 
//说    明: 
//*********************************************** 
void ds18b20_writebyte(uchar data) 

  uchar i,temp; 
  for(i=8;i>0;i--)      //写8位数据 
  { 
    temp=data&0x01;     //先写低位数据 
    DQ_IO=0;            //设置RE0为输出口 
    DQ=0;               //RE0输出低电平 
    DelayUs(1);         //延时6us(15us之内把数据送到总线上) 
    if(temp){DQ_IO=1;}  //设置RE0为输入口(写1时序) 
    DelayUs(25);        //延时61us(总线采样时间15-60us) 
    DQ_IO=1;            //设置RE0为输入口(写0时序) 
    DelayUs(1);         //延时6us(写第二位时间间隙大于1us) 
    data=data>>1;       //右移一位 
  } 


//*********************************************** 
//函 数 名:ds18b20_readbyte(); 
//入口参数:无 
//出口参数:无 
//函数作用:DS18B20读一个字节数据 
//说    明: 
//*********************************************** 
unsigned char ds18b20_readbyte(void) 

  uchar i,data=0;           //读出温度 
  for(i=8;i>0;i--)          //读8位数据 
  { 
    data=data>>1;           //数据先右移一位 
    DQ_IO=0;                //设置RE0为输出口 
    DQ=0;                   //RE0输出低电平 
    DelayUs(1);             //延时6us(低电平时间大于1us) 
    DQ_IO=1;                //拉高总线,产生读时间间隙(设置RE0为输入口) 
    DelayUs(1);             //延时6us(从拉低电平开始15us之内完成读位) 
    if(DQ){data=data|0x80;} //先读高位数据,高位为1 
    else  {data=data|0x00;} //高位为0 
    DelayUs(25);            //延时61us(从拉低电平开始60-120us之内释放总线) 
  } 
  return(data); 


//*********************************************** 
//函 数 名:read_ds18b20_data(); 
//入口参数:无 
//出口参数:无 
//函数作用:读DS18B20测试的温度数据 
//说    明: 
//*********************************************** 
void read_ds18b20_data(void) 
{  
  DQ_IO=1;                                   //设置RE0为输入口 
  ds18b20_reset();                           //调用复位函数 
  ds18b20_writebyte(0XCC);                   //跳过ROM匹配  
  ds18b20_writebyte(0X44);                   //发送温度变换命令 
  ds18b20_reset();                           //再次复位 
  ds18b20_writebyte(0XCC);                   //跳过ROM匹配  
  ds18b20_writebyte(0XBE);                   //发送读温度命令  
  lowtemp=ds18b20_readbyte();                //读出低8位温度值 
  hightemp=ds18b20_readbyte();               //读出高8位温度值 
  DQ_IO=1;                                   //释放总线  
  zhengshu=((lowtemp>>4)|(hightemp<<4))&0X3F; 
  xiaoshu=lowtemp<<4; 
  temp[0]=(zhengshu/100)%10;                 //整数百位 
  temp[1]=(zhengshu/10)%10;                  //整数十位 
  temp[2]=zhengshu%10;                       //整数个位 
  temperature=0;   
  if(xiaoshu&0x80)                           //下面是把小数部分转换为BCD码形式  
  { 
    temperature+=5000; 
  } 
  if(xiaoshu&0x40) 
  { 
    temperature+=2500; 
  }  
  if(xiaoshu&0x20) 
  { 
    temperature+=1250; 
  } 
  if(xiaoshu&0x10) 
  { 
     temperature+=625;                 
  }             
  temp[3]=(temperature/1000)%10;             //十分位                     
  temp[4]=(temperature/100)%10;              //百分位 
  temp[5]=(temperature/10)%10;               //千分位 
  temp[6]=temperature%10;                    //万分位 
  DelayUs(1);                                //延时6us 


//*********************************************** 
//函 数 名:lcd_display_temp(); 
//入口参数:无 
//出口参数:无 
//函数作用:LCD显示测试温度程序 
//说    明: 
//*********************************************** 
void lcd_display_temp(void) 

  PORTD=0X80;                    //设置第1行显示地址 
  lcd_enable(); 
  lcd_writedata(name);           //调用显示函数 
  PORTD=0XC0;                    //设置第2行显示地址 
  lcd_enable();                  //调用写使能函数 
  lcd_writebyte(0x20);     
  lcd_writebyte(0x20); 
  lcd_writebyte(0x20); 
  if(temp[0]==0) 
  { 
    lcd_writebyte(0x20); 
  } 
  else 
  { 
    lcd_writebyte(temp[0]+0x30); 
  } 
  lcd_writebyte(temp[1]+0x30); 
  lcd_writebyte(temp[2]+0x30); 
  lcd_writebyte(0x2e); 
  lcd_writebyte(temp[3]+0x30); 
  lcd_writebyte(temp[4]+0x30); 
  lcd_writebyte(temp[5]+0x30); 
  lcd_writebyte(temp[6]+0x30); 
  lcd_writebyte(0x20); 
  lcd_writebyte(0x43); 
  lcd_writebyte(0x20); 
  lcd_writebyte(0x20); 
  lcd_writebyte(0x20); 


//*********************************************** 
//函 数 名:main(); 
//入口参数:无 
//出口参数:无 
//函数作用:MAIN函数 
//说    明: 
//*********************************************** 
void main(void) 

  port_init();           //调用端口初始化函数 
  lcd_init();            //调用LCD初始化函数 
  while(1) 
  { 
    read_ds18b20_data(); //调用温度转换函数 
    CLRWDT();            //清看门狗 
    lcd_display_temp();  //调用温度显示函数 
  } 
}

关键字:DS18B20  温度传感器  PIC测温  1602显示屏 引用地址:DS18B20温度传感器PIC测温并用1602显示屏显示温度

上一篇:PIC16F877A片内EEPROM c程序
下一篇:PIC单片机模拟读写24C01 EEPROM

推荐阅读最新更新时间:2024-03-16 15:20

LCD液晶显示的DS18B20数字式电脑温度计
  液晶显示器分很多种类,按显示方式可分为段式,行点阵式和全点阵式。段式与数码管类似,行点阵式一般是英文字符,全点阵式可显示任何信息, 如汉字、图形、图表等。这里我们介绍一种八段式四位LCD显示器,该显示器内置驱动器,串行数据传送,使用非常方便。原理图如下图:   下图是长沙太阳人科技开发有限公司生产的4位带串行接口的液晶显示模块SMS0403的外部引线简图:   有关该模块的具体参数,请查看该公司网站。此例中使用的温度传感器 为美国DALLAS公司生产的单总线式数字温度传感器。该传感器本站有其 详细的资料可供下载。此例稍加改动,即可做成温控器。
[单片机]
LCD液晶显示的<font color='red'>DS18B20</font>数字式电脑温度计
温度传感器简介
温度是一个基本的物理量,自然界中的一切过程无不与温度密切相关。温度传感器是最早开发,应用最广的一类传感器。温度传感器的市场份额大大超过了其他的传感器。从17世纪初人们开始利用温度进行测量。在半导体技术的支持下,本世纪相继开发了半导体热电偶传感器、PN结温度传感器和集成温度传感器。与之相应,根据波与物质的相互作用规律,相继开发了声学温度传感器、红外传感器和微波传感器。 两种不同材质的导体,如在某点互相连接在一起,对这个连接点加热,在它们不加热的部位就会出现电位差。这个电位差的数值与不加热部位测量点的温度有关,和这两种导体的材质有关。这种现象可以在很宽的温度范围内出现,如果精确测量这个电位差,再测出不加热部位的环境温度,就可以准确
[嵌入式]
数字式温度计DS18B20的特性及应用
    摘要: DS18B20是美国DALLAS公司生产的可完全替代DS1820的全新型单线数字式温度计。文中介绍了DS18B20的性能结构和与DS1820比较所具有的不同特点,说明了DS18B20的使用要求。给出了DS18B20与单片机成成的测温系统的应用电路和检测流程。     关键词: 单线器件 数字式温度仪 DS18B20 1 引言 DS18B20是美国DALLAS公司生产的一线式数字式温度计芯片,它具有结构简单,不需外接元件,采用一根I/O数据线既可供电又可传输数据、并可由用户设置温度报警界限等特点,可广泛用于食品库、冷库、粮库等需要控制温度的地方。DS18B20是DS1820的改进型产品,但该
[应用]
纳芯微推出全新高精度、低功耗的远程数字温度传感器NST141x系列
纳芯微推出全新高精度、低功耗的远程数字温度传感器NST141x系列 2023年1月17日 – 纳芯微 (NOVOSENSE) 推出全新高精度、低功耗的远程数字温度传感器NST141x系列 ,该系列产品包含NST1412和NST1413两个产品型号,适用于笔记本电脑、服务器等应用中的板级测温,满足各类通信、计算以及仪器仪表中多点位、高性能的温度监测需求。 对笔记本电脑和服务器内部硬件温度监测的必要性 笔记本电脑的内部空间狭小,诸如中央处理器CPU、显卡、硬盘作为重要的发热来源,一旦这些硬件超出正常温度范围,通常会导致笔记本电脑性能下降,甚至显卡部件烧毁,硬盘数据丢失等风险。因此,对于笔记本电脑核心部件的温度监测十分
[传感器]
纳芯微推出全新高精度、低功耗的远程数字<font color='red'>温度传感器</font>NST141x系列
基于光纤的温度传感器
温度传感器是基于一个基本的物理量“温度”,自然界中的一切过程无不与 温度!密切相关。 从伽利略发明温度计开始, 人们开始利用温度进行测量。   温度传感器是最早开发、应用最广的一类传感器。 但真正把温度变成电信号的传感器是由德国物理学家赛贝发明的, 就是后来的热电偶传感器。 50 年以后,德国人西门子发明了铂电阻温度计。 在半导体技术的支持下, 本世纪相继开发了包含半导体热电偶传感器在内的多种温度传感器。 与之相应, 根据波与物质的相互作用规律, 相继开发了声学温度传感器、红外传感器和微波传感器。 而光纤自20 世纪70 年代问世以来, 随着激光技术的发展, 从理论和实践上都已证明光纤具有一系列的优越性, 光纤在传感技术领域中的应用
[工业控制]
基于光纤的<font color='red'>温度传感器</font>
DS18B20构成的电脑温控系统
由DS18B20构成6通道电脑温控系统的电路框图和总电路,分别如图1.2.4、图1.2.5所示。现使用6片DS18B20同时测控6通道温度。另用一片DS18B20专门监测机内UP的温度。
[模拟电子]
由<font color='red'>DS18B20</font>构成的电脑温控系统
Littelfuse 宣布收购温度传感器制造商 U.S. Sensor
   Littelfuse  公司(纳斯达克股票代码:LFUS)于今天宣布收购 U.S. Sensor 公司的资产。 总部设在加利福尼亚州的奥兰治,U.S. Sensor 是一家最严苛的温度传感应用中所用热敏电阻和探头组件的制造商。 交易条款并未披露。下面就随网络通信小编一起来了解一下相关内容吧。   “U.S. Sensor 公司在几个关键的电子和工业终端市场,包括家庭自动化、HVAC 和家用电器,拓展了我们现有的 传感器 产品组合,”电子部高级副总裁和总经理Deepak Nayar说道, “这个交易加强了能促使增长计划完成的设计能力。 ”   U.S. Sensor 总裁 Roger Dankert 表示:“这是 U.S.
[网络通信]
1-Wire温度传感器的快速编程
  引  言   一般来说,总线数越少,连接就越简单,因而串行总线嵌入式元件在许多应用场合颇受欢迎。但正因为只有1根线,该类元件的编程要紧扣硬件和时钟,难度大于I2C总线和SPI总线。本文以数字温度传感器DSl8B20为例,介绍一种实用和简单的编程方案。   1  DS18B20的精简编程考虑   测温分辨率:通过设置配置寄存器,DS18B20有0.5℃、0.25℃、0.125℃和0.062 5℃几种温度可供选择。如果不作选择,缺省值为12位,即最高分辨率0.062 5℃,这样可省去相关写EEPROM的命令。图1为温度格式。   温度报警高限TH和低限TL:如果设置了TH和TL,DS18B20将在温度高于TH或低于
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved