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

📄 ds18b20.c

📁 Ds18b20+Fyd_12864的源程序
💻 C
字号:
#include "main.h"
//#include "reg52.h"

unsigned char Temperature_Lsm;
unsigned char Temperature_Msm;
sbit P1_0=P1^0;
float  Temperature_Buffer;                             	// 温度值的变量;
unsigned char Flag=0;                                    // 结果为负和正的标志位。		



void Delay (unsigned int count)
{           						
    unsigned int i;	
    while (count)	
    {
        i =200;
        while (i>0)
		 i--;
        count--;
    }
}



float Data_Process(unsigned char H_Temperature,unsigned char L_Temperature)
{
   	unsigned char i;
	unsigned char Temper;
	float Buffer_Float=0.0;

	Flag=H_Temperature&0x08;           		//若最高位为1则为负温
    if(Flag)
    {
	   H_Temperature=~H_Temperature+1;	  //如果为负温则取原码 /*采集的数据是用补码表示的*/
       L_Temperature=~L_Temperature+1;	  //如果为负温则取原码	/*采集的数据是用补码表示的*/
	 }	                      
  	else
	{
	 H_Temperature=H_Temperature;	  //如果为正温则保持
     L_Temperature=L_Temperature;	  //如果为正温则保持
	 }
   Temper=L_Temperature;

	  for(i=0;i<4;i++)
        {
           if(Temper&0x01)
            {
              Buffer_Float=Buffer_Float+(1.0/(1<<(4-i))); //计算小数值
			  Temper>>=1;
             }
           else
              Temper>>=1;
    
         }
	 L_Temperature>>=4;		                //高四位的值移道小数位去
	 H_Temperature=((H_Temperature<<4)&0x7f); //高字节的数据作移四位并把符号位清零
											  //以便与低字节的数据进行或操作
	 Buffer_Float=(H_Temperature|L_Temperature)+Buffer_Float;   //最后的温度值

    return (Buffer_Float);

   }


void Temperature_Reset(void)                              // 发送复位和初始化
{
    unsigned int i;
    P1_0 = 0;	
    i = 103;
    while (i>0) 
	i--;                    			// 延时
    P1_0 = 1;	
    i = 4;	
    while (i>0)
	 i--;	
}

bit Temperature_Readbit(void)                          	// 读取数据的一位
{ 
    unsigned int i;
    bit dat;
    P1_0 = 0;
	 i++;	
    P1_0 = 1; 
	i++; 
	i++;             			//延时	
    dat = P1_0;	
    i = 8;
	 while (i>0)
	  i--;             			// 延时
    return (dat);
}   

unsigned char Temperature_Readchar(void)                       //读一个字节
{
    unsigned char i,j,dat;	
    dat = 0;	
    for (i=1;i<=8;i++)
    {
        j =Temperature_Readbit();	
        dat = (j << 7) | (dat >> 1);	
    }
    return (dat);
}   

void Temperature_Write(unsigned char dat)                   //写一个字节
{   
    unsigned int i;
    unsigned char j;
    bit testb;	
    for (j=1;j<=8;j++)
    {	
        testb = dat & 0x01;
        dat = dat >> 1;	
        if (testb)
    	{	
            P1_0 = 0;       				// 写0 
            i++; 
			i++;  
            P1_0 = 1;	
            i = 8; 
			while (i>0)
			i--; 
    	}
        else	
    	{
            P1_0 = 0;       				// 写0 
            i = 8;
			 while (i>0)
			  i--; 
            P1_0 = 1;
            i++;
			 i++;  
    	}
    }
}

void Temperature_Change(void)                            // ds1820 开始转换
{  
    Temperature_Reset();             				// 复位
    //tmpre ();                     		// 等待存在脉冲	
    Delay (1);              				// 延时
    Temperature_Write(0xcc);                        	// 跳过序列号命令
    Temperature_Write(0x44);                        // 发转换命令 44H,	
}

void Read_Temperature(void)                     		// 读取温度
{ 
    Temperature_Reset();             				// 复位
    Delay (1);              				        // 延时
    Temperature_Write(0xcc);                        // 跳过序列号命令
    Temperature_Write(0xbe);                    	// 发送读取命令
    Temperature_Lsm= Temperature_Readchar();        // 读取低位温度	
    Temperature_Msm= Temperature_Readchar();		//读取高位温度
	Temperature_Buffer=Data_Process(Temperature_Msm,Temperature_Lsm);  //进行整数和小数的处理	
}


⌨️ 快捷键说明

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