矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: pdshyh

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

[复制链接]
     
发表于 2019-3-6 19:16:37 | 显示全部楼层
pdshyh 发表于 2019-3-6 15:08
谢谢知道了,不用添加控件用代码头部,原来比葫芦画葫芦,这才知道代码头部,相当于c的文件头。// ...


不是,所谓放在代码头部是一个习惯性说法,正确说法是放在

Public Class xxx
...
..
.
End Class

代码块之中的任何一个,但又在其它子过程、子函数外部的地方,表示这个元素是在整个

Public Class xxx
...
..
.
End Class

代码块之内都有效,你写在尾部(但必须在 End Class 之前)也可以。实际上如果你只有一个子过程要用到串口,还可以把这个代码放在那个子过程里,但其它子过程、子函数就不能用它了。因为串口要在你这个程序(实际上是 Class Fromxxx)内都能被使用,所以放在了刚才说的地方。

这是一个元素(变量)的作用域问题,C 也一样(变量的作用域),不过我不太记得 C 是不是一定要放在 main() 之前。

回复 支持 反对

使用道具 举报

     
发表于 2019-3-6 19:21:53 | 显示全部楼层
pdshyh 发表于 2019-3-6 16:11
谢谢washu老师的帮助,我是试着按您说的发数据到串口,还不是很熟悉,在瞎发数据试,现在发        SBUF="01110111";显示的是FB=11110111,SBUF="00001111";显示的是FB=11110111,发 SBUF="1111";显示84=10000100,弄不明白了。 ...


我不清楚舞腰尤其是 STC 巫妖的串口使用以及 Keil C 如何处理这个破事,以及(它们的)寄存器...

所以我前面才说,不知道为何你找到的代码一下子丢一个 uint 进去,一下子又丢个 uchar 进去,你得设法自己钻研这个问题,如果 SBUF 是一个 1byte 长的 UART 发送缓冲,那么它是不能丢一个 uint 进去的。

另外还是前几天就说过的事情,你要是用 Arduino 问题早解决了
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-6 20:57:43 | 显示全部楼层
washu 发表于 2019-3-6 19:16
不是,所谓放在代码头部是一个习惯性说法,正确说法是放在

Public Class xxx

谢谢指教,按您说的对照例程再好好看看,对结构组成记得更清晰了,还是基础太差,太多不知道。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-6 21:13:39 | 显示全部楼层
washu 发表于 2019-3-6 19:21
我不清楚舞腰尤其是 STC 巫妖的串口使用以及 Keil C 如何处理这个破事,以及(它们的)寄存器...

所 ...

       washu 老师好,好像SBUF 是收发串口专用寄存器,您不说我还以为什么数据都可以通过串口跑,您说的跑0x0f/0xf0/0xaa/0x55观察串口输出图形,不知道怎么跑,就瞎跑............下午按您说的思路搜,还找到一些例程,和您说的差不多DS18B20读到数据要转换几次,还以为找的温度到串口例程就可以到pc,不是这回事,O(∩_∩)O哈哈~用ARV 单片机和您的实用例程肯定省事了,现在刚刚把DS18B20连接线焊好,仿真过关在做下一步。谢谢您的关注和细心指教。
回复 支持 反对

使用道具 举报

     
发表于 2019-3-6 21:33:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2019-3-7 13:35:29 | 显示全部楼层
pdshyh 发表于 2019-3-6 21:13
washu 老师好,好像SBUF 是收发串口专用寄存器,您不说我还以为什么数据都可以通过串口跑,您说的 ...

那你应该看看 SBUF 是多大的,1byte,还是 2byte?还是 Keil 有什么特殊处理,啥数据都能丢进去?

以 AVR 的视角看,直接往串口发送寄存器里丢数据,一下子丢 uint  一下子丢 uchar 是非常惊竦的。

退一万步说 Keil 或舞腰处理了这个问题,比如编译器自动把 int 拆拆俩 char 啥的,但你丢进去的终究是数值,而不是字符,终究还是无法用我的上位机荔枝,因为我用的是字符,需要单片机发送之前用 printf 做转换。

最后你说那个发 0x55、0xaa 的问题,我怀疑是波特率、停止位的关系,我不清楚巫妖寄存器设置,你最好用波波看看 0x55 时波形啥样,0xaa 波形又是啥样,并计算一下波特率。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-7 16:55:05 | 显示全部楼层
矿坛铁粉 发表于 2019-3-6 21:33
某宝上有一种二三十块钱的USB口逻辑分析仪,配合软件,很适合干这事。

谢谢指教,实际电路还没搭建,只把DS18B20连接线焊接好了。不行买一个USB口逻辑分析仪,谢谢。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-7 17:15:00 | 显示全部楼层
washu 发表于 2019-3-7 13:35
那你应该看看 SBUF 是多大的,1byte,还是 2byte?还是 Keil 有什么特殊处理,啥数据都能丢进去?

以  ...

washu老师好,我今天找到一相近例程,按您说的转换为二进制数据计算为温度值(/16)后再转换为ASCII码是一位数+ 48,发到串口 SBUF = send_data
for(i = 0;i <= 3;i++)
         {
    txd_data(dis_buffer + 48);
         }
}
RI = 0;           
接到pc指令单片机读温度发到虚拟终端显示,9.18°,显示,33  (pc指令)90 99 91 98
温度负值还有点乱,
fz显示.png
回复 支持 反对

使用道具 举报

     
发表于 2019-3-7 18:56:56 | 显示全部楼层
本帖最后由 washu 于 2019-3-7 19:00 编辑
pdshyh 发表于 2019-3-7 17:15
washu老师好,我今天找到一相近例程,按您说的转换为二进制数据计算为温度值(/16)后再转换为ASCII码是 ...


不知道你这个 dis_buffer 怎么来的,可以随便给你 +48,而且你循环了 3 次也没对 dis_buffer 地址进行增量( dis_buffer[i]  或 dis_buffer++ )。首先可以 +48 然后发到字符(char)或串口缓冲上的必须是一个 uchar,里面以二进制存储了一个数值,在 0~9 范围内,它 +48 后等于该数值的 ASCII 代码。

来然后自 18b20 的温度值是 11 位(含符号就是 12 位)二进制,通常存储在一个 int 或 uint 里,然后 /16 得到温度,但...

1、/16 后这个数值是带小数的,而 int、uint 是整型变量,所以小数部分会被舍去。比如 9.1875°C 会变成 9*,其它的没了

2、它可能不止一个数字,不一定在 0~9 范围内,所以不能 +48 去得到该数的 ASCII 代码,比如你测到的温度是 25 °C,那么它(被 /16 后的 int 或 uint)+48 就得到 73(0x49,字符就是 I),而不是得到 2(0x32)和5(0x35)两个 ASCII 字符。


*这里用 ANSI C 来说,你那个 Keil 不清楚



所以不清楚你这个代码究竟做了啥。


那么在读到正确的 18b20 给出的温度数据后,应该如何送到串口且是 ASCII 字符行呢?

1、前面说过,/16 后温度数据是一个带小数的玩意,所以不能用 int、char 之类整型,需要用比如 float 或 double float 之类浮点型变量,这样你 /16 后才能得到完整的温度的整数部分和小数部分。然后,用 printf 或 sprintf 格式化它,比如我们要输出带 3 位小数的格式,可以用

sprintf (sbuff, "%.3f\n", fTemperature)

实现将 fTemperature(这是一个 double)格式化为带三位小数的字符串,并放入 sbuff 数组(这是一个 char 类型的数组)中(供你输出到串口)。末尾的 \n 表示这是一行字符,这样上位机才能正确判断它收到的是一行 ASCII 字符而不是别的东西。
cr10988.png

2、用 sprintf 格式化一个浮点数代价非常大,有限的范围内可以用取巧的方式,下面是我用数码管显示 18b20 温度的一个小程序可供参考,我将 18b20 返回的结果(11 位二进制)先 *1000 再 /16,比如以你的 9.1875°C 为例,就得到 9187.5,当然因为结果保存在 uint 里所以得到的结果是 9187。

然后,在 for 循环中第一步先将它 /1000,得到首位数字 9;然后 9187 再减去得到的首位数字 9*1000 得到 187,进行 for 循环第二部,将其 /100 得到第二位数字 1,然后 187-1*100 得到 87...

这样可以分离每一个数字,我这是用数码管显示的所以得到的每一位数字直接发到单片机的一整个 PORT 上了;你可以将得到的每一位数字(再+48)发到串口即可(当然最后还得发 0x0D、0x0A 表示这一行字符)。
cr10989.png

另外你折腾那么久,真心建议你买一套 Arduino,或者买个 AVR 小板(+烧录线),这样起码快点
回复 支持 反对

使用道具 举报

     
发表于 2019-3-7 19:23:06 | 显示全部楼层
pdshyh 发表于 2019-3-7 16:55
谢谢指教,实际电路还没搭建,只把DS18B20连接线焊接好了。不行买一个USB口逻辑分析仪,谢谢。

你还是买个 Arduino 或者 AVR+下载线吧

看了下买个人家做好的 M8 学习板大概 20 多块钱
cr10990.jpg


下载线大概 10 块钱
cr10992.jpg



另外还有兼容 Arduino 的 AVR 学习板 其实 Arduino 本来就是用 AVR 做的,区别在于纯 Arduino 只给用 USB 下载程序,不引出 ISP 口;而标准 AVR 学习板用 ISP 下载程序,会引出 ISP 口给你而已。这个板两个都有,你可以两种方式都试试
cr10991.jpg


btw. 如果准备玩 AVR,我还是建议用山寨 STK500 下载程序而不是用 10 块钱的下载线
cr10993.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-7 21:11:29 | 显示全部楼层
washu 发表于 2019-3-7 19:23
你还是买个 Arduino 或者 AVR+下载线吧  

看了下买个人家做好的 M8 学习板大概 20 多块钱


谢谢washu 老师指点,准备买您建议的七星虫 增强版 atmega328p avr兼容arduino开发板和 STK500 下载器,谢谢您的的关心和帮助。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-7 21:22:10 | 显示全部楼层
washu 发表于 2019-3-7 18:56
不知道你这个 dis_buffer 怎么来的,可以随便给你 +48,而且你循环了 3 次也没对 dis_buffer 地址进行 ...

washu 老师好,我今天找到一相近例程在办公室,我出差回来再拷贝出来研究研究,和您说的加sprintf (sbuff, "%.3f\n", fTemperature)在试试,看行不行。 Keil 软件调试不能自动运行,串口,存储器数字情况都没法看,准备按您的建议买在一套 Arduino,和STK500 下载器,也不多什么几十块钱,谢谢了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-11 11:43:06 | 显示全部楼层
washu 发表于 2019-3-7 19:23
你还是买个 Arduino 或者 AVR+下载线吧  

看了下买个人家做好的 M8 学习板大概 20 多块钱

      washu 老师好,关于单片机串口通信,捣鼓这些天,弄明白一点,DS18B20温度是16进制需要换算是十进制在转换ASCII 字符符串, 因为串口只能发送字ASCII 字符符串。一直在做电路仿真,由于keil编译器不能自动运行只能手动一步一步运行,很麻烦,Proteus sisi 虚拟终端显示和DS18B20温度对不上,估计搭建实际电路和pc做好上位机软件进行通信能查看上传数据,就明白对不对了。进度不会太快。
       根据您的建议我确定使用AVR 单片机和STK500 烧录器,也又看了过去您关于单片,机语言、编译器、IDE等讲解,误解您的“Arduino 可以说是硬件或微控制器界的 BASIC ”以为Arduino 就是用BASIC 语言,比较木讷刚刚理解,Arduino集成板,Arduino语言其实也是一种经过包装的简化的 C 语言,我一直以为是 BASIC语言,Arduino集成板还不是ARV单片机,arduino是在avr单片机上开发的一套开源硬件系统。
      现在知道用微软Visual Studio IDE+Arduino for VS 的插件+STK500 烧录器,前段时间用Visual Studio IDE的vb参考您的例程做上位机软件运行体验比keil+Proteus sisi 还是好很多,破解的有安全风险还有使用功能不全的纰漏。现在不知道ARV单片机除了Proteus sisi 还可以用哪款进行仿真好些。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-16 10:57:42 | 显示全部楼层
    通过这几天对单片机几款编译器软件简单安装运行,对计算机语言、编译器、IDE有了进一步认识,最先使用的是上位机Visual Studio IDE的VB,能简单比葫芦画瓢使用实际移植应用,单片机编译器是keil对C52单片机DS18B20温度传感器串口显示编程仿真费时费力也不少,C52和DS18B20都买了还没有实际电路应用,FastAVR   IDE刚刚安装和学习帮助文件,是Basic语言和上位机的VB比较还是感觉有差距,和keil的C语言相比感觉FastAVR相当于傻瓜相机很多集成的库或函数拿来用就行,FastAVR 怎么选择芯片型号还是不是很清楚,arduino1.0.5软件选择芯片型号还是比较方便使用选择,Visual Studio的Arduino for VS 的插件不是很熟悉,如何选择芯片型号还在摸索,arduino语言近似c语言感觉雷同FastAVR 。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-21 13:27:52 | 显示全部楼层
washu 发表于 2019-3-7 19:23
你还是买个 Arduino 或者 AVR+下载线吧  

看了下买个人家做好的 M8 学习板大概 20 多块钱

washu 老师好,Atmel Studio 7下载安装好了,Arduino和 Ateml Studio都能用下载STK500来烧录,不知道FastAVR能不能用TK500烧录。能不能介绍Arduino和 Ateml Studio的区别,还有 Ateml Studio怎么设置用STK500来烧录英文不好捣鼓。Ateml Studio简单使用简单搜搜学习。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

蒙公网安备 15040402000005号

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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