18b20 C程序

18b20 C程序,第1张

18b20 C程序

//将DQ与Vcc之间接入4.7K上拉电阻
#include "reg52.h"
#include "INTRINS.H"
#include "1602.c"
#define uchar unsigned char
#define uint  unsigned int
//#define CLEARSCREEN LCD_en_command(0x01)   1602清屏
sbit DQ="P1"^0;
/* *** 作命令代码
  跳过ROM 0xCC
  发送温度转换 0xBE
  写EEPROM  0x4E
*/

/////////////低层驱动子程序///////////
void Init18B20(void); //初始化
void Write18B20(uchar ch);//写数据
unsigned char Read18B20(void);//读数据 
void Delay15(uchar n);  
void Delay10ms(uint delay_num);
void Display(void);
///////////////////////////////////// 
code uchar decimalH[]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
code uchar decimalL[]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};


uint ResultTemperatureH ,ResultTemperatureLH,ResultTemperatureLL;//整数,小数高位,小数低位
uint  ResultSignal;//符号位



main()
{  uint TemH,TemL,delay,k=0;
   for(; ; )
 {
   Init18B20();

   Write18B20(0xCC);//跳过ROM
   _nop_();
   //Write18B20(0x4E);//写EEPROM
  // Write18B20(0x00);//Th
   //Write18B20(0x00);//Tl
   Write18B20(0x7f);//12 bits温度分辨率
   Init18B20();

   Write18B20(0xCC);//跳过ROM
   _nop_();


   Write18B20(0x44);//发送温度转换指令
   Delay10ms(25);
   Delay10ms(25);
   Delay10ms(25);
   Delay10ms(25);//等待1s转换

   Init18B20();
   Write18B20(0xCC);//跳过ROM
   Write18B20(0xBE);//发送温度转换指令
   TemL="Read18B20"();  //读低位温度值
   TemH="Read18B20"();  //读高位温度值                                                        

   Delay10ms(2);
  
  TemH=(TemH<<4)|(TemL>>4);
   TemL="TemL"&0x0f;   //取低4位
   if(TemH&0x80)
    {  TemH=~TemH;
    TemL=~TemL+1;
       ResultSignal="1";     //负
    }
     else  ResultSignal="0";   //正

   ResultTemperatureLH="decimalH"[TemL];
   ResultTemperatureLL="decimalL"[TemL];
   ResultTemperatureH="TemH";
   Display();

  for(delay=0;delay<60000;delay++);
  for(delay=0;delay<20000;delay++);
  
  }  
}

void  Display(void)
{  uint i,j,q;
   LCD_init();
     CLEARSCREEN;
  LCD_en_command(0x01);
  delay_nms(2);
 
     q="ResultTemperatureH/100";
     i=(ResultTemperatureH%100)/10;
     j="ResultTemperatureH-"(i*10+q*100);
  LCD_write_string(0,LINE1," Jaq1217 18B20  ");
 if(ResultSignal)  
   { LCD_write_string(0,LINE2," T is:-   .     ");  }
   else {LCD_write_string(0,LINE2," T is:+   .     ");}
    LCD_write_char(0x07,LINE2,q|0x30);
    LCD_write_char(0x08,LINE2,i|0x30);
    LCD_write_char(0x09,LINE2,j|0x30);
    LCD_write_char(0x0b,LINE2,(ResultTemperatureLH/10)|0x30);
 LCD_write_char(0x0c,LINE2,(ResultTemperatureLH%10)|0x30);
 LCD_write_char(0x0d,LINE2,(ResultTemperatureLL/10)|0x30);
 LCD_write_char(0x0e,LINE2,(ResultTemperatureLL%10)|0x30);
   }

unsigned char Read18B20(void)
 { unsigned char ch;
   unsigned char q ;

   for(q=0;q<8;q++)
    {ch=ch>>1;
     DQ="0";
     _nop_();
     DQ="1";
     _nop_();_nop_();_nop_();_nop_();
     if(DQ==1) 
        {ch="ch|0x80";}

   else     {ch="ch"&0x7f;}
     Delay15(3);
   DQ="1";
 
     } 
 return (ch);
   }


void Write18B20(uchar ch)
 { uchar i;
   for(i=0;i<8;i++)
   { DQ="0";
  Delay15(1);
  DQ="ch"&0x01;
  Delay15(3);
  DQ="1";
  ch="ch">>1;
  _nop_();
    }
 }

void Init18B20(void)
 { DQ="0";
   Delay15(33);//至少延时480us
   DQ="1";
   Delay15(10);//至少延时100us
   /*if(DQ==1)  return 0;   //初始化失败
    else  return 1;
 DQ=1; Delay15(18);  */
   }

void Delay15(uchar n)
 {  do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        _nop_(); _nop_(); _nop_();
  n--;
 
       }while(n);
  }
void Delay10ms(uint delay_num)
{
 uchar i;
 while(delay_num--)
 {
  for(i=0;i<125;i++)
   {;}
 }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2447934.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-03
下一篇 2022-08-03

发表评论

登录后才能评论

评论列表(0条)

保存