单片机——温度传感器

来源:互联网 发布:网络监控软件破解版 编辑:程序博客网 时间:2024/05/16 12:50

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

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

#include <reg51.h>#include <intrins.h>#include <stdio.h>#define dataport P0unsigned 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) ;   }        }


0 0
原创粉丝点击