本人使用的板子为stm32l476rg,但是测出来的温度一直出现错误,想问问有没有符合ds18b20在keil中编译符合的头文件和相关文件
5条回答 默认 最新
关注 获得2.70元问题酬金 是不是读写延时太短,导致温度传感器反应不过来?以下程序我使用过,没有问题,可直接复制:
//温度采集模块 /******************************************************************************/ void Init_DS18B20()//初始化ds1820 { unsigned char x=0; DQ = 1; //DQ复位 tmpDelay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 tmpDelay(80); //精确延时 大于 480us DQ = 1; //拉高总线 tmpDelay(14); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 tmpDelay(20); } unsigned char ReadOneChar()//读一个字节 { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; tmpDelay(4); } return(dat); } void WriteOneChar(unsigned char dat)//写一个字节 { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; tmpDelay(5); DQ = 1; dat>>=1; } } unsigned int Readtemp()//读取温度 { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //连续读两个字节数据 //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; //两字节合成一个整型变量。 tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度 t= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。 return(t); }
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 shape_predictor_68_face_landmarks.dat
- ¥15 slam rangenet++配置
- ¥15 有没有研究水声通信方面的帮我改俩matlab代码
- ¥15 对于相关问题的求解与代码
- ¥15 ubuntu子系统密码忘记
- ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
- ¥15 保护模式-系统加载-段寄存器
- ¥15 电脑桌面设定一个区域禁止鼠标操作
- ¥15 求NPF226060磁芯的详细资料
- ¥15 使用R语言marginaleffects包进行边际效应图绘制