数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 8648|回复: 49

[other] 不使用单片机!USB转串口直接读取DS18B20

[复制链接]
发表于 2020-3-30 16:24:36 | 显示全部楼层 |阅读模式
本帖最后由 liccil 于 2020-3-30 19:02 编辑

昨天晚上突发奇想,能不能用UART串口直接读写DS18B20呢
毕竟电平一致,例如空闲时为高电平,串口的起始位正好用于读写单总线器件。串口利用波特率发生器可以构造准确的延时,
通过改变串口波特率,或者构造特殊序列去模拟单总线信号。
中午午休时间简单试验了一下 成功了。
硬件原理如下:一片USB转CP2102的U转串小板,DS18B20一枚,一个1N4148二极管。因为CP2102的TXD为推挽模式,为了避免电平冲突,需要
加一个1N4148。
利用RXD天生的上拉电阻当接收,拉高DS18B20。

接下来就是用示波器 调波特率;
网上找的图,这个是UART串口的波形图:

当发送一个byte时,uart实际输出的是带起始位0和停止位1的。
我们可以利用起始位和停止位,和发送的数据,一起拼凑出需要的波形;
例如DS18B20复位命令,可以使用38400bps,停止位1bit,连续发送两个字节0x00和0xff;
0x00正好就是DS18B20的复位长脉冲;发送后电平被停止位自动拉高;此时DS18B20会自行拉低,表示自己的存在;
后面跟了个0xff,是串口输出高电平;但此时被DS18B20拉住了一段时间,所以发送0xff 回读实测是0xfe(串口是先发送、接收LSB)。由于串口与DS18B20是异步的,因此回读具体是什么
取决于波特率,与DS18B20本身的延时。但肯定不是0xff。
我们可以根据这个判断DS18B20是否存在。当然,波特率不能太高或太低,否则无法拼凑出合适的时间。

上图就是用示波器看DS18B20的复位波形;因为有TXD串联的二极管压降,所以DS18B20在拉低时波形更低。

发命令时,波特率需要提升至115200bps;如上图所示,要给DS18B20发1直接串口发0xFF,发0就发0x00;
上图为给DS18B20发送0xCC,即跳过ROM命令。

读取时也很简单。DS18B20回读时是2字节,因此可以串口发送2*8=16个0xff。
串口自行发送起始位/停止位,这让上位机的编程非常方便,只发送串口数据即可。延时的问题直接波特率发生器搞定。
写0xff后 如果回读的值不是0xff,那就表示DS18B20拉低了,如果还是0xff,那就是高。

中午利用剩余时间胡乱写了个C#的小程序,可以正常读取温度了。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 5家元 +61 收起 理由
飞向狙沙 + 20 優秀文章
cxw0102 + 20 原創內容
qrut + 10 優秀文章
人艰不拆了 + 10
mousebat04 + 1 果然会玩

查看全部打赏

发表于 2020-3-30 17:04:12 | 显示全部楼层
牛啊,来个Python程序是不是更方便?:titter:画个小电路图呗。
回复 支持 反对

使用道具 举报

发表于 2020-3-30 17:05:24 | 显示全部楼层
哈哈,自己跟自己过不去啊:titter:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 17:06:57 | 显示全部楼层
人艰不拆了 发表于 2020-3-30 17:05
哈哈,自己跟自己过不去啊

尝试Geek一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 17:09:10 | 显示全部楼层
kindzhon 发表于 2020-3-30 17:04
牛啊,来个Python程序是不是更方便?画个小电路图呗。

Python应该更方便。不过我还不熟Py 其实C#也不熟 纯瞎写
电路简单 GND接GND 3.3V接VCC DQ接RXD RXD和TXD接个二极管 RXD正 TX负 没了
回复 支持 反对

使用道具 举报

发表于 2020-3-30 17:12:56 | 显示全部楼层
脑洞大开,好牛B!
回复 支持 反对

使用道具 举报

发表于 2020-3-30 17:13:59 来自手机浏览器 | 显示全部楼层
这个方案几年前就有了,串口、SPI都行。
因为普通方法读取过程不能开中断,而一些场合又不允许关中断,所以就有人想出来这样的方法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-30 17:15:23 | 显示全部楼层
bxak 发表于 2020-3-30 17:13
这个方案几年前就有了,串口、SPI都行。
因为普通方法读取过程不能开中断,而一些场合又不允许关中断,所以 ...

学习了 以前没玩过 发现这个方式其实比普通io操作更方便一些
回复 支持 反对

使用道具 举报

发表于 2020-3-30 17:48:20 | 显示全部楼层
liccil 发表于 2020-3-30 17:15
学习了 以前没玩过 发现这个方式其实比普通io操作更方便一些

这样子相当于变相实现了一个1-wire总线的硬件接口,减少了软件模拟协议的开销。
你可以更进一步,写个通用库发布,使用MCU的USART进行1-wire通信,很多人会感谢你的。
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-30 21:44:06 | 显示全部楼层
la45088d1 发表于 2020-3-30 17:48
这样子相当于变相实现了一个1-wire总线的硬件接口,减少了软件模拟协议的开销。
你可以更进一步,写个通 ...

波特率要变来变去,还要保证高速的波特率,不是所有的单片机都支持的。测个温度搞这么麻烦,用NTC不好吗?
回复 支持 反对

使用道具 举报

发表于 2020-3-30 21:47:39 | 显示全部楼层
595953427@qq 发表于 2020-3-30 21:44
波特率要变来变去,还要保证高速的波特率,不是所有的单片机都支持的。测个温度搞这么麻烦,用NTC不好吗 ...

你试试呗,能做到DS18B20的精度?
人家器件卖4-5RMB一个,如果比不过几毛钱的NTC,人家早就倒闭了。
连STC这种垃圾MCU都可以随便设置波特率,哪个MCU不行?
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-30 22:04:03 | 显示全部楼层
有点意思,脑洞大开,示波器存储深度好差啊~
回复 支持 反对

使用道具 举报

发表于 2020-3-30 22:17:26 | 显示全部楼层
la45088d1 发表于 2020-3-30 21:47
你试试呗,能做到DS18B20的精度?
人家器件卖4-5RMB一个,如果比不过几毛钱的NTC,人家早就倒闭了。
连ST ...

我说的不是所有单片机都支持高速的波特率,不是说不支持任意设置波特率。
基本上所有单片机只要在上限波特率之下都可以任意设置,但是上限波特率不一定可以上到38400。
应用场景不同吧,我见过的绝大多数产品上都是用NTC测温度,只在开发板上见过用18B20测温度的。
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-31 11:08:46 | 显示全部楼层
595953427@qq 发表于 2020-3-30 22:17
我说的不是所有单片机都支持高速的波特率,不是说不支持任意设置波特率。
基本上所有单片机只要在上限波 ...

38400不是很简单么?一般不读跑115200?
回复 支持 反对

使用道具 举报

发表于 2020-3-31 12:55:07 | 显示全部楼层
你这非人类的操作,让我无尽的佩服:lol:
回复 支持 反对

使用道具 举报

发表于 2020-4-2 21:18:28 | 显示全部楼层
la45088d1 发表于 2020-3-30 21:47
你试试呗,能做到DS18B20的精度?
人家器件卖4-5RMB一个,如果比不过几毛钱的NTC,人家早就倒闭了。
连ST ...

看清楚,他不是楼主。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-3 09:38:50 | 显示全部楼层
cxw0102 发表于 2020-4-2 21:18
看清楚,他不是楼主。

看来默认头像有风险哈
回复 支持 反对

使用道具 举报

发表于 2020-4-6 17:57:00 | 显示全部楼层
串口怼18B20,老话题了。
美信官网就有一篇2002年的文章说明原理,
gayhub上有C代码,
MicroPython直接内置。

回复 支持 反对

使用道具 举报

发表于 2020-4-15 16:58:35 | 显示全部楼层
595953427@qq 发表于 2020-3-30 22:17
我说的不是所有单片机都支持高速的波特率,不是说不支持任意设置波特率。
基本上所有单片机只要在上限波 ...

工业上的测温环境大多用的18B20,例如隧道,煤炭,冷库。单总线一下接几十个,施工简单。我们有这个产品
回复 支持 反对

使用道具 举报

发表于 2020-4-16 08:47:41 | 显示全部楼层
这tm是个人才,
还是ch551这样的芯片香
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 05:09 , Processed in 0.187200 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表