×
嵌入式 > 技术百科 > 详情

DS18b20温度检测与显示库程序

发布时间:2020-06-16 发布时间:
|

**************************************************************************************************

DS18b20.H

*******************
   DQ 接 p2.2
*******************

#ifndef __DS18b20_H__
#define __DS18b20_H__

#include"msp430f2232.h"

*********************************
**         引脚定义           **
*********************************
#define DQ_1 P2OUT |= BIT2
#define DQ_0 P2OUT &= ~BIT2
#define DQ_in  P2DIR &= ~BIT2
#define DQ_out P2DIR |= BIT2
#define DQ_val (P2IN & BIT2)

**********************************
****      命令字符定义      *****
**********************************
#define Read_ROM 0x33 //读ROM
#define Match_ROM 0x55 //匹配ROM
#define Skip_ROM 0xcc  //跳过ROM
#define Search_ROM 0xf0  //搜索ROM
#define Alarm_Search 0xec  //告警搜索

#define Convert_Temperature 0x44 //温度转换
#define Read_Scratchpad 0xbe //读暂存存储器9字节内容
#define Write_Scratchpad 0x4e //写暂存存储器,写的是TH and TL ,接着发送两位数据就可以

*********************************
**         定义变量           **
*********************************

//extern unsigned int Check_val;//初始化检测变量
//extern unsigned int Temp;//存放温度
//extern unsigned int Temp_l;//存放温度低四位
//extern unsigned int Temp_h;//存放温度高四位
************************************
****        函数定义          ****
************************************
extern void DS18b20_Port_Init(void);
extern unsigned int DS18b20_Init(void);
extern void DS18b20_write_byte(unsigned int dat);
extern unsigned int DS18b20_read_byte(void);
extern unsigned int get_one_temperature(void);

# endif

**************************************************************************************************

DS18B20.C

***********************
**** DQ 接 p2.4   ***
***********************
#include"DS18b20.h"

void DS18b20_Port_Init(void)
{
 P2DIR = BIT2;
}
*******************************************************************************
                         DS18b20 操作时序:
                         1.DS18b20 初始化
                         2.对64位ROM进行操作
                              读ROM
                              搜索ROM
                              跳过ROM
                              告警搜索
                         3.对寄存器进行操作
                            包括读取温度……
                         4.精度默认的为0.0625 ,无法重新设定,没找到相应的指令
                           相对应的转换时间为750ms
*******************************************************************************

*******************************************************************************
DS18b20 初始化方法:
 1 主机发送 480 - 960 us 的低电平,释放总线
 2 等待 15 - 60 us
 3 检测DQ上是否有低电平出现
     有:复位成功 ,通常时间为 60-240 us
     无:复位失败 , 继续等待
 4 DQ上出现低电平后,低电平持续15us,然后DS18b20开始对单片机发送的数据进行采样
*******************************************************************************

unsigned int DS18b20_Init(void)
{
   unsigned Check_val;
   DQ_out;
   DQ_0;
   __delay_cycles(600);
   DQ_1;
   __delay_cycles(60);
   DQ_in;
   _NOP();
   
   if(DQ_val==1)     
   {
       Check_val = 0;         //初始化失败
   }
   if(DQ_val==0)
   {
       Check_val = 1;         //初始化成功
   }
   __delay_cycles(10);
   DQ_out;
   DQ_1;
   __delay_cycles(100);
   return Check_val;
}

*******************************************************************************
DS18b20 写数据方法:
 1 DS18b20 是“一位一位”的写‘0’和‘1’
 2 每写一次‘1’或‘0’为一个周期,每个周期约为 45 - 60 us
 3 DQ拉低 1 us ,表示写周期开始,释放总线,让DQ随写入的值变化
 4 若写1: DQ拉高至少60us,保证在采样周期内采到的值均为高
 5 若写0: DQ拉低至少60us,保证在采样周期内采到的值均为低
 6 释放总线
*******************************************************************************
* 单片机发送数据时,是从写的数据的最高位开始发送*

void DS18b20_write_byte(unsigned int dat)
{
   unsigned int i;
   for(i = 0; i < 8;i++)
   {
       DQ_0;
       __delay_cycles(2);           
       if(dat & 0X01)   
         DQ_1;
       else 
         DQ_0;
       __delay_cycles(60);
       dat >>= 1;;         
       DQ_1;
       __delay_cycles(10);
   }
}

**************************************************************************************************
DS18b20 读数据方法:
 1 DS18b20 是“一位一位”的读‘0’和‘1’
 2 每读一次‘1’或‘0’为一个周期,每个周期约为 45 - 60 us
 3 DQ拉低 1 us ,表示读周期开始,释放总线,让DQ随DS18b20传送的值变化
 4 若传1:则检测到高电平,持续时间为60us左右,所以检测一次后要延时60us,再检测下一位传送的数据
 5 若传0:则检测到低电平,持续时间为60us左右
**************************************************************************************************
*DS18b20 传送数据也是从最高位开始传*
*所以单片机在接受数据时,存储变量一共移动8次,将所有数据都接收并回到最高位*

unsigned int DS18b20_read_byte(void)
{
   unsigned i;
   unsigned int byte = 0;
   for(i = 0;i < 8;i++)
   {
       byte >>= 1; 
       DQ_0;
       __delay_cycles(2); 
       DQ_1;
       __delay_cycles(2); 
       DQ_in;
       _NOP();
       if(DQ_val)  
         byte |= 0x80;
       __delay_cycles(60);
       DQ_out;
       DQ_1;
       __delay_cycles(10);
   }
   return byte;
}

*******************************************************************************
当用一个DS18b20进行温度测量时步骤
1.初始化
2.跳过ROM
3.控制寄存器: 温度转换 ,读取ROM , 读取温度低8位  , 温度高8位
注意的是,一定要初始化两次
*******************************************************************************

unsigned int get_one_temperature(void) //只读取了整数,没读取小数的部分
{
 unsigned int Temp_l,Temp_h,Temp;
 DS18b20_Init();
 DS18b20_write_byte(Skip_ROM);
 DS18b20_write_byte(Convert_Temperature);
 __delay_cycles(500000);
 
 DS18b20_Init();
 DS18b20_write_byte(Skip_ROM);
 DS18b20_write_byte(Read_Scratchpad);
 Temp_l=DS18b20_read_byte();
 Temp_h=DS18b20_read_byte();
 Temp_l>>=4;
 Temp_h<<=4;
 Temp=Temp_h+Temp_l;
 return Temp;
}

**************************************************************************************************

LCD1602.H

************************
P1 口为数据端口
rs 接 p2.0
rw 外接地
en 接 p2.1
*************************

#ifndef __LCD1602_H__
#define __LCD1602_H__

//#include"msp430g2553.h"
#include"msp430f2232.h"

******************************
         引脚定义
******************************

#define rs_0 P2OUT &= ~BIT1
#define rs_1 P2OUT |= BIT1
#define en_0 P2OUT &= ~BIT0
#define en_1 P2OUT |= BIT0

***********************************************************
                       函数定义
***********************************************************

extern void LCD1602_Port_Init(void);
extern void LCD1602_write_command(unsigned int com);
extern void LCD1602_write_data(unsigned int dat);
extern void LCD1602_Init(void);

extern void LCD1602_set_position(unsigned int x,unsigned int y);
extern void LCD1602_write_string(unsigned int x,unsigned int y,unsigned char *str);
extern void LCD1602_display_temperature(unsigned int x,unsigned int y,unsigned int temp,unsigned int lit);
extern void LCD1602_write_varia(unsigned int x,unsigned int y,unsigned int varia,unsigned int n);

#endif
**************************************************************************************************

LCD1602.C

 

#include"LCD1602.h"
**********************************
     数字变量显示定义
***********************************

 char Digital[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

void LCD1602_Port_Init(void)
{
 P1DIR = 0XFF;
 P2DIR |= BIT0 + BIT1 ;
}
void LCD1602_write_command(unsigned int com)
{
 rs_0;
 P1OUT=com;
 __delay_cycles(500);
 en_1;
 __delay_cycles(500);
 en_0;
}

void LCD1602_write_data(unsigned int dat)
{
 rs_1;
 P1OUT=dat;
 __delay_cycles(500);
 en_1;
 __delay_cycles(500);
 en_0;
}

void LCD1602_Init(void)
{
  LCD1602_write_command(0x38); //5*7点阵,双行显示
  LCD1602_write_command(0x0c); //0x0f 有光标,
  LCD1602_write_command(0x01); //清屏
  LCD1602_write_command(0x06); //写入数据后,光标右移,显示屏不动
}

 void LCD1602_set_position(unsigned int x,unsigned int y)
{
 if(x==1)
   LCD1602_write_command(0x80+y);
 if(x==2)
   LCD1602_write_command(0x80+0x40+y);
}

 void LCD1602_write_string(unsigned int x,unsigned int y,unsigned char *str)
{
 __delay_cycles(1000);
 LCD1602_set_position(x,y);
 while(*str!='\0')
 {
   LCD1602_write_data(*str);
   str++;
 }
}

void LCD1602_display_temperature(unsigned int x,unsigned int y,unsigned int temp,unsigned int lit)
{
   LCD1602_set_position(x,y);
   LCD1602_write_data(Digital[temp/10]);
   LCD1602_write_data(Digital[temp]);
   LCD1602_write_data('.');
   LCD1602_write_data(Digital[lit/10]);
   LCD1602_write_data(Digital[lit]);
   LCD1602_write_data('C');
}


void LCD1602_write_varia(unsigned int x,unsigned int y,unsigned int varia,unsigned int n)
{
 __delay_cycles(1000);
 LCD1602_set_position(x,y);
 switch(n)
 {
   case 1 : LCD1602_write_data(Digital[varia]); break;
   case 2 : LCD1602_write_data(Digital[varia/10]);
            LCD1602_write_data(Digital[varia]);break;
   case 3 : LCD1602_write_data(Digital[varia/100]);
            LCD1602_write_data(Digital[varia0/10]);
            LCD1602_write_data(Digital[varia]); break;
   case 4 : LCD1602_write_data(Digital[varia/1000]);
            LCD1602_write_data(Digital[varia00/100]);
            LCD1602_write_data(Digital[varia00/10]);
            LCD1602_write_data(Digital[varia]);break;
 }
}

**************************************************************************************************

MAIN.C

#include "LCD1602.h"
#include "DS18B20.h"

int main( void )
{
 // Stop watchdog timer to prevent time out reset
 WDTCTL = WDTPW + WDTHOLD;
 P1DIR =0XFF;
 P2DIR = BIT0+BIT1+BIT2;
 unsigned int t;
 LCD1602_Init();
 DS18b20_Init();
 while(1)
 {
  t=get_one_temperature();
 LCD1602_write_string(1,1,"The temprature ");
  LCD1602_write_string(2,0,"is");
 LCD1602_display_temperature(2,3,t,t);
 }
}

**************************************************************************************************

仿真结果:


**************************************************************************************************





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
FPGA及CPLD应用领域不断拓展