单片机——温度传感器

    今天利用数字温度传感器DS18B20与单片机结合写了一段程序,利用数字温度传感器DS18B20测量温度信号,计算后在1602显示屏上显示出当前的室内温度。其测量的温度范围为-55~125摄氏度,基本上符合我们正常的温度需求。

  有关DS18B20的详细资料,可以点击这里,首先我们需要根据DS18B20的时序图特性写代码进行初始化,启动温度转换,读暂存器等一些操作。将读好的数据转换成我们需要的float型的数据显示在1602显示屏上,下面是具体的实现代码:

#include 
#include 
#include 
#define dataport P0

unsigned char code b[10]={'0','1','2','3','4','5','6','7','8','9'}	  ;
unsigned char temp[3] ;

#define RS_CLR RS=0
#define RS_SET RS=1 

#define RW_CLR RW=0
#define RW_SET RW=1 

#define EN_CLR EN=0
#define EN_SET EN=1 

sbit RS = P2^6 ;
sbit RW = P2^5 ;
sbit EN = P2^7 ;



void delayms(unsigned int xms) 
{
      unsigned int i,j;
      for(i=xms;i>0;i--)  
         for(j=110;j>0;j--);
}

void DelayUs2x(unsigned char t)
{
    while(--t);
}

sbit DQ = P3^7 ;

bit DS18B20_Init()
{
    bit dat;
    DQ = 1;
    DelayUs2x(5);
    DQ = 0;             //给一个下降沿
    DelayUs2x(200);
    DelayUs2x(200);     //延时480us < t < 960us
    DQ = 1;
    DelayUs2x(50);      //15~60us以后,在60~240us之间,接受应答信号
    dat = DQ;           //dat = 0   初始化成功 dat = 1 初始化失败
//    UART_SendStr();
    DelayUs2x(25);      //延时后返回
    return dat;
}

void write_char(unsigned char dat)
{
    unsigned char i;
    for (i = 0; i < 8; i++)
    {
        DQ = 0;
        DelayUs2x(5);
        DQ = dat & 0x01;    //发送数据
        DelayUs2x(25);      //延时15~60us
        DQ = 1;
        dat >>= 1;
    }
}

unsigned char ReadChar()
{
    unsigned char dat,i;
    for (i = 0; i < 8; i++)
    {
        DQ = 0;
        dat >>= 1;
        DQ = 1;
        if (DQ)
        {
            dat |= 0x80;
        }
        DelayUs2x(25);
    } 
    return dat;   
}

unsigned int ReadTemp(void)
{
    unsigned char Temp_L = 0;
    unsigned int Temp_H = 0;
    unsigned int Temp;
    DS18B20_Init();    //初始化
    write_char(0xCC);   //跳过ROM
    write_char(0x44);   //启动温度转换
    delayms(10);       //等待转换结果
    DS18B20_Init();
    write_char(0xCC);
    write_char(0xBE);   //读温度暂存器(共9字节),一般只读前两个,第一个是低八位,第二个是高八位
    Temp_L = ReadChar();
    Temp_H = ReadChar();
    Temp_H <<= 8;
    Temp = Temp_L + Temp_H;
    
    return Temp;
}

void LCD_Write_Comand(unsigned char comand)		//写指令
{
    delayms(5) ;
    RS_CLR ; 
	RW_CLR ;
	EN_SET	;
	dataport = comand ;
    _nop_() ;
	EN_CLR ; 
}

void LCD_Write_Data(unsigned char data1)		  //写数据
{
    delayms(5) ;
    RS_SET ;
	RW_CLR ;
	EN_SET ;
	dataport = data1 ;
    _nop_() ;
	EN_CLR ; 
}

void Init() //对1602显示器进行初始化
{
      EN_CLR ;
      LCD_Write_Comand(0x38) ;
	  delayms(5) ;
	  LCD_Write_Comand(0x38) ;
	  delayms(5) ;
	  LCD_Write_Comand(0x38) ;
	  delayms(5) ;
	  LCD_Write_Comand(0x38) ;
	  LCD_Write_Comand(0x08) ;	 //显示关闭
	  LCD_Write_Comand(0x01) ;	 //显示清屏
	  LCD_Write_Comand(0x06) ;	 //显示光标移动设置
	  LCD_Write_Comand(0x0C) ;	 //显示开及光标设置
}

void LCD_Clear()	//清屏
{
    LCD_Write_Comand(0x01) ;
	delayms(5) ;
}



void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)	   //显示屏上写入字符串
{
      if(y == 0)
	  {
	       LCD_Write_Comand(0x80+x) ;
	  }
	  else
	  {
	       LCD_Write_Comand(0xC0+x) ;
	  }
	  while(*s)
	  {
	       LCD_Write_Data(*s) ;
		  // delayms(255) ;
		   s++;
	  }
}

void main()    
{
    
	  unsigned char wendu[16] ;
	  float i ;
	  int a;
	  DS18B20_Init();
	  Init() ;
	  LCD_Clear()  ;
	  while(1)
	  {
	        a  =  ReadTemp();
	      	i = (float)a*0.0625 ;
	        sprintf(wendu,"%f",i) ;
                LCD_Write_String(0,0,"Temperature:") ;
	        LCD_Write_String(3,1,wendu) ; 
	  }
	    
	  	  
}

单片机——温度传感器_第1张图片

你可能感兴趣的:(单片机学习)