一、前言
此片文章主要介绍如果通过51系列开发板来读取TOF250(TTL接口)数据的教程
提示:以下的案例仅供参考学习使用
二、硬件准备
-
TOF250 :测距传感器
-
51系列开发板:STC12C5A60S2 主频12M
提示:51系列开发板种类较多,此处不专门举例
详细资料可以参考:STC 官网
-
电脑 :Windows 7/10/11
-
TTL转USB:本次测试使用CH340芯片转接板
-
杜邦线:各类(若干)
-
TOF250尾线:购买时自带有一根尾线
二、软件准备
- KEIL IDE:参考官网下载安装教程
三、硬件接线图
提示:实际在测试过程中不建议接上图黄色的线
说明:
- STC12C5A60S2共有两个串口,不过此次测试仅使用一个串口,方便理解
- USB打印结果需要用到串口1的TX
- 读取TOF250需要用到串口1的RX
四、例程源码
/**************************************************************
**技术论坛:https://blog.csdn.net/HCJ_Application/article/details/124058266
**修改日期:2022/4/24
**技术说明:基于STC12C5A60S2单片机,主频12M
**版本:V1.0
**作者:深圳市弘成基科技有限公司
**************************************************************/
#include <STC12C5A60S2.h>
#include <stdio.h>
unsigned char data RxCounter; //UART接收数的累加
unsigned char data RxBuffer[10],RxDat[10]; //UART缓存区、数据区
unsigned char data UartReadEnd = 0; //检测是否接收结束
unsigned char j = 0; //检测每次接收到的长度,方便字符串转整数的时候进行处理
unsigned int Tof250_dist = 0; //读取到TOF250的具体数值
void Uart1_SendChar(unsigned char Udat) ;
unsigned int StringToDEC(unsigned char data *rdata,unsigned char len);
/**************************************************************
**TOF250串口通信协议:
**波特率 : 9600
**数据位 : 8
**校验 : 无
**停止位 : 1
****************************************************************/
void UartInit(void) //9600bps@12.000MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xB2; //设置定时初始值
TH1 = 0xB2; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
ES = 1; //打开串口接收中断
EA = 1; //打开所有中断
}
char putchar(char c)
{
Uart1_SendChar(c);
return c;
}
void Uart1_SendChar(unsigned char Udat)
{
SBUF=Udat; //将要发送的数据放入串口数据缓冲区
while(!TI); //等待发送完成
TI=0; //清零TI发送完成标记
}
void main()
{
UartInit();
while(1) {
if(UartReadEnd == 1) { //如果接收结束了就开始数据处理输出
UartReadEnd = 0;
Tof250_dist = StringToDEC(&RxDat,j); //将接收到的字符串数组转换成整型输出
//printf("-----String%s\n",RxDat); //调试:直接打印出字符串数组,方便检测接收是否正确
printf("%u cm\n",Tof250_dist); //串口1直接打印输出
}
}
}
//串口中断处理函数
/**************************************************************
**TOF250串口输出格式:
**Ascii 输出
**单位为cm(默认)
**后跟转义字符\n
**例如:测距为 121cm,则输出字符串 121
****************************************************************/
void uart_Interrupt() interrupt 4
{
unsigned char UartData; //单字节串口数据
if(RI)
{
UartData = SBUF;
if(UartData != '\n') { //判断结束,如果结束了就不在接收
RxBuffer[RxCounter++] = UartData;
} else {
for(j = 0; j < RxCounter; j++) {
RxDat[j] = RxBuffer[j];
}
RxCounter = 0; //及时接收累加清0
UartReadEnd = 1; //接收完成的标志
}
RI = 0;
}
}
//字符串数组转换成数字
unsigned int StringToDEC(unsigned char data *rdata,unsigned char len)
{
unsigned char data i;
unsigned int wdata = 0;
unsigned char temp[4];
for(i=0; i<len-1; i++)
{
if((*(rdata+i) >= '0') && (*(rdata+i) <= '9')) temp[i] = *(rdata+i) - '0'; //字符串转换成数字
}
switch(i) {
case 1:
wdata = temp[i-1];
break;
case 2:
wdata = temp[i-2]*10 + temp[i-1];
break;
case 3:
wdata = temp[i-3]*100 + temp[i-2]*10 + temp[i-1];
break;
case 4:
wdata = temp[i-4]*1000 + temp[i-3]*100 + temp[i-2]*10 + temp[i-1];
break;
default:
break;
}
return wdata;
}
五、烧录说明
5.1 烧录接线示意图
5.2 烧录动态图
提示:烧录过程中请先断开TF250与STC12C5A60S2的TX\RX接线,否则无法正常烧录
六、结果输出
通过SSCOM串口软件打印结果(其他串口工具也可以)
提示:注意选择对应的波特率,此次测试使用波特率为9600