找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1722|回复: 7
打印 上一主题 下一主题
收起左侧

传感器测量的数值,通过串口送到上位机,不懂以下程序求解答

[复制链接]
跳转到指定楼层
楼主
ID:318095 发表于 2018-4-27 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不懂红色部分,求大神解答,谢谢
#include<reg52.h>
#include<math.h>
#define uchar unsigned char

sbit trig=P0^3;
sbit echo=P0^2;

void main()
{           float a,b1,c1,k;int b,c,i,j;         char x[9];
       echo=1;
           TMOD=0X21;
           TH1=0XFd;
           TL1=0XFd;
           TR1=1;
           SCON=0X50;
           while(1)
           {   TH0=0X00;TL0=0X00;
               trig=1;
                   k++;k++;k++;        k++; k++;  k++;k++;  
                   trig=0;
                   while(!echo);
                   TR0=1;
                   while(echo);
                  
                   a=TH0*256+TL0;
                   a=a*12*17;            
                   TR0=0;
                   a=(a/11059.2)+0.7;        //以上为超声波测距,能明白
                  
                   c1=modf(a,&b1);
                   b=(int)(b1);
                   c=(int)(1000*c1);
                  
                   x[0]=0x30+b/100;
                   x[1]=0x30+b/10-10*(b/100);
                   x[2]=0x30+b-10*(b/10);
                   x[3]=0x2e;
                   x[4]=0x30+c/100;
                   x[6]=0x30+c/10-10*(c/100);
                   x[7]=0x30+c-10*(c/10);
                   x[8]='\0';
                   for(i=0;i<9;i++)
                      {   if((x[ i]==0x30)&&(i<2))
                              {    if(!(x[0]==0x30))
                                                    {          SBUF=x[ i];
                                              while(!TI);
                                              TI=0;
                                                             }
                                                   else
                                                    {    SBUF=0x20;
                                             while(!TI);
                                             TI=0;
                                                                }
                                          }
                                   else {  SBUF=x[ i];
                                   while(!TI);
                                    TI=0;
                                                }
                            }
                   for(i=0;i<110;i++)
                       for(j=0;j<114;j++);
                }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:318095 发表于 2018-4-27 21:25 | 只看该作者
我感觉应该先进行AD 转换,再送显,但是不知道为什么要用到数组
回复

使用道具 举报

板凳
ID:318768 发表于 2018-4-29 21:01 | 只看该作者
为什么不用printf()函数呢?
回复

使用道具 举报

地板
ID:318768 发表于 2018-4-29 21:08 | 只看该作者
程序是先发3位整数,再发一个点(0x2e=.),再发送4个小数。求余运算
回复

使用道具 举报

5#
ID:213173 发表于 2018-4-30 18:29 | 只看该作者
                a=(a/11059.2)+0.7;        //以上为超声波测距,能明白
                //获取的数值分解成整数和小数,再转换成十进制字符。
                //把3位整数、小数点、3位小数、空格共9个字节分别保存在缓存数组
                c1=modf(a,&b1);
                b=(int)(b1);
                c=(int)(1000*c1);
                x[0]=0x30+b/100;
                x[1]=0x30+b/10-10*(b/100);
                x[2]=0x30+b-10*(b/10);
                x[3]=0x2e;
                x[4]=0x30+c/100;
                x[6]=0x30+c/10-10*(c/100);
                x[7]=0x30+c-10*(c/10);
                x[8]='\0';
                //缓存数组中9个字节合成一帧数据串发送到上位机
                for(i=0;i<9;i++)
                {
                        if((x[i]==0x30)&&(i<2))
                        {
                                if(!(x[0]==0x30))
                                {
                                        SBUF=x[i];
                                        while(!TI);
                                        TI=0;
                                }
                                else
                                {   
                                        SBUF=0x20;
                                        while(!TI);
                                        TI=0;
                                }
                        }
                        else
                        {
                                SBUF=x[i];
                                while(!TI);
                                TI=0;
                        }
                }
                //延时
                for(i=0;i<110;i++)
                        for(j=0;j<114;j++);
        }
}
回复

使用道具 举报

6#
ID:318095 发表于 2018-5-4 15:44 | 只看该作者
wulin 发表于 2018-4-30 18:29
a=(a/11059.2)+0.7;        //以上为超声波测距,能明白
                //获取的数值分解成整数和小数,再转换成十进 ...

51单片机作为下位机跟PC端通信 用RS232作为串口通信方式  不用进行模数转换吗? 就是能直接将十进制数字,字符等直接传送吗?
回复

使用道具 举报

7#
ID:318095 发表于 2018-5-4 17:01 | 只看该作者
xdata911 发表于 2018-4-29 21:08
程序是先发3位整数,再发一个点(0x2e=.),再发送4个小数。求余运算

0x2e=.   那0x30还有0x20有特殊含义吗?
回复

使用道具 举报

8#
ID:213173 发表于 2018-5-4 17:45 | 只看该作者
han333 发表于 2018-5-4 15:44
51单片机作为下位机跟PC端通信 用RS232作为串口通信方式  不用进行模数转换吗? 就是能直接将十进制数字 ...

串口只负责一次传送一个字节,其代表的含义由通讯协议解释。不存在模数转换问题。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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