超声波模块驱动

超声波模块驱动

模块介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序编写

思路哈:我打算程序运行一次发送一次触发信号,在程序开头,就不精确延时几个指令周期,然后用外部中断
来个中断图
在这里插入图片描述
使用中断0吧
再看看定时器,打算用定时器4(STC创新的,嘿嘿看看靠不靠谱)
在这里插入图片描述
我说呢,stc15w4k32s4不是单时钟周期吗,定时11.0592M晶振怎么弄,原来这里可以控制系统时钟分频。

最后采用了一个非常帅气的写法,不用任何中断,使用逻辑门的思想,让定时器控制寄存器的GATE为1
当中断和定时器使能同时符合的时候,定时器才开始定时,直接去查询定时器的TH和TL,查完就清空。

但是出了一个两小时的bug。。。debug能力不够强悍

unsigned int time = 0;
unsigned int distance = 0;

//	distance = (12 * time/MAIN_Fosc)*340/2 * 100
	distance = time / MAIN_Fosc * 204000 ; // 单位cm <<<<<<<<<<<错
	distance = 204000 * time / MAIN_Fosc ; // 单位cm <<<<<<<<<<<对

第一个错的原因是,除完得到浮点数,强制类型转换后得到0,所以最后显示屏上显示的结果一直是1。
但是debug又是凭着感觉干活,还是得理论分析一下,让每一次bug都有归属,下次就能避免或者更快的解决。
1、
实验现象与期望不符,但是错误的实验现象具有干扰现象。
首先:输出结果是0,让人感觉好像超声波模块没有工作。
再者:我虽然知道超声波模块工作起来有声音,没想到这么小,再加上我写的延时比较长,更听不见声音了。
所以,我选择使用开发板和其配套的实验,去验证超声波模块是否正常。
结果是:正常。
是不是以后使用模块都先试一下模块是否良好,事先排除这种bug的不确定性,我感觉可以有。
2、
最后是怎么解决的呢?
使用keil的debug查看寄存器状态,这个能力需要加强,说实话不怎么会使,但是发现TH1、TL1都不是0x00,说明程序已经按期望运行了。
有一个自己坑自己的地方是:

	unsigned int distance = 0;

这个初值赋的,太巧合了。。。。。计算的结果也是0,让人感觉根本没计算。。。。

	// 返回计算的距离
	return distance;
	return time;

我把return的结果改为time,发现有输出,最后发现是类型转换坑了我,不是它坑我,是我经验不够进了坑,下次注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

匿名匿名匿名11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值