超声波模块驱动

超声波模块驱动

模块介绍

超声波模块驱动_第1张图片
超声波模块驱动_第2张图片
超声波模块驱动_第3张图片

程序编写

思路哈:我打算程序运行一次发送一次触发信号,在程序开头,就不精确延时几个指令周期,然后用外部中断
来个中断图
超声波模块驱动_第4张图片
使用中断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,发现有输出,最后发现是类型转换坑了我,不是它坑我,是我经验不够进了坑,下次注意。

你可能感兴趣的:(51单片机)