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

📄 ds18b20.c

📁 自己学习PIC单片机时改写的DS18b20程序
💻 C
字号:
#include"DS18B20.h"
uchar temp_data[2]={0x00,0x00};               // 读出温度暂放
uchar display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用
uchar flag=0;//标志
uchar doth,dotl;//显示小数部分
///*******温度小数部分用查表法**********//
const uchar ditab[16]={0,6,13,18,25,31,38,44,50,56,63,69,75,81,88,94};
	
//*****************DS18B20复位函数****************************//
void DS18B20_RESET(void)
{
 char presence=1;
 while(presence)
 {
   while(presence)
   {
	DQ_HIGH();NOP();NOP();
	DQ_LOW();    //
	DelayUs(550); // 550us
	DQ_HIGH();   // 
	DelayUs(65);  // 66us
	presence=DQ; // presence=0继续下一步
   }
  DelayUs(498);    //延时500us
  //presence =~DQ;
  if(DQ)
   presence = 0;
   else
    presence = 1;
 }
 DQ_HIGH();
}

//*****************DS18B20写命令函数****************************//
void DS18B20_WRITE_BYTE(uchar val)
{
 uchar i;
 for (i=8; i>0; i--) //
 {
  DQ_HIGH();NOP();NOP(); 
  DQ_LOW();NOP();NOP();NOP();NOP();NOP();//5us
  DQ = val&0x01;      //最低位移出
  DelayUs(65);           //66us
  val=val/2;          //右移一位
}
 DQ_HIGH();
 DelayUs(11);   
}


//*****************DS18B20读一字节函数****************************//
uchar DS18B20_READ_BYTE(void)
{
 uchar i;
 uchar value = 0;
 for (i=8;i>0;i--)
 {
  DQ_HIGH();NOP();NOP();
  value>>=1;
  DQ_LOW();             //
  NOP();NOP();NOP();NOP();   //4us
  DQ_HIGH();NOP();NOP();NOP();NOP();   //4us 
  if(DQ)value|=0x80;
  DelayUs(65);           //66us
 }
 DQ_HIGH();
 return(value);
}

//***********读出温度函数**********/
void DS18B20_READ_TEMP()
{
DS18B20_RESET();       //总线复位
DS18B20_WRITE_BYTE(0xCC); // 发Skip ROM命令
DS18B20_WRITE_BYTE(0xBE); //  发读命令
temp_data[0]=DS18B20_READ_BYTE();  //温度低8位
temp_data[1]=DS18B20_READ_BYTE();  //温度高8位
DS18B20_RESET();
DS18B20_WRITE_BYTE(0xCC); // Skip ROM
DS18B20_WRITE_BYTE(0x44); // 发转换命令
}


///***********温度数据处理函数**********/
void work_temp()
{
	uchar n = 0;
	
	uchar flag3 = 1,flag2 = 1;       //数字显示修正标记
	if((temp_data[1]&0xf8)!= 0x00)
	 {
		 temp_data[1] = ~(temp_data[1]);
		 temp_data[0] = ~(temp_data[0])+1;
		 n = 1;
		 flag = 1;
	 }//负温度求补码
	 if(temp_data[0] > 255)
	 {
	 	temp_data[1]++;	
	 }
	display[4] = temp_data[0]&0x0f;
	display[0] = ditab[display[4]];
	doth = display[0]/10;
	dotl = display[0]%10;
	display[4] = ((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4);
	display[3] = display[4]/100;
	display[2] = display[4]/10%10;
	display[1] = display[4]%10;
	if(!display[3])
		{
			display[3] = 0x0a;
			flag3 = 0;
			if(!display[2])
			{
				display[2] = 0x0a;
				flag2= 0 ;
			}
		}//最高位为0时都不显示
	if(n)
	{
		display[3] = 0x0b;//负温度时最高位显示"-"
		flag3 = 0;
	}
}

⌨️ 快捷键说明

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