之前在学蓝牙通信的时候如何将单片机获取到的传感器的数值发送到上位机遇到了不少的问题。由于数据的发送一种是字符格式一种是(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) //9600bps@11.0592MHz
{
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) //9600bps@11.0592MHz
{
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);
}
测试结果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;
}
}
-测试结果