DS18B20+PIC测温用1602显示温度C程序

发布者:Yuexiang最新更新时间:2015-06-19 来源: 51hei关键字:DS18B20  PIC测温  显示温度 手机看文章 扫描二维码
随时随地手机看文章
//熟悉使用单片机运用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);  //查表写数据
  }
}[page]

//***********************************************
//函 数 名: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测温  显示温度 引用地址:DS18B20+PIC测温用1602显示温度C程序

上一篇:PIC单片机定时器相关用法
下一篇:单片机按键处理总结

推荐阅读最新更新时间:2024-03-16 14:04

【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取
普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《普中 51 单片机开发攻略》、《DS18B20 单总线数字温度计》 DS18B20介绍 DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接 口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、 适用电压宽、与微处理器接口简单的数字化温度传感器。 DS18B20 温度传感器具有如下特点: 适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据 线供电。
[单片机]
【51单片机快速入门指南】6.3:<font color='red'>DS18B20</font> 单总线数字<font color='red'>温度</font>计的多路读取
PIC单片机控制DS18B20数字温度传感器原理及实现
#include pic.h #define uchar unsigned char #define uint unsigned int #define DQ RC1 #define DQ_HIGH() TRISC1=1 #define DQ_LOW() TRISC1=0;DQ=0 __CONFIG(0x3B31); const uchar table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f}; const uchar table1 ={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,
[单片机]
51单片机1602、18B20电子钟--C51源代码
#include REGx52.h #include RICHMCU.H sbit a0 = ACC^0; sbit a1 = ACC^1; sbit a2 = ACC^2; sbit a3 = ACC^3; sbit a4 = ACC^4; sbit a5 = ACC^5; sbit a6 = ACC^6; sbit a7 = ACC^7; sbit DQ = P3^3 ; //18B20接口 sbit speaker = P3^6 ; //蜂鸣器 sbit MODE = P1^4 ; //模式键 sbit INC = P1^5 ; //增加键 sbit DEC = P1^6 ; //减少键 sbit OK
[单片机]
基于CC2430和DS18B20的无线测温系统设计
  目前,很多场合的测温系统采用的还是有线测温设备,由温度传感器、分线器、测温机和监控机等组成,各部件之间采用电缆连接进行数据传输。这种系统布线复杂、维护困难、成本高,可采用无线方案解决这些问题。无线测温系统是一种集温度信号采集、大容量存储、无线射频发送、LED(或LCD)动态显示、控制与通信等功能于一体的新型系统。   本文从低功耗、小体积、使用简单等方面考虑,基于射频SoC CC2430和数字温度传感器DS18B20设计了一个无线测温系统,整个系统由多个无线节点和1个基站组成。无线节点工作在各个测温地点,进行温度数据采集和无线发送。基站与多个节点进行无线通信,并通过数码管将数据显示出来,同时可以通过RS-232串口将数据发送
[模拟电子]
Ds3231+12864液晶显示AT89C51带温度功能的时钟程序
Ds3231+12864液晶显示AT89C51带温度功能的时钟程序。 #include #include #include #define uchar unsigned char #define uint unsigned int sbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_EN=P2^4; sbit LCD_PSB=P2^3; sbit DQ=P3^7; //18b20 sbit SDA=P1^4; //ds32321 //模拟I2C数据传送位SDA sbit SCL=P1^3;
[单片机]
Ds3231+12864液晶<font color='red'>显示</font>AT89C51带<font color='red'>温度</font>功能的时钟程序
单片机课程设计报告—温度报警器
1绪论 1.1温度报警器简介 温度报警器是一种通过DS18B20采集周围温度,单片机来处理数据来报警的一种电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的温度报警器是以芯片为核心,通过编程来实现的。 1.2温度报警器的背景与研究意义 在日常生活中,温度对于我们并不陌生,它是一个时时刻刻存在的物理量在我们的日常生活中占据了十分重要的地位。温度的大小时刻与我们的生产、生命、安全息息相关。因此对温度的测量与控制对各个行业领域有着很及其重要的作用尤其是在金属冶炼、化学研究、建材生产、食品加工、机械制作、石油提炼等工业领域,占据不可忽视的作用。众所周知,当我们进行陶瓷烧烤,制作陶瓷工
[单片机]
单片机课程设计报告—<font color='red'>温度</font>报警器
51单片机驱动1602液晶汇编语言程序
LCMRS EQU P2.4 LCMRW EQU P2.5 LCMEN EQU P2.6 LCMDATA EQU P0 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV SP,#60H LCALL LCMSET LCALL LCMCLR MOV A,#80H LCALL LCMWR0 MOV DPTR,#TAB0 LCALL LCMWR2 MOV A,#0C0H LCALL LCMWR0 MOV DPTR,#TAB1 LCALL LCMWR2 SJMP $ TAB0: DB I AM YUAN MING ,00H TAB1: DB NICE TO MEET YOU ,00H LCMLAY:
[单片机]
#单片机#ds18b20 单位转换 30度报警
#include reg52.h #define uchar unsigned char #define uint unsigned int sbit DSPORT=P3^7; sbit key3 = P3^2; sbit beep = P1^0; uchar flag; int tmp; float t; uint warn_d = 300; //温度上限值,温度为乘10之后的值 uchar code table ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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