目录
1 本文档说明
本文档适用在北醒产品:TFmini\TFmini-s\TFmini-plus\TF02-pro\TF03 标品在默认配置下
项目名称:北醒TF系列产品(Uart)在51系列芯片上的运用 V1.0.0
适用产品:TFmini\TFmini-s\TFmini-plus\TF02-pro\TF03
功能描述: 通过串口读取北醒单点系列雷达的距离与信号强度值
2 测试环境说明
2.1 硬件环境说明:
雷达:北醒单点系列激光雷达
![TF-luna](https://i-blog.csdnimg.cn/blog_migrate/c33fbfce8f974bea42b87c5b0ea98683.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/c2cc728ccd3eb94bc6f392b5f77bd2a8.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/b4daf769ee85e7b449b752e837661b2f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/2cb06f6d177678851216287a1b2b06e2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5561bde56309919091c41a21578ea1d5.png)
开发板:STC15F408AS核心板
串口转接板:TTL转USB(CH340)
驱动链接:链接: 百度网盘 请输入提取码 提取码: 4a8y
其它:母头杜邦线若干
2.2 软件环境说明:
电脑系统:Win 10
编程软件:Keil V5.28
烧录软件: STC-ISP V6.88
串口助手: SSCOM V5.13.1
3 硬件接线说明
3.1 接线图
3.2 接线定义表
TTL转USB板 | 核心板 |
---|---|
GND(黑) | GND(黑) |
RXD 转接板(白) | TXD 核心板(白) |
TXD 转接板(绿) | RXD 核心板(绿) |
VCC 5V(红色) | VCC 5V(红色) |
核心板 | 雷达 |
---|---|
GND(黑) | GND(黑) |
P30(绿) - MCU(RX) | Lidar(绿) - TX |
P31(白) - MCU(TX) | Lidar(白) - RX |
VCC 5V(红色) | VCC 5V(红色) |
注:雷达接线颜色请查考雷达使用说明书
4、硬件串口轮询方式读取雷达数据
源码链接: 百度网盘 请输入提取码 提取码: 7mv9
雷达源码说明
4.1 雷达协议解析函数
/******************************************************************************
TF系列 9 bytes output:
[0x59, 0x59, distanceL, distanceH, strengthL, strengthH, tempL, tempH, checksum]
*****************************************************************************/
void TF_Lidar_GetValue(TOF *Lidar_Data) {
static unsigned char i = 0;
unsigned char j = 0;
unsigned int checksum = 0;
static unsigned char rx[9];
if(RI) { //serialport receive a character
RI = 0;
rx[i] = SBUF;
if(rx[0] != 0x59) {
i = 0;
} else if(i == 1 && rx[1]!= 0x59) {
i = 0;
} else if(i == 8) {
for(j = 0; j < 8; j++) {
checksum += rx[j];
}
if(rx[8] == (checksum % 256)) {
Lidar_Data->distance = rx[2] + rx[3] * 256;
Lidar_Data->strength = rx[4] + rx[5] * 256;
Lidar_Data->receiveComplete = 1;
}
i = 0;
} else {
i++;
}
}
}
4.2 雷达主函数
/************************主函数**************************************************/
void main()
{
InitSerialPort(); //初始化串口
printf("Hello, TFmini!\r\n");
while(1)
{
TF_Lidar_GetValue(&Lidar_Data);
if(Lidar_Data.receiveComplete == 1) {
Lidar_Data.receiveComplete = 0;
printf("Dist = %d ,", Lidar_Data.distance);
printf("AMP = %d\r\n", Lidar_Data.strength);
}
}
}
5、硬件串口中断方式读取雷达数据
源码链接: 百度网盘 请输入提取码 提取码: wjsx
雷达源码说明
5.1 雷达协议解析函数
/******************************************************************************
TF系列 9 bytes output:
[0x59, 0x59, distanceL, distanceH, strengthL, strengthH, tempL, tempH, checksum]
*****************************************************************************/
/********************* UART1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
static unsigned char i = 0;
unsigned char j = 0;
unsigned int checksum = 0;
static unsigned char rx[9];
if(RI) { //serialport receive a character
RI = 0;
rx[i] = SBUF;
if(rx[0] != 0x59) {
i = 0;
} else if(i == 1 && rx[1]!= 0x59) {
i = 0;
} else if(i == 8) {
for(j = 0; j < 8; j++) {
checksum += rx[j];
}
if(rx[8] == (checksum % 256)) {
Lidar_Data.distance = rx[2] + rx[3] * 256;
Lidar_Data.strength = rx[4] + rx[5] * 256;
Lidar_Data.receiveComplete = 1;
}
i = 0;
} else {
i++;
}
}
}
5.2 雷达主函数
/************************主函数**************************************************/
void main(void)
{
S1_8bit(); //8位数据
S1_USE_P30P31(); //UART1 使用P30 P31口 默认
AUXR &= ~(1<<4); //Timer stop 波特率使用Timer2产生
AUXR |= 0x01; //S1 BRT Use Timer2;
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = (u8)(Timer2_Reload >> 8);
TL2 = (u8)Timer2_Reload;
AUXR |= (1<<4); //Timer run enable
REN = 1; //允许接收
ES = 1; //允许中断
EA = 1; //允许全局中断
while (1)
{
if(Lidar_Data.receiveComplete==1) //收到过数据
{
Lidar_Data.receiveComplete = 0;
printf("Dist = %d ,", Lidar_Data.distance);
printf("AMP = %d\r\n", Lidar_Data.strength);
}
}
}
6、 烧录说明
- 选择对应的芯片
- 选择对应的COM口
- 选择已经编译好的HEX文件
- 点击下载固件文件并核心板重新上电
- 显示烧录成功
7 输出测试
8 其它相关51例程源码请参考
链接: 百度网盘 请输入提取码 提取码: uma9