用STC89C52连接Phyphox(双向数据传输)
用STC89C52连接Phyphox(双向数据传输)
STC单片机连接Phyphox研究笔记至此结束。填坑完毕。
研究51单片机通过蓝牙与手机上的Phyphox连接而互通数据的意义在于,获得一种方法、认识和经验,使Phyphox可以与一切类型的单片机互连互通,使一切可能被改造为蓝牙传输数据的新一代、老一代仪器仪表可以与Phyphox互连互通,实现一定层面的万物互联的实验环境。
STC89C52与Phyphox的探索实践共计8篇笔记,列表如下:
8.用STC89C52连接Phyphox(双向数据传输)
我使用的是STC89C52RC;如果有人打算重新细致研究的话,STC89C52、STC89C51RC片子我都曾尝试,单片机(下位机?)的C代码是相同的,而且,这些片子跑得好的代码,移植到别的STC芯片上,一般不用大改动。
一、Proteus下的仿真
使用了两个虚拟终端作为收发串口来模拟蓝牙。也可以合并在一个终端里实现收和发。
收发测试:
c文件附后,Phyphox文件则使用笔记7里面的现成文件,它们是相同的。
二、烧录、连线和测试
编译keil工程,烧录到芯片中,连接蓝牙,打开Phyphox,运行,实现LED控制。
需要说明的是,这里的实现,只是原理性的,实测中发现蓝牙收发单字符非常精准,但是收发数组,经常出现错误。这可能与代码质量有关,也与延时调试等因素有关。
附main.c文件
/**
实际使用可能需要调试延时等
**/
#include "reg52.h"
#include "stdlib.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
sbit led = P2 ^ 0;
float val;
uchar buf[8];
uint num = 0;
/**
串口初始化函数
波特率为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(uint x)
{
unsigned char i;
while(x--)
{
for(i = 0; i < 120; i++);
}
}
/**
字符发送函数
*/
void PostChar(uchar character)
{
SBUF = character; //发送单个字符
while(!TI);
TI = 0; //发送完成标志
}
/**
字符串发送函数
*/
void PostString(uchar *p)
{
while(*p) //若指针指向的地址为空,则跳出循环
{
PostChar(*p); //指针第一次默认指向首地址
delay(50); //延时,作用为提高发送准确度
p++;
}
}
void main()
{
UartConfigurationInit();
led = 0;
delay(200);
PostString("Phyphox Control STC89C52RC...\r\n");
PostString("----------------------\r\n");
delay(50);
while (1)
{
PostString(buf);
PostString("\r\n");
val = atof(buf);
if (val > 1.0)
{
led = 1;
}
else
{
led = 0;
}
delay(500);
}
}
//中断函数
void revdata(void) interrupt 4
{
if(RI)
{
buf[num++] = SBUF;
if(num >= 7)
{
num = 0;
}
}
RI = 0;
}