您的位置  > 互联网

单片机I/O跳变函数的原理图及修改方法

如果无法保证I/O输出性能,可以根据情况添加上拉或下拉电阻。

言归正传:程序中的蜂鸣器驱动是高低电平驱动。 当高电平晶体管导通时,蜂鸣器鸣叫; 当低电平晶体管截止时,蜂鸣器不发声。 这确实很简单。 我最初是这样写程序的:

当然,如果单片机没有好的I/O跳转功能,也可以这样修改:

这里有一点解释:

1)

功能:蜂鸣器声音驱动

传入参数:蜂鸣器响的次数

2)

函数内传入的cnt次数需要加倍。 这是因为传入的参数是想让蜂鸣器连续发声。 但蜂鸣器除了发声之外,也有不发声的时候。 也就是说,蜂鸣器每次响起都需要关闭。 如果没有关闭操作,肯定不会发出几声嘟嘟声,而是连续一声嘟嘟声。 这也很容易推理。

3)

while循环完成后,需要添加蜂鸣器关闭操作。

如果这里传入的参数为2,目的是让蜂鸣器响两声。 根据程序的执行步骤:

cnt2 变为 4。

第一个 while(4) 蜂鸣器亮,cnt 减至 3

第二个while(3)蜂鸣器关闭,cnt减至2

第三个while(2)蜂鸣器亮,cnt减至1

第4个while(1)蜂鸣器关闭,cnt减至0。

第五个while(0)跳出while

可以看到,一会儿之后蜂鸣器状态实际上是关闭的,但是为了安全起见,请确保调用该函数后蜂鸣器是关闭的。 比如第一个函数的I/O跳转就更需要保护了,因为代码中只能看到跳转,但是看不到跳转后的状态。

至此,我已经完成了一个简单的蜂鸣器电路和驱动器的审查。 让我们继续讨论实际的事情:

在编写程序的时候,我们常常关注程序的效率。 例如,这种蜂鸣器驱动器在驱动过程中会降低效率。 技术人员很快就能看出这是延迟的问题。 但正如上面提到的,不拖延是不可能的。 所以为了效率,我尝试改变蜂鸣器的驱动方式。

代码如下所示:

实施起来也非常简单。 我们简单说一下原理:

1)首先是提供蜂鸣器驱动器的I/O配置。

2)接下来是定时器的配置

3)最后定时器中断函数的实现

我选择的定时器是项目单片机中最简单的定时器。 它配置有1ms中断,并且可以提供溢出中断。 事实上,我经常使用这个计时器来测量系统运行时间。 但本项目并没有使用这个系统时间,所以就用这个定时器来做文章。

执行:

1、同一个函数调用蜂鸣器驱动时,接口是一样的,传入的参数仍然是蜂鸣器的数量。

2.函数体发生了变化。 它已更改为两个变量的赋值。 第一个与普通方法中的cnt2相同,这里不再赘述。 第二个用于保存是否需要驱动蜂鸣器的状态变量。 所以既然调用了驱动函数,这个变量就必须为true。

3、定时器中断函数中添加一个静态变量NOW。 它的作用是生成一个50ms的时间片。 为什么使用它? 它必须用于蜂鸣器开关之间的延迟。 模拟软件延迟。 那么我们来分析一下这段代码:

1)首先这个NOW sum需要无条件赋值,保证50ms的时间片。 对应的代码是NOW=+50;

2) 判断蜂鸣器驱动状态变量是否为真。 如果不正确,请关闭蜂鸣器。 这也是无条件的。

3)如果状态变量为true:蜂鸣器先跳(); 当然,如果没有这个跳转函数,也可以使用上面判断cnt的方法,同样的,不再赘述。 同时次数递减——; 同时判断是否已经减为0,如果减为0,则说明振铃结束,则将状态变量的值赋为false。 当再次进来时,无论蜂鸣器打开还是关闭,都会执行关机操作。 这和上面提到的保险是一样的。

4)最后,这两个变量使用了全局变量,这里以结构体的形式呈现,因为很多情况下这两个函数并不在同一个C中,如果你坚持用C写,可以忽略这篇文章。

荣源电子子网为您提供技术支持