勘误:unsigned char temperature 改成 unsigned int temperatrue(作者unsigned char打多了)
一,流程和原理
说明:1.复位是程序的开始,重要的一步。
2.应该是总线上就挂了DS18B20,那就不需要寻找IP地址,直接跳过这一步,进行温度转换。
3.操作之前要输出控制字。 4.转换需要工作时间,即要用到延时函数。
4.关于CC指令和44和Be指令的由来,可以去查芯片资料:
这个数据处理更重要一点。1.大家对于原码——反码——补码之间的转换关系还记得吗?
原码是最简单的数字表示方法,即将一个数的绝对值转换成二进制数,然后在最高位上添加符号位。例如:-7的原码为1 0000111,+7的原码为0 0000111。
反码是在原码基础上对负数符号位之后的所有二进制数位取反得到的。例如:-7的反码为1 1111000,+7的反码为0 0000111。(正数的原码补码反码是一模一样的)
补码是在反码的基础上加1得到的。例如:-7的补码为1 1111001,+7的补码为0 0000111。
2.BIT15~11是符号位,全为1则为负,全为0则为正。3.这个分辨率应该是系数,乘完才是温度。(待定) 4.如果你有温度显示,但是显示的是八十多度,考虑实验失败。
二、手写代码
一、main
二、延时函数
记得在main.h里面进行外部声明。
三、uart配置
图片里面.c文件里面的代码借助软件可以自动生成,非常方便。
尤其重要的是,printf需要在uart里面重新定义putchar函数,不然就会像作者一样找半天不知道为什么上位机里啥都没有显示。这几行代码只要你看过上一个UART的文章就很容易看懂是将数据扔进SBUF寄存器,待到完整发送后,中断标志位TI置1;出循环后置零,得到的值c返回。
四、完善主办方给的底层驱动onewire文件
完善其实也就是将主办方的代码用记事本打开复制粘贴,再在头文件中声明要用的函数就行
还有一个DQ的引脚定义一下就行。
然后写完这个,其实就可以写那个温度转化和读取的函数了。如下图所示:
此处的根据就是封面的流程图,还是蛮简单的。(勘误:这里左边的温度函数,应该是
unsigned int temperature)(这里错写就会导致实验现象是一位数)
血的教训:切记先读取低八位!
下面是错误示范:
五、关闭dog叫的蜂鸣器
这个我写了不下三遍了,很轻松就能写出来,大家多练。
六、结尾
将我们写好的函数放到主函数里面去。
实验现象。