ds18b20温度检测与显示库程序-u球体育app下载

嵌入式 > 技术百科 > 详情

ds18b20温度检测与显示库程序

发布时间:2025-05-19 发布时间:
|

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

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);
 }
}

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

仿真结果:


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





『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』

热门文章 更多
艾雷斯工控机在纺织自动化u球体育app下载的解决方案
网站地图