用STC89C52连接Phyphox(Phyphox)
用STC89C52连接Phyphox(Phyphox)
STC89C52RC连接Phyphox的技术并不多困难,只是与ESP32/Arduino Nano 33等连接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;
}
}