使用keil5编程,用51单片机通过串口通信不断接收一个传感器回传的每组为11个2位16进制的数据。(波特率为9600)前两位数据为固定55,53作为定位符。再第4位数据做高位,第三位数据作低位,组成一个4位有符号16进制数赋给变量value。将value转化为10进制数并赋给变量value10。将value乘以180后除以32768得到结果赋给变量valuejiaodu。再将valuejiaodu与10进制数5对比,声明一个变量DIR并将其赋给引脚P1.5,若valuejiaodu大于10进制数5使P1.5为低电平,若valuejiaodu大于10进制数5使用P1.5为高电平。
时间: 2023-06-13 20:05:51 浏览: 116
下面是基于 Keil 5 和 8051 单片机的代码实现:
```c
#include <reg52.h> // 包含 8051 的头文件
sbit DIR = P1^5; // 定义 DIR 引脚为 P1.5
void main()
{
unsigned char i = 0; // 用于计数
unsigned char buf[22]; // 存放接收到的数据
signed int value; // 存放转换后的值
double valuejiaodu; // 存放计算后的角度值
unsigned int value10; // 存放转换后的 10 进制数值
SCON = 0x50; // 串口工作方式1
TMOD = 0x20; // 定时器1工作方式2
TH1 = 0xFD; // 波特率为9600
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
ES = 1; // 允许串口中断
EA = 1; // 开启全局中断
while(1)
{
if(i == 22) // 如果接收到 22 个数据
{
if(buf[0] == 0x55 && buf[1] == 0x53) // 如果前两位为 0x55 和 0x53
{
value = buf[3] << 8 | buf[2]; // 将第四位和第三位组成一个有符号的 16 进制数
if(value > 32767) // 处理负数
{
value = 65536 - value;
value = -value;
}
value10 = value; // 将有符号的 16 进制数转换为 10 进制数
valuejiaodu = (double)value * 180 / 32768; // 计算角度值
if(valuejiaodu > 5) // 判断角度是否大于 5
{
DIR = 0; // 大于 5,DIR 为低电平
}
else
{
DIR = 1; // 小于等于 5,DIR 为高电平
}
}
i = 0; // 清空计数
}
}
}
void Uart() interrupt 4 // 定义串口中断函数
{
if(RI) // 判断是否接收到数据
{
RI = 0;
buf[i++] = SBUF; // 将接收到的数据存入 buf 数组
}
}
```
以上代码实现了通过串口接收并解析传感器回传的数据,并计算角度值后进行比较控制 DIR 引脚的电平。需要注意的是,由于传感器回传的数据是每组为 11 个 2 位 16 进制的数据,因此需要接收 22 个字符,然后根据前两个字符进行解析。
阅读全文