用STC89C52連接Phyphox(Phyphox)STC89C52RC連接Phyphox的技術(shù)并不多困難,只是與ESP32/Arduino Nano 33等連接Phyphox比起來要麻煩得多。 前面進(jìn)行了一些整理: 1.用STC89C52連接Phyphox(綜述) 2.用STC89C52連接Phyphox(串口) 3.用STC89C52連接Phyphox(燒錄) 4.用STC89C52連接Phyphox(藍(lán)牙) 基礎(chǔ)工作都已經(jīng)鋪墊好了,現(xiàn)在差不多到了最后一道工序,就是Phyphox端的實(shí)驗(yàn)代碼是怎樣的呢?本來應(yīng)該一步到位就結(jié)束了這個(gè)研究的,但是我手上的DS18b20溫度傳感器總是不好用,于是這里只能試試Phyphox接收從STC89C52RC發(fā)送出來的確定的數(shù)據(jù)。有機(jī)會(huì)時(shí),可能還會(huì)研究研究從傳感器讀取數(shù)據(jù)、從Phyphox反向控制STC89C52RC。看時(shí)間吧。 在“用STC89C52連接Phyphox(藍(lán)牙)”的筆記里,我們找到了藍(lán)牙特征碼,這個(gè)特征碼現(xiàn)在要使用了。到Phyphox Editor里建構(gòu)我們的實(shí)驗(yàn): 
填寫好基本信息之后,到Input標(biāo)簽頁創(chuàng)建Input的Bluetooth視圖,并填寫“Device Name”,設(shè)置成我們的藍(lán)牙BLE的名稱,當(dāng)然這里不填寫對(duì)連接實(shí)驗(yàn)絲毫沒有影響。再到characteristic欄填寫特征碼0000FFE1-0000-1000-8000-00805F9B34FB,這個(gè)特征碼最好是自己實(shí)際用藍(lán)牙調(diào)試軟件自己測試提取出來,比如ESP32的特征碼與這里使用的HC-08的就不是相同的。 最后,到Conversion Function欄填寫string,意思是不管從STC89C52RC發(fā)過來什么數(shù)據(jù),我們一切都讓Phyphox當(dāng)成是字符串來接收。這樣做的好處是不再擔(dān)心數(shù)據(jù)類型轉(zhuǎn)換問題,壞處是速度可能會(huì)慢。當(dāng)然,為了和這里的string配套,在編寫51的程序時(shí),發(fā)往串口的數(shù)據(jù),盡量也都是以字符數(shù)組的形式發(fā)送。實(shí)際向串口發(fā)字符數(shù)組,在51里比發(fā)數(shù)值型數(shù)據(jù)還要簡單得多,不用管進(jìn)制。 
現(xiàn)在可以正式開始了。 1.在C51里編寫測試程序。代碼附在后面了。編譯,燒錄。 2.藍(lán)牙接線。 3.編寫Phyphox端實(shí)驗(yàn)代碼。細(xì)節(jié)就不啰嗦了,極簡單。 
4.下載Phyphox代碼到手機(jī)Phyphox軟件里,打開實(shí)驗(yàn),會(huì)詢問藍(lán)牙MXXHC08安在? 
MXXHC08答:在! 
實(shí)驗(yàn)圖: 
附程序。估計(jì)此代碼應(yīng)存在問題,因?yàn)閭鬏敳徽!?/p>#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; /** * 串口初始化函數(shù) * 波特率為9600 */ void UartConfigurationInit() { TMOD = 0x20; //設(shè)置定時(shí)器1工作方式為方式2 TH1 = 0xfd; //波特率9600 TL1 = 0xfd; TR1 = 1; //啟動(dòng)定時(shí)器1 SM0 = 0; SM1 = 1; //串口方式1 REN = 1; //允許接收 PCON = 0x00; //關(guān)倍頻 ES = 1; //開串口中斷 EA = 1; //開總中斷 }
/** * 延時(shí)函數(shù) * 延時(shí)count毫秒 */
void delay(unsigned int count) { uint cycle; while(count) { cycle = 120; while(cycle > 0) cycle--; count--; } }
/** * 字符發(fā)送函數(shù) */ void PostChar(uchar character) { SBUF = character; //發(fā)送單個(gè)字符 while(!TI); TI = 0; //發(fā)送完成標(biāo)志 }
/** * 字符串發(fā)送函數(shù) * 通過調(diào)用字符發(fā)送函數(shù)來實(shí)現(xiàn) */ void PostString(uchar *p) { while(*p) //若指針指向的地址為空,則跳出循環(huán) { PostChar(*p); //指針第一次默認(rèn)指向首地址 delay(20); //延時(shí),作用為提高發(fā)送準(zhǔn)確度 p++; } }
/*uint length(float num)//設(shè)置浮點(diǎn)數(shù)的長度 { int len=0; while(num>0.01)//控制精確到小數(shù)點(diǎn)后第幾位 { num=num/10; //printf("%d : %f\n",len,num); len++; } return len; } */
/** * 主函數(shù) */ void main() { uint number=0; UartConfigurationInit(); //初始化串口 while(1) { number+=2021; a= (float)number/100; sprintf(b,"%2.2f",a); PostString(b); //發(fā)送字符串 delay(1000); if (number>999999) number=0; } }
|