超声波测距
文章目录
1. 测量原理
中断计数即检测距离
检测高电平用P3.3脚
P3.3也是外部输入中断INT1脚,但本次实验与外部输入中断无关,仅利用P3.3引脚启停定时器
8位定时器不分频的满值是:256 * 0.033 = 8.5333us > 5.78us
因此满足测量条件
2. 软件编程
2.1 框架式编程结构搭建
新建,保存,添加
all.h—>xxx.h
xxx.c—>all.h
打标签
2.2 初始化函数
2.2.1 初始化函数框架
- 定时器1初始化函数
- 超声波初始化函数,声明
超声波初始化函数调用定时器初始化函数,主函数调用一次
2.2.2 定时器参数设置
- AUXR分频设置
- TMOD
使用定时器1
故先将TMOD高4位写0,再按要求写1
GATE置1,C/T置0,M1=1,M0=0
TMOD:1010 0000
- TR
- 装初值
要求:5.78us定时
脉冲数:5.78us/0.0333us=173.417个脉冲
初值:256-173.417=83
16进制:0x53
定时值到,进入中断
- 进入中断
EA在主函数已经置1
2.3 定时器1中断服务函数
2.3.1 测试1:产生中断,P30翻转
P30翻转逻辑分析仪抓取,查看定时中断时间
因无外部输入,故
结果接近5.78us
说明每5.78us进入1次中断
2.4 超声波服务函数
超声波目的在于对距离进行测量
定义定时器中断变量,产生中断+1,也即测量了1mm
那么何时计数停止增加呢
- 新建超声波服务函数,外部声明,同时新建数据分配函数,主函数调用
- 定义外部管脚发送触发信号
定义变量
变量=1将管脚拉高,并启动定时器开始测量,同样初始化定时器时TR1=0,测量1mm变量也要写0
变量=3将管脚拉低,测量脉冲发送结束,1~3保持高电平
注意:初始电平=0
- 新建测量结果输出变量
数码管显示
输出测量结果:
TMOD|=0XA0;重新赋值,等待外部高电平输入
计时时间=0
- 降低测量速度
由逻辑仪抓取值
换算成xxxus/5.78us,结合数码管测量值可看出测量结果的准确性
- 测量结果出现溢出,限制测量范围
总结:
超声波测距关键在于定时器的启动,启动由2个方面控制:INT1和TR1