用单片机的模拟串口读取TFmini的数据用单片机的模拟串口读取TFmini的数据
朱铮南
STC15W104单片机只有8个针脚,刚好满足读取激光测距模块TFmini的数据并用74HC595驱动的四位数码管显示所需要的针脚。遗憾的是STC15W104不具有串口功能,只能用普通针脚来模拟串口。
本文代码里的“读1帧函数”就是模拟串口。
激光测距模块TFmini输出的串口信号的波特率是115200,起始位和结束位各占1位,数据占8位,可以算出传输一位数据的时长是1000000us/115200=8.68us。
本例中的模拟串口采用了代码延时和定时器溢出中断相结合的方法,起始位开始后用代码延时3us再启动定时器,定时器溢出中断产生8.68us的时间间隔用来读取每一位的数据。定时器的初始化代码放在主函数一开头的地方。
![6396e16034c14925aaf8f5aee2d0c915.png](https://i-blog.csdnimg.cn/blog_migrate/3f3a02e1ac3c01939825dc31f2c01880.jpeg)
实践证明这个模拟串口工作非常稳定。
完整的代码如下。
/******************************************************************
**STC15W104模拟串口读TFmini,74HC595驱动数码管显示。朱铮南编写
*******************************************************************/
#include <STC15W.h>
#define uint unsigned int
#define uchar unsigned char
sbit DIO=P3^4; //串行数据输入
sbit RK=P3^2; //时钟脉冲信号——上升沿有效
sbit SK=P3^3; //打入信号——上升沿有
sbit RXD=P3^0; //模拟串口读入针脚
sbit SW_out = P3^5; //开关输出针脚
uchar K; //标志定时器0溢出中断是否发生
uchar END; //结束位
uchar MySBUF; //存放1帧数据
uchar value[9]; //存放9字节数据的数组
uint dist,dist1; //存放距离的变量
uint HEADER = 0x59; //帧头
uint th_value = 100; //设定开关阈值厘米
uchar code table[ ]= { 0xC0, //"0"
0xF9, //"1"
0xA4, //&