之前在學藍牙通信的時候如何將單片機獲取到的傳感器的數值發送到上位機遇到了不少的問題。由於數據的發送一種是字符格式一種是(hex)也就是十六進制顯示。傳感器獲取到的數值是十進制。這樣顯示起來就會不太一樣。後來解決了這個問題,把一些過程分享出來,僅供參考。
1.單片機通過串口發送單個字符
- 功能:上位機給單片發送一個字符,單片機接收到後給上位機發送一個相同的字符。
- 代碼
#include"reg51.h"
void UartInit(void);
unsigned char receive;
int main()
{
UartInit();
while(1)
{
if(RI==1)
{
receive=SBUF;
RI=0;
SBUF=receive;
while(TI==0)
TI=1;
}
}
}
void UartInit(void) //[email protected]
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位數據,可變波特率
TMOD &= 0x0F; //清除定時器1模式位
TMOD |= 0x20; //設定定時器1爲8位自動重裝方式
TL1 = 0xFA; //設定定時初值
TH1 = 0xFA; //設定定時器重裝值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啓動定時器1
}
- 測試結果
2.單片機通過串口發送字符串
- 功能:當上位機給單片機發送任意一個字符的時候,單片機向上位機發送字符串。
#include"reg51.h"
void UartInit(void);
void send(unsigned char *p);
unsigned char shuju[]="I like you";
unsigned char receive;
int main()
{
UartInit();
while(1)
{
if(RI==1)
{
receive=SBUF;
RI=0;
send(shuju);
}
}
}
void UartInit(void) //[email protected]
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位數據,可變波特率
TMOD &= 0x0F; //清除定時器1模式位
TMOD |= 0x20; //設定定時器1爲8位自動重裝方式
TL1 = 0xFA; //設定定時初值
TH1 = 0xFA; //設定定時器重裝值
ET1 = 0; //禁止定時器1中斷
TR1 = 1; //啓動定時器1
}
void send(unsigned char *p)
{
unsigned char index=0;
do
{
SBUF=p[index++];
while(TI == 0);
TI = 0;
}
while(p[index]!=0);
}
- 測試結果
3.單片機將傳感器獲取到的數字值發送到上位機
- 在這裏用PCF8591AD芯片做演示,AD轉換將外部的模擬值變爲數字信號存儲在單片機中,那麼如何將讓單片機獲取到的數字顯示到串口呢?`
unsigned int AD;
void senNum(unsigned int dat);
unsigned char shuzu[10];
int main()
{
UartInit();
while(1)
{
AD=AD_read(0X01);//這個只是個參考,在這裏僅僅是爲了表示傳感器獲取到的值。
senNum(AD);
uart_tx(shuzu,3);
delayms(1000);
}
}
void senNum(unsigned int dat)//由於該傳感器最大值也就是三位數。具體多少位根據自己傳感器獲取到的值來設定
{
shuzu[0]=dat/100+'0';//將數值變換成字符
shuzu[1]=dat%100/10+'0';
shuzu[2]=dat%10+'0';
}
void uart_tx(unsigned char *p,unsigned char length)
{
unsigned char i;
for(i=0;i<length;i++)
{
SBUF = *(p+i);
while(TI == 0);
TI = 0;
}
}
-測試結果