【STC12C5A60S2】TOF250(TTL)基于51系列开发板的运用

7 篇文章 0 订阅
2 篇文章 0 订阅


一、前言

此片文章主要介绍如果通过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
请添加图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值