用STC89C52连接Phyphox(双向数据传输)

用STC89C52连接Phyphox(双向数据传输)

STC单片机连接Phyphox研究笔记至此结束。填坑完毕。

研究51单片机通过蓝牙与手机上的Phyphox连接而互通数据的意义在于,获得一种方法、认识和经验,使Phyphox可以与一切类型的单片机互连互通,使一切可能被改造为蓝牙传输数据的新一代、老一代仪器仪表可以与Phyphox互连互通,实现一定层面的万物互联的实验环境。

STC89C52与Phyphox的探索实践共计8篇笔记,列表如下:

1.用STC89C52连接Phyphox(综述)

2.用STC89C52连接Phyphox(串口)

3.用STC89C52连接Phyphox(烧录)

4.用STC89C52连接Phyphox(蓝牙)

5.用STC89C52连接Phyphox(Phyphox)

6.用STC89C52连接Phyphox(Ds18b20)

7.用STC89C52连接Phyphox(多数据协同)

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;
}

(0)

相关推荐