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

📄 ds18b20.c

📁 very useful to pactising ps2 keyboard
💻 C
字号:
//适用于11.0592M的晶振,为其他的频率则需要修改延时时间

void tem_Delay(unsigned int tc)            //显示延时程序
{
  while( tc != 0 )	
	{
	 unsigned int i;	
	 for(i=0; i<100; i++);
	 tc--;
	}
}


void tem_dmsec (unsigned int count)       //延时部分
 {   
	unsigned char i;
	while(count--)
	 {
	  for(i=0;i<115;i++);
	 } 
 }   
 
     
void tmreset (void)                       //发送复位
{                               
	unsigned char i;
	tem_conDAT=0;     
	for(i=0;i<103;i++); 
	tem_conDAT = 1;       
	for(i=0;i<4;i++); 
}   

      
bit tmrbit (void)                        //读一位
 {                            
	 unsigned int i;       
	 bit dat;      
	 tem_conDAT = 0;
	 i++;       
	 tem_conDAT= 1; 
	 i++; i++;                          //微量延时
	 dat =tem_conDAT;     
	 for(i=0;i<8;i++); 
	 return (dat);      
 }      
 
  
unsigned char tmrbyte (void)            //读一个字节
  {                 
	 unsigned char i,j,dat;      
	 dat = 0;       
	 for (i=1;i<=8;i++)      
	 {        
	  j = tmrbit();      
	  dat = (j << 7) | (dat >> 1);    
	 }        
	 return (dat);       
  }     
  
  
void tmwbyte (unsigned char dat)       //写一个字节
{                       
	 unsigned char j,i;      
	 bit testb;       
	 for (j=1;j<=8;j++)      
	 {       
	  testb = dat & 0x01;     
	  dat = dat >> 1;      
	  if (testb)     
	   {  
	      tem_conDAT = 0;             //写0  
		  i++; i++;                              
		  tem_conDAT = 1;    
		  for(i=0;i<8;i++); 
	    }       
	  else       
	   {  
	      tem_conDAT = 0;             //写0 
	      for(i=0;i<8;i++); 
	  	  tem_conDAT = 1;     
	      i++; i++;                              
	   }       
     }        
}  


void tmstart (void)                  //发送ds1820 开始转换
  {                          
 	tmreset();                       //复位     
 	tem_dmsec(1);                    //延时    
 	tmwbyte(0xcc);                   //跳过序列号命令   
 	tmwbyte(0x44);                   //发转换命令44H,
  }         

void tmrtemp (void)                  //读取温度
    {                          
		unsigned char a,b; 
		tmreset ();                  //复位     
		tem_dmsec (1);               //延时     
		tmwbyte (0xcc);              //跳过序列号命令   
		tmwbyte (0xbe);              //发送读取命令     
		a = tmrbyte ();              //读取低位温度    
		b = tmrbyte ();              //读取高位温度           
		if(b>0x7f)                   //最高位为1时温度是负
		{
		 a=~a;                       //补码转换,取反加一
		 b=~b+1;       
		 temfg=0;                    //读取温度为负时temfg=0
        }
		temsdata = a/16+b*16;              //整数部分 上电时精度缺省为12位,b中为整数高位,a中高四位为整数位
        temsdata1=temsdata/10;             //整数十位
        temsdata2=temsdata%10;             //整数个位
		temxiaoshu1 = (a&0x0f)*10/16;      //小数第一位,注小数部分的计算,a的低4位为小数位,最大为15,对应99,
		temxiaoshu2 = (a&0x0f)*100/16%10;  //小数第二位                                         这个过程有转换
		temxiaoshu=temxiaoshu1*10+temxiaoshu2;   //小数两位
}  


void DS18B20(void)         
{    
  tmstart();   
  temfg=1;                                //作为子函数被调用时,temfg需要初始化   
  tmrtemp();                	          //读取温度,执行完毕温度将存于TMP中 //
}

⌨️ 快捷键说明

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