欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DS18B20专题二

程序员文章站 2022-07-12 10:54:25
...

DS18B20专题二

这是我编写DS18B20驱动程序时,遇到的问题,仅供自己以后少踩坑,踩同样的坑。

(1)怎样打印16进制的数据

// 打印搜索到的DS18B20的ROM  16进制数显示
os_printf("%2X ",DS18B20_ID_Buff[DS18B20_I][DS18B20_J]);

(2)搜索ROM

//中的参数Num不能去掉,会报错。
u8  DS18B20_SearchROM(u8 (*pID)[8],u8 Num);

(3)数组的下标不能为变量

//中数组的下标不能为变量。
unsigned char BUFFER[DS18B20_NUM-1]={0};

(4)搜出来的ROM是一样

u8 DS18B20_SearchROM(u8 (*pID)[8],u8 Num)  
{   
    unsigned char k,l=0,ConflictBit,m,n,i;  
    unsigned char BUFFER[MAXNUM-1]={0};  //****初始化栈顶值为0,这样就可以保证循环的判断****或者在循环外对 BUFFER[0]=0;
    unsigned char ss[64];
                unsigned char s=0;  
    u8 num = 0; 
    ...
    ...
    ...

(5)添加延时可以解决85℃的问题,但是会影响程序的执行,所以我屏蔽了。

 s16 ICACHE_FLASH_ATTR DS18B20_ReadDesignateTemper(u8 pID[8])
{
	u8 th, tl;
	s16 data;

	if(DS18B20_Reset() == FALSE)
	{
		return 0xffff;				//返回错误
	}

	DS18B20_WriteByte(0xcc);		//跳过读***
	DS18B20_WriteByte(0x44);		//启动温度转换
	delay_ms(750);//我自己添加的解决85摄氏度

(6)消除85℃,我就是利用的方法二

	//DS18B20开始
	os_printf("\r\n=================================================\r\n");
	DS18B20_Search_Num=DS18B20_SearchROM(DS18B20_ID_Buff,DS18B20_NUM);
	os_printf("总线上实际挂载DS18B20数量:%d\r\n",DS18B20_NUM);
	os_printf("总线上搜素到的DS18B20数量:%d\r\n",DS18B20_Search_Num);

	for(DS18B20_I = 0;DS18B20_I < DS18B20_Search_Num;DS18B20_I++)
	{
		os_printf("\r\n DS18B20 No%d ID: ",DS18B20_I);
		for(DS18B20_J = 0;DS18B20_J < 8;DS18B20_J ++)
		{
			os_printf("%2X ",DS18B20_ID_Buff[DS18B20_I][DS18B20_J]);//打印搜索到的DS18B20的ROM ,16进制数显示
		}
	}

	//消除85℃开始
	DS18B20_Reset();
	DS18B20_WriteByte(0xcc);		//跳过读***
	DS18B20_WriteByte(0x44);		//启动温度转换
	//消除85℃结束
	os_printf("\r\n=================================================\r\n");
	//DS18B20结束

(7)方便移植

//根据电路板上的DS18B20实际连接情况修改的内容(开始)
#define SET_DS18B20_PIN_OUTPUT PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13)//设置DS18B20为输出
#define SET_DS18B20_PIN_OUTPUT_LEVEL_1 GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 1)//DS18B20引脚输出高电平
#define SET_DS18B20_PIN_OUTPUT_LEVEL_0 GPIO_OUTPUT_SET(GPIO_ID_PIN(13), 0)//DS18B20引脚输出低电平
#define SET_DS18B20_PIN_INPUT PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13)//设置DS18B20引脚为输入
#define GET_DS18B20_PIN_LEVEL GPIO_INPUT_GET(GPIO_ID_PIN(13))//获得DS18B20引脚的电平
#define SET_DS18B20_PIN_OUTPUT_LEVE(bit) GPIO_OUTPUT_SET(GPIO_ID_PIN(13), bit & 0x01)//写入最低位
#define DELAY_FUNC(x) os_delay_us(x)//微秒时间
//根据电路板上的DS18B20实际连接情况修改的内容(结束)
相关标签: 温度