矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: pdshyh

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

[复制链接]
     
 楼主| 发表于 2019-3-2 10:56:40 | 显示全部楼层
       通过这两天学习向初学者推荐两个入门帖子:
       1.单片机https://wenku.baidu.com/view/4cec9d9dcc7931b764ce1524.html帖子,刚开始看的“单片机入门不难------谈PIC系列”通俗易懂,但是通过温度测量例程看是一头雾水通过看,不知道串口通讯存储器中断定时器等等工作原理,和基本结构很难理解,通过“51单片机C语言编程入门”了解单片机工作基本原理后,c语言或其他语言都很容易理解。知道存储器定时器等有1个或多个寄存器控制。
c51.png
       2.DS18B20工作原理有很多帖子,这个http://www.sohu.com/a/160976952_680504帖子讲的比较详细,原来DS18B20测量存储等ROM操作和存储器操作等也是多个控制器存储器组成。
ds18b20.png

      同时也感谢各位老师指教和帮助,虽然C52单片机DS18B20温度传感器程序和电路图比较简单,本人刚刚接触很多多不知道,在仿真中软件使用不熟悉等等,一点小问题就难倒了,多谢多谢。
回复 支持 反对

使用道具 举报

     
发表于 2019-3-2 13:35:44 | 显示全部楼层
仿真软件仅仅是个参考工具,复杂电路不一定能仿真(软件中不一定有你要用的器件),简单电路大部分都有成熟的范例,不需要仿真。开始学习基础知识时,通过仿真操作对学习和理解有很大的帮助,但在实际开发过程中仿真就不一定有那么大的作用了。
回复 支持 反对

使用道具 举报

     
发表于 2019-3-2 13:39:56 | 显示全部楼层
    在实际调试过程中,逻辑分析仪还是有很大作用的,可以用来观看相应点数据波形和多个点的时序图,分析和排查问题,当然如果你有示波器就更好了。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-2 19:29:04 | 显示全部楼层
hujj 发表于 2019-3-2 13:35
仿真软件仅仅是个参考工具,复杂电路不一定能仿真(软件中不一定有你要用的器件),简单电路大部分都有成熟 ...

奥,谢谢,复杂电路不一定能用上仿真,知道了,现在简单电路还搞不定呢,keil软件还玩不转,单片机DS18B20温度传感器,看似简单,串口DS18B20等,由于没有单片机基本知识基础,看着比较费劲。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-2 19:33:13 | 显示全部楼层
hujj 发表于 2019-3-2 13:39
在实际调试过程中,逻辑分析仪还是有很大作用的,可以用来观看相应点数据波形和多个点的时序图,分析和 ...

    也看到帖子讲逻辑分析仪在单片机调试作用比较大,示波器也有这个作用 知道了谢谢!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-3 16:27:04 | 显示全部楼层
请教温度显示到串口例程对读写部分还是不是很清楚需要请教解惑:
      根据 DS18B20初始化部分,DQ=1延时和DQ=0都是单片机控制总线的操作,X=DQ是读DS18B20控制器Rx是否拉高总线判断单片机是否连接DS18B20。
********************************************************************************
** 函数名称 :  ReadOneChar()
** 函数功能 : 读一个字节
********************************************************************************
*/
ReadOneChar()  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0;
for (i=8;i>0;i--) //一个字节有8位
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/*
上面的读部分反复搜网上例程解释也大致知道,读一个字节部分读到 DQ=0就 dat>>=1;读到DQ=1;  dat|=0x80;
但是对比DS18B20初始化部分,弄不明白DQ=0和DQ=1是单片机控制总线的操作还是读到DS18B20的位数据?
我感觉DQ=0和DQ=1应该是单片机控制总线的读DS18B20操作,类似初始化X=DQ读DS18B20控制器Rx是那部分?
为什么不这样写
{
   bit dat;
   DQ=0;         //单片机(微处理器)将总线拉低
  _nop_();       //读时隙起始于微处理器将总线拉低至少1us
   DQ=1;        //拉低总线后接着释放总线,让从机18b20能够接管总线,输出有效数据
   _nop_();
   _nop_();          //小延时一下,读取18b20上的数据 ,因为从ds18b20上输出的数据
//在读"时间隙"下降沿出现15us内有效
   dat=DQ;           //主机读从机18b20输出的数据,这些数据在读时隙的下降沿出现//15us内有效
   TempDelay(10);    //所有读"时间隙"必须60~120us,这里77us
   return(dat);       //返回有效数据
}

这段时间一直在琢磨这个例程,比前段时间清楚一些还是有些迷糊。


补充内容 (2019-3-4 09:42):
找到相关编程解释,谢谢!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-4 09:11:52 | 显示全部楼层
网上搜到_DQ = 1; if (S1820_DQ == 1) Data |= 0x80,还算理解了,就是DQ=1; if(DQ) dat|=0x80; 这句不知道怎么对上_DQ = 1; if (S1820_DQ == 1) Data |= 0x80,弄不清楚......
回复 支持 反对

使用道具 举报

     
发表于 2019-3-4 16:12:09 | 显示全部楼层
pdshyh 发表于 2019-3-4 09:11
网上搜到_DQ = 1; if (S1820_DQ == 1) Data |= 0x80,还算理解了,就是DQ=1; if(DQ) dat|=0x80; 这句不知道 ...

if 语法中,被 if 的元素是一个 Boolean,它只有两个可能赋值 True 和 False,然后 if 语句执行的时候会把被 if 的元素转换成一个 Boolean 再执行,这个转换是隐式的。所以被 if 的元素如果

1、是一个表达式,则转换表达式执行的结果,比如表达式为 a>b,则在 a>b 成立时结果转换为 True 不然转换为 False;如表达式为 a-b,则将 a-b 执行,然后将结果进行 2
2、表达式是一个值,则转换该值的结果,它具有一定规则,通常的如果值存储为 int、long 之类整形变量的话,则 0 转换为 Flase 非 0 统统转换成 True

那么我们假设变量 a 是 int

if a=1

表示只有 a 为 1 条件才成立,a 是 0、2、3... 都不成立



if a

表示只要 a 不是 0 都成立,等效于 if a <> 0

那么具体到这个读取 1W 总线的代码,因为总线电平只能是 HIGH(隐含 =1) 或 LOW(隐含 =0),所以怎么写结果都对。

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-4 17:20:39 | 显示全部楼层
washu 发表于 2019-3-4 16:12
if 语法中,被 if 的元素是一个 Boolean,它只有两个可能赋值 True 和 False,然后 if 语句执行的时候会 ...

      谢谢washu老师耐心讲解,我也发现按 if (S1820_DQ == 1)修改和采用if(DQ)终端显示结果是一样的,就是不知道为什么, 看了您的讲解,C52单片机DS18B20温度传感器串口显例程我基本都理解了。if()有这么多用法,原来dat>>=1;DQ=dat&0x01;和dat|=0x80;都不知道什么意思,网上搜才知道位逻辑与“&” 是逻辑与|是“或”,磕磕碰碰把DS18B20温度传感器的,字节读写弄明白了,现在准备根据您提供的VISA3488_SingleMeter上位机例程修改为简单的电阻的温度系数测试,温度变化环境硬件想用https://detail.tmall.com/item.ht ... amp;id=568774521307,夏新12L制冷车载冷暖双用冰箱 ,现在就是终端虚拟显示数字和温度还对不上,实际和上位机联通再看看什么原因,感谢感谢!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-5 12:39:02 | 显示全部楼层
本帖最后由 pdshyh 于 2019-3-5 12:40 编辑
washu 发表于 2019-3-4 16:12
if 语法中,被 if 的元素是一个 Boolean,它只有两个可能赋值 True 和 False,然后 if 语句执行的时候会 ...


washu老师好,看上位机vb软件有几个问题请教:
     1.Serial Port例程 串口.png   
看到添加的是StatusStrip1控件,没有发现SerialPort1控件,当添加这个控件显示是SerialPort2
     2. 这个例程有波特率设置,搜寻添加端口,计算机有一个COM1口添加上了,USB口没有添加,单片机是USB口弄好插上电脑这个口会不会被搜索到添加上?(单片机5v/3v电源还有DS18B20没连接)
     3.TestVISA3488_SingleMeter上位机例程,我没有发现有波特率设置,找到添加端口部分。
     4.有必要设置上位机控制单片机温度间隔读取时间。
     5.单片机例程是输出整数和小数,上位机还要整合及正负,单片机2进制数字,不能输出带正负和小数点的数字,为什么DS18B20是读取数据两组高位和低位,然后加减乘除得到16进制数字。
      
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-6 11:49:47 | 显示全部楼层
     串口读数仿真一直是虚拟终端显示数字和DS18B20设置温度对不上,我把DS18B20和虚拟示波器拆了,输出串口SBUF=0x0f;        SBUF=0xf0;                  SBUF=0xaa;         SBUF=0x55;还是不行显示8F/F0/ca/b5
单片机at89c52。文件头文件
#include <reg52.h>
#include<math.h>
#include <stdio.h>
   #include<intrins.h>
虚拟终端波特率9600
单片机串口
        TMOD=0x20; //设置定时器1方式2
                TL1=0xfd;  //装载初值,波特率9600 (11.0592M)
        TH1=0xfd;
        TR1=1;           //启动定时器
        SM0=0;
        SM1=1;                //设置串口方式2
        REN=1;                //接受使能
        EA=1;                 //打开总中断
        ES=1;                 //打开串口中断
参照gxg0000老师例程电路图把程序烧录仿真还是这个问题,可能例程有问题,我在看看。
fzwt.png
回复 支持 反对

使用道具 举报

     
发表于 2019-3-6 13:02:16 | 显示全部楼层
pdshyh 发表于 2019-3-5 12:39
washu老师好,看上位机vb软件有几个问题请教:
     1.Serial Port例程   
看到添加的是StatusStrip1 ...

1、这是两个不同的荔枝,Serial Port Test 演示了不用控件的方法,在代码头部有

Shared SerialPort1 As New System.IO.Ports.SerialPort

创建了一个 SerialPort1

然后 Form_Load 那里

AddHandler SerialPort1.DataReceived, AddressOf SerialPort1_DataReceived

将创建的 SerialPort1 的 DataReceived 事件和 SerialPort1_DataReceived 子过程关联。

2、这里搜寻的是 UART 端口(COM),不是 USB 口。UART、USB、PCI、PCIe...都是总线的一种,诸如 FT232、PL2303、CH430 之类 USB to UART 芯片挂在 USB 总线上给你转换出一个 UART 总线,因此需要连接并安装驱动后系统才会多出一个串口给你搜寻到。类似的,USB 总线也是从 PCIe 总线转换出来的,你的 COM1 也是从 PCIe 总线转换出来的*。
cr10986.jpg

*更老的电脑挂在 ISA 总线上,还要老的,直接一个 Intel 8251 挂在 CPU 的总线上


3、对于控件除了用代码设置波特率等参数也可以直接在控件属性页设置

cr10985.png
回复 支持 反对

使用道具 举报

     
发表于 2019-3-6 14:40:41 | 显示全部楼层
pdshyh 发表于 2019-3-5 12:39
...5.单片机例程是输出整数和小数,上位机还要整合及正负,单片机2进制数字,不能输出带正负和小数点的数字,为什么DS18B20是读取数据两组高位和低位,然后加减乘除得到16进制数字。


18b20 给出的温度数据是一个 11 位(含符号位就是 12 位)二进制数据,通常不会直接将其传输到 UART 端口,而是进行一定的格式化。

一种常见的处理方式就是将其格式化为 ASCII 字符,我不清楚你那个舞腰编译器怎么处理这个问题的,它的“SBUF”装载的又是怎么类型数据,我看你一下子丢一个 uint 进去,一下子丢一个 uchar 进去,它到底怎么处理和输出,你最好设法钻研清楚,因为到了上位机这边,串口读 ASCII 字符和读任意二进制数据的方法也不同,我给你的荔枝是读一行 ASCII 字符串的荔枝,所以单片这边也应该发一行 ASCII 字符串(以 \n 结尾)。

通常的方法,将 18b20 返回的温度二进制数据计算为温度值(/16)后,用 printf 格式化为字符串并输出到串口上以符合这个安排。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-6 15:08:30 | 显示全部楼层
washu 发表于 2019-3-6 13:02
1、这是两个不同的荔枝,Serial Port Test 演示了不用控件的方法,在代码头部有

Shared SerialPort1 A ...

       谢谢知道了,不用添加控件用代码头部,原来比葫芦画葫芦,这才知道代码头部,相当于c的文件头。//  单片机的UBS口安装驱动是UART 端口,知道了,串口连接应该没问题了,明白了。// 控件属性设置我找9600没找到,是19200这么大,BaudRte是波特率,原来没注意。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-6 16:11:23 | 显示全部楼层
washu 发表于 2019-3-6 14:40
18b20 给出的温度数据是一个 11 位(含符号位就是 12 位)二进制数据,通常不会直接将其传输到 UART 端 ...

      谢谢washu老师的帮助,我是试着按您说的发数据到串口,还不是很熟悉,在瞎发数据试,现在发        SBUF="01110111";显示的是FB=11110111,SBUF="00001111";显示的是FB=11110111,发 SBUF="1111";显示84=10000100,弄不明白了。关于温度数据处理后在发串口到上位机,我先按您的建议学着,谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

蒙公网安备 15040402000005号

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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