矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: pdshyh

请教C52单片机DS18B20温度传感器串口显的制作

[复制链接]
     
 楼主| 发表于 2019-2-25 09:38:38 | 显示全部楼层
washu 发表于 2019-2-24 15:52
CH340、PL2303、FT232...都是 USB 总线上的 UART(TTL)转换芯片,装好之后系统中直接多出一个串口(TTL  ...

      washu 老师好,前一段时间一直根据您提供的测量例程弄Visual Studio 的VB,我是用单片机能进行测量就行,在看主要是编写程序Keil软件很方便下载安装使用和Protues ISIS 软件做简单流水灯仿真挺直观,就先弄了个最便宜的STC52,还有通过看流水灯和DS18b20读写例程还基本看懂了。
     串口和DS18b20可以通过示波器图形来观察,示波器还可以这样用知道了,就是 需要的示波器还没有。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-25 10:38:16 | 显示全部楼层
本帖最后由 pdshyh 于 2019-2-25 11:55 编辑
washu 发表于 2019-2-24 15:56
简单讲,如果实在搞不定 UART,可以在程序里反复发送 0x00,0xff,0xf0,0x0f,0xaa,0x55 这些玩意,因为 ...


     谢谢,这几个数字二进制挺规矩,好记。我的第一片小系统单片机, STC52.jpg 先玩着,上位机用vb刚刚接触虽不顺利也在门槛了,能简单比葫芦画瓢,原来是比葫芦画葫芦 有进步,单片机用兼容VB的AVR或Arduino也是比较连贯方便,刚刚下载Arduino for VS 的插件,您能否将 FastAVR例程或其他简单AVR应用例程提供参考,使用单片机vb编程在应用中又少不了讨饶了,老麻烦都有点不好意思了。插件Visual.Micro.Arduino.Studio.vsix安装老是不成功部分安装未完成,谢谢支持和帮助。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-25 11:43:53 | 显示全部楼层
本帖最后由 pdshyh 于 2019-2-25 11:46 编辑
gxg0000 发表于 2019-2-24 20:15
单片机、晶振和模拟终端参数设置了吗?
C1、C2和C3都大了点?复位电路也有问题,RST一直高电平(红色 ...


     gxg0000 您好,谢谢您的帮助,和您提供的例程晶振设置对比,在元件值是空白已经补上,其他电容电阻值已经参照您的例程修改,根据washu老师建议我增加示波器,在输出和DS18b20输入连接波形和温度有关联,是否还差一个脉冲信号转换为数字信号部分东西。RST还是一直高电平红色。
示波器上面的是输出,下面的是输入。
0.1波形.png
0波形.png
1.0波形.png
回复 支持 反对

使用道具 举报

     
发表于 2019-2-25 14:00:15 | 显示全部楼层
pdshyh 发表于 2019-2-25 11:43
gxg0000 您好,谢谢您的帮助,和您提供的例程晶振设置对比,在元件值是空白已经补上,其他电容电 ...

你现在的问题是串口终端收到不正确信息,先不管 18b20 先,看串口,然后在程序中反复发送我刚才说的那些,其实你应该想得到它们对应的波形啥样了 这样就能先解决串口通讯问题,然后如果 18b20 那边不对才去看它的波形。

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-25 15:12:01 | 显示全部楼层
washu 发表于 2019-2-25 14:00
你现在的问题是串口终端收到不正确信息,先不管 18b20 先,看串口,然后在程序中反复发送我刚才说的那些 ...

谢谢washu老师指教,知道了,我先找相关指令这么写在试。
回复 支持 反对

使用道具 举报

     
发表于 2019-2-26 09:57:02 | 显示全部楼层
本帖最后由 gxg0000 于 2019-2-26 10:18 编辑
pdshyh 发表于 2019-2-25 11:43
gxg0000 您好,谢谢您的帮助,和您提供的例程晶振设置对比,在元件值是空白已经补上,其他电容电 ...


楼主刚入慢慢来,首先搭建调试平台,建立Keil与Protues联调,如果是GCC编译器,则会生成elf调试文件,可直接在Protues内仿真调试,设置断点,单步或全速运行,非常方便。
程序语法错误,编译器会告诉你的,逻辑错误只能靠仿真发现了,不设置断点,怎么能够知道送入串口数据寄存器里是什么东西?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-26 10:54:24 | 显示全部楼层
gxg0000 发表于 2019-2-26 09:57
楼主刚入慢慢来,首先搭建调试平台,建立Keil与Protues联调,如果是GCC编译器,则会生成elf调试文件, ...

谢谢,Keil与Protues联调过去看到帖子提到不知可以软件相连,已经设置可以联调了。设置断点,单步等等还在学习,单片机工作原理去年看过还有点模糊,在温习。
回复 支持 反对

使用道具 举报

     
发表于 2019-2-26 11:16:22 | 显示全部楼层
本帖最后由 gxg0000 于 2019-2-26 11:25 编辑
pdshyh 发表于 2019-2-26 10:54
谢谢,Keil与Protues联调过去看到帖子提到不知可以软件相连,已经设置可以联调了。设置断点,单步等等还 ...


非常好,很多学习单片机的,学了一年原地踏步,不知道仿真的重要性,动不动下载板子,没有必要。
搞点单一简单的程序练练手,设置断点,多观察重要变量运行情况,如果看不到,可将变量临时设置为全局变量。
很多编译器设置不当,编译时会将很多它认为无用的变量优化掉,不单步调试你是更本发现不了的
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-26 14:27:52 | 显示全部楼层
本帖最后由 pdshyh 于 2019-2-26 14:57 编辑
gxg0000 发表于 2019-2-26 11:16
非常好,很多学习单片机的,学了一年原地踏步,不知道仿真的重要性,动不动下载板子,没有必要。
搞点 ...


       谢谢您的鼓励,一直是工科,总想弄明白工作原理有点钻牛角尖 ,单片机上位机都刚刚接触,比较吃力,看到您的例程对比串口显示温度程序,后者只有发送没有接收参照增加上,您提到复位电路也有问题,RST一直高电平(红色),电路图修改还是老样,软件设置问题还是电路问题。运行您的例程发现输入字符或数字和键盘有些不一致,键盘键入1,显示31 31  看led灯左4灯显示3右4灯显示1,从窗口输入可以模拟为pc输入。
      问题刚刚找到电阻属性问题,不解?两个电阻都要修改为digital(翻译为数字的那一个为模拟)。按复位键不影响输入输出图形。
Rst.png
回复 支持 反对

使用道具 举报

     
发表于 2019-2-26 19:48:33 | 显示全部楼层
本帖最后由 gxg0000 于 2019-2-26 20:05 编辑
pdshyh 发表于 2019-2-26 14:27
谢谢您的鼓励,一直是工科,总想弄明白工作原理有点钻牛角尖 ,单片机上位机都刚刚接触,比较 ...


键盘敲入的是字符ASCII码,"1"等价0x31,模拟终端上显示ASCII编码
鼠标右键点击模拟终端,下拉菜单选择取消“Hex DispLay Mode”勾选,则显示字符。
Image 1.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-27 09:42:45 | 显示全部楼层
gxg0000 发表于 2019-2-26 19:48
键盘敲入的是字符ASCII码,"1"等价0x31,模拟终端上显示ASCII编码
鼠标右键点击模拟终端,下拉菜单选 ...

谢谢您,知道ASCII编码,搜百度原来是这样的,按您说的菜单选择,对上号了,在请教一个问题,温度测量程序发到串口波形和DS18B20显示是有关联,是应该显示数字还是需要增加程序变把波形读为数字。
回复 支持 反对

使用道具 举报

     
发表于 2019-2-27 10:41:42 | 显示全部楼层
pdshyh 发表于 2019-2-27 09:42
谢谢您,知道ASCII编码,搜百度原来是这样的,按您说的菜单选择,对上号了,在请教一个问题,温度测量程 ...

不要去看数据波形,那个意义不大,而且有难度。
你只要保证送到串口数据寄存器的数据正确,数据就能正确发出,你可以在程序发送前设置断点看一下发送数据内容。
注意波特率和主频设置要一致
回复 支持 反对

使用道具 举报

     
发表于 2019-2-27 16:05:43 | 显示全部楼层
pdshyh 发表于 2019-2-27 09:42
...温度测量程序发到串口波形和DS18B20显示是有关联,是应该显示数字还是需要增加程序变把波形读为数字


这里有两个总线,

1、1Wire Bus,是 18b20 的总线,你找到的代码中 Ds_Write 或 WriteOneChar、Ds_Read 或 ReadOneChar 部分将波形和数据结合起来

2、UART Bus,是串口的总线,一般单片机都有硬件 UART,具体你那个什么地方负责输出我就不清楚了


1W 总线,用脉冲的高低电平宽度不同代表 0 和 1,比如这是写总线波形,以我的程序为荔枝,代码如下:


  1. void Write1Wbus(unsigned char bDat)
  2. {
  3.         OneWireBus_DDR_SetWrite();
  4.         for (volatile unsigned char k = 0; k < 8; k = k + 1)
  5.         {
  6.                 OneWireBus_Write_LOW();
  7.                 _delay_us(10);
  8.                 if (bDat & 0b00000001)
  9.                 {
  10.                         OneWireBus_Write_HIGH();
  11.                 }
  12.                 else
  13.                 {
  14.                         //OneWireBus_Write_LOW();
  15.                 }
  16.                 bDat = bDat >> 1;
  17.                 _delay_us(60);
  18.                 OneWireBus_Write_HIGH();
  19.                 _delay_us(10);
  20.         }
  21. }
复制代码

这个代码的意思就是,拉低总线 10us 后,如果要写 0,就继续保持 60us 低电平;如果要写 1 就将总线拉高并保持 60us。然后,将总线拉高 10us 进行恢复。所以,我们根据这个意思看这个波形图,从总线(黄色)第一次被拉低开始,第一次持续了超过 60us 时间,然后恢复为高电平并保持 10us,显然这是一个 0 位;然后重复这个过程,还是 0;第三位开始,总线被拉低 10us 后即恢复为高电平并保持超过 60us,所以这一位就是 1...
cr10973.png

根据这个规律,我们可以读出这一帧数据是 00110011,但要注意总线首先输出的是最低位,而我们书写的时候是高位在前,所以写成 11001100,也就是 0xCC,这就是 18b20 的跳过 ROM 匹配指令,你可以看看你找到的代码中也有这个指令。

然后看看 18b20 的读出波形,比如下面 18b20 输出温度值 14.8125 °C,那么看看代码:

  1. unsigned char Read1Wbus(void)
  2. {
  3.         unsigned char mByte = 0;
  4.         unsigned char rBit = 0;
  5.         for (volatile unsigned char k = 0; k < 8; k = k + 1)
  6.         {
  7.                 mByte = mByte >> 1;
  8.                 OneWireBus_DDR_SetWrite();
  9.                 OneWireBus_Write_LOW();
  10.                 _delay_us(2);
  11.                 OneWireBus_DDR_SetRead();
  12.                 OneWireBus_Write_HIGH();
  13.                 _delay_us(10);
  14.                 rBit = OneWireBus_Read_State;
  15.                 if (rBit)
  16.                 {
  17.                         mByte = mByte + 0x80;
  18.                 }       
  19.                 _delay_us(60);               
  20.         }       
  21.         return mByte;
  22. }
复制代码


这个代码的意思是,我们将总线拉低 2us 后恢复,这表示要读取总线,那么 18b20 会在这之后最多 10us(实际上更快)开始输出数据,因此我们等待 10us,然后读取总线电平,如果电平为高,表示 18b20 输出了一位 1;如果电平为低,表示 18b20 输出了一位 0。然后,总线将保持大约 60us 的空闲状态(高电平)。根据这个规律,看看波形(读过程中绿色波形上升时开始,黄色代表总线)开始时有一个非常短暂的低电平过程,然后它立即恢复为高电平并保持超过 60us 时间,说明这是一位 1;然后一位的低电平保持了至少超过 15us 才变为高电平,说明这一位就是 0...因此,可以读出此时总线的数据就是 10110111,注意总线首先输出的也是低位,所以按照高位在前的书写格式就是 11101101,也就是 237(十进制),18b20 的分辨率是 0.0625°C,因此将其 /16 得到表示的温度为 14.8125 °C。

cr10974.png


UART 总线则用严格的时间表示数据,叫做波特率,也就是载波速率。比如约定的波特率是 19200,表示载波周期大约是 52us,也就是每一位(1 个 bit)传输的时间是 52us,或者说,一秒钟可以传输 19200 比特数据。除了波特率,UART 还要约定数据位长度、起始位、停止位、效验位,这些约定加起来才能明白总线上数据的波形,换而言之,双方的这个约定也必须一致,否则数据就是错误的 --- 你的串口终端出现不能理解的玩意,和这个关系很大。

一般的,数据位可以是 5~9 位,停止位可以是 1、2 位,效验位可以是没有或 1 个(还分奇偶),这些都需要双方正确约定。具体的约定方式你需要看你的单片机手册,下面是 AVR 的手册中文译本,你可以参考,这些必须双方一致才能正确通讯。
cr10975.png

通常的,我用 N81 约定,也就是效验位没有,数据位 8 位,停止位 1 位,因此一帧数据(1 字节)一共有 10 位(10 比特),那么看下面这个 UART 波形图就很容易理解了。

第一帧数据,从第一个开始位(一定是低电平)开始,也就是总线从空闲变为低电平开始,持续 52us,然后开始第一个比特的时间,也是 52us,显然此时总线是高电平,因此这一位就是 1;这 52us 过后,开始第二个比特,此时总线变为低电平,说明这一位是 0...416us 后,数据传输完毕,总线变为高电平且再保持 52us,这个就是停止位,停止位也永远是 1,自此 520us 的一帧数据传输完毕,一共传输了 10 比特,总数据是 0101010101,有效数据为 10101010,根据高位在前书写规则,书写为 01010101,也就是 0x55(对应 ASCII 字符就是大写字母 U)。

用这个规律,很容易读出第二帧数据是 0111111111,也就是 0xFF;第三帧数据是 0010101011,也就是 0xAA,这就是我叫你发送这几个数据然后用波波看的意思,这样你可以很容易看出你实际上单片机用了什么约定来发数据的,开始位、数据位、停止位、效验位都是多少位,以及波特率多少(显然脉冲宽度的倒数就是波特率)。

cr10972.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-27 18:00:40 | 显示全部楼层
gxg0000 发表于 2019-2-27 10:41
不要去看数据波形,那个意义不大,而且有难度。
你只要保证送到串口数据寄存器的数据正确,数据就能正确 ...

谢谢,问题找到了还是模拟终端的“Hex DispLay Mode”勾选问题原来默认值全部空白,选择后显示0x80  0x80等等,随后不选择就显示字母了,谢谢。
fz2.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-27 18:20:53 | 显示全部楼层
本帖最后由 pdshyh 于 2019-2-27 18:24 编辑
washu 发表于 2019-2-27 16:05
这里有两个总线,

1、1Wire Bus,是 18b20 的总线,你找到的代码中 Ds_Write 或 WriteOneChar、Ds_R ...


washu老师好谢谢您的帮助,还是不熟悉仿真软件,还有对串口输入输出不是很清楚,您上次建议后就看到波形和温度值有关联非常明显,我以为还需要波形和转换呢。原来是拟终端要显示数字要设置一下。第二张图是18b20 3°的模拟情况。
fz3.png
fz4.png
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-26 15:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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