⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 温度计.c

📁 基于AT89C2051单片机控制DS18B20传感器的数字温度计
💻 C
字号:

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^0;                         
uchar flag1;                     
uchar tempL=0; 
uchar tempH=0; 
uint tt;
float temperature;              
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; 
uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};  
uchar code scan_con[4]={0x01,0x02,0x04,0x08};  
uchar data Dis_play[4]={0X00,0x00,0x00,0x00};

 void delay(uint i)    
   {
      while(i--);
   }
 Init_DS18B20(void)
  {
     uchar x=0;
     DQ = 1;               //DQ复位
     delay(8);        
     DQ = 0;               //单片机将DQ拉低
     delay(80);            //精确延时 大于 480us
     DQ = 1;               
     delay(14);
     x=DQ;                 //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
     delay(20);
  }


//           读字节子函数                    

 ReadOneChar(void)
  {
     uchar i = 0;
     uchar dat = 0;
   for (i=8;i>0;i--)
    {
      DQ = 0;              
      dat>>=1;             // 数据右移一位
      DQ = 1;             
      if(DQ)               // DQ为1
      dat|=0x80;          // 读出数据
      delay(4);       
     }
   return(dat);
  }

//             写字节子函数                   

 WriteOneChar(unsigned char dat)
  {
     uchar i = 0;
     for (i=8; i>0; i--)
	     {
	       DQ = 0;
	       DQ = dat&0x01;   //写入一位数据
	       delay(5);
	       DQ = 1;
	       dat>>=1;       
	     }
  }


//       发送温度转换命令               
ReadTemperature(void)

{ 
		Init_DS18B20(); 
		WriteOneChar(0xcc); 
		WriteOneChar(0x44); //启动温度转换
		delay(125); 
		Init_DS18B20();
		WriteOneChar(0xcc); //跳过读序列号的操作
		WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
		tempL=ReadOneChar(); 
		tempH=ReadOneChar(); 
        if(tempH>0xfd)
		{
		    flag1=1;
		    temperature=(65536-((tempH*256)+tempL))*0.0625; 
			tt=temperature*10+0.5;
			delay(200);
			return(tt); 
		}		
		else
		{
			temperature=((tempH*256)+tempL)*0.0625;  
			tt=temperature*10+0.5;
			delay(200);
			return(tt);
		}
}
 void	 tem_deal(uint tem)
 	  
  {     
		 Dis_play[0]=0xff;
		 Dis_play[0]=tem/1000;  
		 Dis_play[1]=tem/100%10;    
	     Dis_play[2]=tem%100/10;
	     Dis_play[3]=tem%10;
	                         
	   if(!Dis_play[0])       
		   {
		      Dis_play[0]=0x0a;   
		      if(!Dis_play[1])
			   {
			     Dis_play[1]=0x0a; 
			   }
		   }
	   if(flag1)
		   {
		      Dis_play[0]=0x0b;   
		   }  
  }

 void display()
  {
       char k;
         for(k=0;k<4;k++)                    
			  {				
			  	 if (k==2)
				    {   
					  	 P2=scan_con[k];                
					     P0=table1[Dis_play[k]];        
					 }
				 else
				     {
					      P2=scan_con[k];                 
					      P0=table[Dis_play[k]];          
					 }	                     
			     delay(500);                         
			  }
  }



 void main()
 {
   do
   {
      flag1=0;
     tem_deal(ReadTemperature()); 
     display();
   }
     while(1);
 }






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -