分享

用STC89C52连接Phyphox(Phyphox)

 新用户5228KeDY 2021-10-10

用STC89C52连接Phyphox(Phyphox)

STC89C52RC连接Phyphox的技术并不多困难,只是与ESP32/Arduino Nano 33等连接Phyphox比起来要麻烦得多。

前面进行了一些整理:

1.用STC89C52连接Phyphox(综述)

2.用STC89C52连接Phyphox(串口)

3.用STC89C52连接Phyphox(烧录)

4.用STC89C52连接Phyphox(蓝牙)

基础工作都已经铺垫好了,现在差不多到了最后一道工序,就是Phyphox端的实验代码是怎样的呢?本来应该一步到位就结束了这个研究的,但是我手上的DS18b20温度传感器总是不好用,于是这里只能试试Phyphox接收从STC89C52RC发送出来的确定的数据。有机会时,可能还会研究研究从传感器读取数据、从Phyphox反向控制STC89C52RC。看时间吧。

在“用STC89C52连接Phyphox(蓝牙)”的笔记里,我们找到了蓝牙特征码,这个特征码现在要使用了。到Phyphox Editor里建构我们的实验:

填写好基本信息之后,到Input标签页创建Input的Bluetooth视图,并填写“Device Name”,设置成我们的蓝牙BLE的名称,当然这里不填写对连接实验丝毫没有影响。再到characteristic栏填写特征码0000FFE1-0000-1000-8000-00805F9B34FB,这个特征码最好是自己实际用蓝牙调试软件自己测试提取出来,比如ESP32的特征码与这里使用的HC-08的就不是相同的。

最后,到Conversion Function栏填写string,意思是不管从STC89C52RC发过来什么数据,我们一切都让Phyphox当成是字符串来接收。这样做的好处是不再担心数据类型转换问题,坏处是速度可能会慢。当然,为了和这里的string配套,在编写51的程序时,发往串口的数据,尽量也都是以字符数组的形式发送。实际向串口发字符数组,在51里比发数值型数据还要简单得多,不用管进制。

现在可以正式开始了。

1.在C51里编写测试程序。代码附在后面了。编译,烧录。

2.蓝牙接线。

3.编写Phyphox端实验代码。细节就不啰嗦了,极简单。

4.下载Phyphox代码到手机Phyphox软件里,打开实验,会询问蓝牙MXXHC08安在?

MXXHC08答:在!

实验图:

附程序。估计此代码应存在问题,因为传输不正常。

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <stdlib.h>

#define uchar unsigned char
#define uint unsigned int

uchar b[8];
float a;
/**
 * 串口初始化函数
 * 波特率为9600
 */
void UartConfigurationInit()
{
    TMOD = 0x20; //设置定时器1工作方式为方式2
    TH1 = 0xfd;    //波特率9600
    TL1 = 0xfd;
    TR1 = 1;    //启动定时器1
    SM0 = 0;
    SM1 = 1;    //串口方式1
    REN = 1;    //允许接收
    PCON = 0x00; //关倍频
    ES = 1;     //开串口中断
    EA = 1;     //开总中断
}

/**
 * 延时函数
 * 延时count毫秒
 */

void delay(unsigned int count)
{
    uint cycle;
    while(count)
    {
        cycle = 120;
        while(cycle > 0) cycle--;
        count--;
    }
}

/**
 * 字符发送函数
 */
void PostChar(uchar character)
{
    SBUF = character; //发送单个字符
    while(!TI);
    TI = 0; //发送完成标志
}

/**
 * 字符串发送函数
 * 通过调用字符发送函数来实现
 */
void  PostString(uchar *p)
{
    while(*p)      //若指针指向的地址为空,则跳出循环
    {
        PostChar(*p); //指针第一次默认指向首地址
        delay(20);  //延时,作用为提高发送准确度
        p++;
    }
}

/*uint length(float num)//设置浮点数的长度
{
    int len=0;
    while(num>0.01)//控制精确到小数点后第几位
    {
        num=num/10;
        //printf("%d  : %f\n",len,num);
        len++;
    }
    return len;
} */

/**
 * 主函数
 */
void main()
{
 uint number=0;
    UartConfigurationInit(); //初始化串口
 
    while(1)
    {
   number+=2021;
   a= (float)number/100;
   sprintf(b,"%2.2f",a);
   PostString(b); //发送字符串
      delay(1000);
   if (number>999999) number=0;
 }
}

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多