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

📄 ds18b20.c

📁 用超声波来测量距离
💻 C
字号:
#define DDR_DQ RC3
#define PIN_DQ IC3
#define POR_DQ OC3

unsigned char TEMP_int=0,TEMP_flo=0;
unsigned char TEMP_H=0,TEMP_L=0;
unsigned char TEMP[5]="  .  ";

/*----------------------
延迟子程序
0.5us
------------------------*/
void delay_1820(unsigned int i)	  
{
   while(--i);
}

/*----------------------------
初始化DS18B20

-----------------------------*/
void Init_DS18B20(void)
{
    while(1)
	{
	unsigned char flag=0;
	
	DDR_DQ=1; //设置为输出
    POR_DQ=0;    //低电平
    delay_1820(900);  //主机发出复位低电平480us~960us
	
    POR_DQ=1;		  //释放总线
    delay_1820(120);	  //等待回应-大概60us-240us后
	DDR_DQ=0;        //设置为输入
    flag=PIN_DQ;     //读取回应
	
    while(!PIN_DQ);
    if( flag ==0 )break;	  //初始化成功flag=0;
	}
}
/*----------------------------
写DS18B20

-----------------------------*/
void write_data(unsigned char dat)
{
   unsigned char i=8;
   DDR_DQ=1;             //设置为输出
   POR_DQ=1;
   for(;i>0;i--)
     {
      POR_DQ=0;			 //低电平开始
	  delay_1820(16);   //延时1us~15us  8us
      POR_DQ=dat&1;		
      delay_1820(120);	 //延迟一段时间给温度芯片采样数据60-120us
      POR_DQ=1;		     //释放总线
      dat>>=1;			 //下一位
      }
}
 /*----------------------------
 读DS18B20

-----------------------------*/
unsigned char read_data(void)
{
    unsigned char i=8,dat=0;
	DDR_DQ=1;            //设置为输出
    POR_DQ=1;                //拉高
    for(;i>0;i--)
      {
        dat>>=1;
        POR_DQ=0;		     //低电平开始
		delay_1820(10);     //延时1us~15us  5us
        POR_DQ=1;		    //释放总线
		
		DDR_DQ=0;         //设置为输入
        delay_1820(2);    //等待温度芯片发送数据
        if(PIN_DQ)dat|=0x80; //读取数据
        delay_1820(120);	  //延迟一段时间60~120us   
		DDR_DQ=1;         //设置为输入
		POR_DQ=1;	
       }
    return(dat);
}
 /*----------------------------
读温度子程序

-----------------------------*/
void Read_DS18B20(void)
{
   Init_DS18B20();	  //复位
   write_data(0xcc);  //跳过ROM匹配
   write_data(0x44);  //启动温度转换

   delay_1820(900);  //延迟一段时间

   Init_DS18B20();	  //复位
   write_data(0xcc);  //跳过ROM匹配
   write_data(0xbe);  //发出读温度指令

   TEMP_L=read_data();
   TEMP_H=read_data();
}

 /*----------------------------
显示温度子程序

-----------------------------*/
void display_DS18B20(unsigned char x,unsigned char y)
{
    TEMP_int=((TEMP_H<<4)&0xf0)|((TEMP_L>>4)&0x0f); //整数部分
    TEMP_flo=(unsigned char)((TEMP_L&0x0f)*0.625);//小数部分

    TEMP[0] = DataString[TEMP_int/10];
	TEMP[1] = DataString[TEMP_int%10];
	TEMP[3] = DataString[TEMP_flo];
	TEMP[4] = '\0';
	dispstr_12864(x,y,TEMP);
}

⌨️ 快捷键说明

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