kasjlkajd

  • 2024-12-13
  • 回复了主题帖: DS18B20在CH32V307上一直初始化失败

    串口助手一直显示“DS18B20设备不存在!”,请问是什么原因?

  • 发表了主题帖: DS18B20在CH32V307上一直初始化失败

    int main(void) { u16 temp; int i; // USARTx_Init(USART1,72,115200);//串口1的初始化 USART_Printf_Init(115200); DS18B20_Init(); //DS18B20初始化 /*1. 读取DS18B20的64位ROM编码*/ //发送复位脉冲、检测存在脉冲 while(DS18B20_CheckDevice()) { printf("DS18B20设备不存在!\n"); Delay_Ms(500); } //发送读取64为ROM编码的命令 printf("chu"); DS18B20_WriteByte(0x33); //循环读取64位ROM编码 for(i=0;i<8;i++) { DS18B20_ROM[i]= DS18B20_ReadByte(); printf("DS18B20_ROM[%d]=0x%X\n",i,DS18B20_ROM[i]); } while(1) { /*2. 同时操作总线上所有的DS18B20开始转换温度*/ DS18B20_CheckDevice(); //发送复位脉冲、检测存在脉冲 DS18B20_WriteByte(0xCC); //跳过ROM序列检测 DS18B20_WriteByte(0x44); //启动一次温度转换(让总线上所有的DS18B20都转换温度) Delay_Ms(500); //等待线上所有的DS18B20温度转换完成 /*3. 单个针对性读取每个DS18B20的温度*/ DS18B20_CheckDevice(); //发送复位脉冲、检测存在脉冲 DS18B20_WriteByte(0x55); //发送匹配ROM的命令 for(i=0;i<8;i++) //发送64位编码 { DS18B20_WriteByte(DS18B20_ROM[i]); } DS18B20_WriteByte(0xBE); //读取温度 temp=DS18B20_ReadByte(); //读取的温度低位数据 temp|=DS18B20_ReadByte()<<8; //读取的温度高位数据 printf("temp1=%d.%d\n",temp>>4,temp&0xF); printf("temp2=%f\n",temp*0.0625); Delay_Ms(500); } } void DS18B20_Init(void) { RCC->APB2PCENR|=1<<3; //PB GPIOB->CFGHR&=0x0FFFFFFF; GPIOB->CFGHR|=0x30000000; GPIOB->OUTDR|=1<<15; //上拉 } /* 函数功能: 检测DS18B20设备是否存在 返回值 : 1表示设备不存在 0表示设备正常 */ u8 DS18B20_CheckDevice(void) //包含了复位脉冲、检测存在脉冲 { DS18B20_OUTPUT_MODE();//初始化为输出模式 DS18B20_OUT_RESET(); Delay_Us(750); //产生750us的低电平 DS18B20_OUT_SET(); Delay_Us(15); //等待DS18B20回应 if(DS18B20_CleckAck())//检测存在脉冲 { return 1; }//检测到了脉冲 return 0; } /* 函数功能: 检测DS18B20设备的存在脉冲 返回值 : 1表示错误 0表示正常 */ u8 DS18B20_CleckAck(void) { u8 cnt=0; DS18B20_INPUT_MODE();//初始化为输入模式 while(DS18B20_IN&&cnt<200) //等待DS18B20响应存在脉冲 { Delay_Us(1); cnt++; } if(cnt>=200)return 1; //错误 else cnt=0; while((!DS18B20_IN)&&cnt<240) //等待DS18B20释放总线 { Delay_Us(1); cnt++; } if(cnt>=240)return 1; //错误 return 0; } void Delay_Us(uint32_t n) { uint32_t i; SysTick->SR &= ~(1 << 0); i = (uint32_t)n * p_us; SysTick->CMP = i; SysTick->CTLR |= (1 << 4); SysTick->CTLR |= (1 << 5) | (1 << 0); while((SysTick->SR & (1 << 0)) != (1 << 0)) ; SysTick->CTLR &= ~(1 << 0); }  

最近访客

现在还没有访客

< 1/0 >

统计信息

已有--人来访过

  • 芯积分:19
  • 好友:--
  • 主题:1
  • 回复:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言