单片机如何关掉蜂鸣器_如何有效编程单片机有源蜂鸣器驱动
蜂鸣器是很常见的设备,分为无源和有源两种。根据项目需求选择不同类型的蜂鸣器。最近的项目里有用到有源蜂鸣器对有源蜂鸣器。还是老一套,把电路板画完,接着编程。
在项目中原理图如下:
如果不能保证I/O的输出性能可以根据情况增加上拉或者下拉电阻。
切入正题:在程序里面这个蜂鸣器的驱动就是个高低电平驱动。高电平三极管导通、蜂鸣器发声,低电平三极管关断、蜂鸣器不发声。这的确很简单,程序上最开始我是这样写的:
当然,如果单片机没有很好的I/O跳变函数也可以这样修改:
这里稍作解释:
1)
函数功能:蜂鸣器发声驱动
传入参数:蜂鸣器发声的次数
2)
传入的次数cnt需要再函数内翻倍。这是因为传入的参数是想让蜂鸣器连续的发cnt声。但是蜂鸣器除了发声还有不发声的时候。也就是说蜂鸣器每响一次都需要关闭一次,如果没有关闭操作肯定就不会出现响几声而是连续的响一声,这个也很容易推理。
3)
在while循环完之后需要加一个蜂鸣器关闭操作。
这里假如传进的参数是2,目的是让蜂鸣器响两声。根据程序的执行步骤:
cnt2变成4。
第1次while(4) 蜂鸣器开 cnt自减到3
第2次while(3) 蜂鸣器关 cnt自减到2
第3次while(2) 蜂鸣器开 cnt自减到1
第4次while(1) 蜂鸣器关 cnt自减到0
第5次while(0) 跳出while
可以看出其实在while之后蜂鸣器状态已经是关闭的了,但是保险起见,确保函数调用完之后蜂鸣器是关闭的状态。比如第一个函数I/O跳变的就更需要保障了,因为代码上只能看出跳变,看不到跳变之后的状态。
至此,一个简单的蜂鸣器电路和驱动程序就都温习完了,接下来上干货:
在写程序的时候很多时候讲究程序的效率,比如这个蜂鸣器驱动,驱动过程中会降低效率,厉害的人很快能看出来,就是这个Delay延时的问题。但是上面也说了,不延时也是不行的。所以趋于效率我尝试着换了一种方法驱动蜂鸣器。
代码如下:
实现起来也很简单,简单说下原理:
1)首先是提供蜂鸣器驱动的I/O配置,
2)其次是定时器的配置
3)最后是定时器中断函数实现
我选用的定时器是项目单片机中最简单的一个定时器,配制成1ms中断,能够提供溢出中断。其实这个定时器我常用做计系统运行时间Systick_ms。但是该项目对这个系统时间没有用到,那就用这个定时器做文章把。
实现方法:
1、同样函数在调用蜂鸣器驱动的时候接口是一样的,传入的参数还是蜂鸣器的响声次数。
2、函数体变了,这里改成了两个变量的赋值,第一个BELL_CNT同普通方法中的cnt2,这里不再赘述。第二个是FLAG_BELL是用来保存蜂鸣器是否需要驱动的状态变量。所以既然是调用驱动函数,那肯定这个变量要为真。
3、定时器中断函数里面加上了一个静态变量NOW,他的作用就是和Systic_ms产生一个50ms的时间片,干嘛用?肯定是给蜂鸣器开关之间的延时用咯。模拟软件延时嘛。然后再来分析下这段代码:
1)首先这个NOW和Systic_ms是无条件需要赋值保证50ms时间片的。对应的代码为NOW=Systick_ms+50;
2)判断蜂鸣器驱动状态变量是不是真,如果不为真就关闭蜂鸣器,这个也是无条件的。
3)如果状态变量为真:蜂鸣器先跳变Bell_Tog();当然如果没有这个跳变函数也可以用上述的判断cnt的方法,就不多写了都是一样的。同时次数自减BELL_CNT--;同时判断是不是减到0了,减到0了说明响完了啊,那就把状态变量赋值为假。再次进来不管蜂鸣器是开着的还是关着的都会执行关闭操作,这个跟上面说的保险一样。
4)最后,这两个变量用的是全局变量,这里是以结构体的形式呈现的,因为很多情况这两个函数不在一个C里面。如果硬要写在一个C可以忽略本条。
为了方便大家更好的学习,畅学电子网特别增加了针对单片机和EDA的公众号,每天推送相关知识,希望能对你的学习有所帮助!
单片机如何关掉蜂鸣器_如何有效编程单片机有源蜂鸣器驱动相关推荐
- 单片机原理及应用c语言编程,单片机原理及应用(C语言版)
目录 模块1单片微型计算机 项目1:认识单片微型计算机 任务11:认识单片机 任务12:相关知识 项目2:认识单片机应用 任务21:了解单片机应用 任务22:相关知识 项目3:认识仿真软件Pr ...
- 单片机位寻址举例_基于80C51单片机位寻址编程
80C51单片机有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式.所谓位寻址,就是对内部RAM或可位寻址的特殊功能寄存器SFR内的某个位,直接加以置位为1或复位为0. 位寻址的范围,也就是 ...
- 单片机定时器精准定时_通过51单片机定时器/计数器实现精确延时
MCS-51单片机内部共有两个16位可编程定时器,计数器,即TO.Tl.既有定时功能,又有计数的功能.每个定时器都是由两个8位的特殊功能寄存器THi和TLi组成(i=0.1).TMOD是TO和Tl的工 ...
- 单片机DA转换实验c语言编程,单片机DA转换实验报告
实验九D/A实验报告 ㈠实验目的 1.掌握单片机与D/A的接口及编程方法: 2.通过D/A动态波形输出进一步理解D/A的工作原理: 3.结合实验六中的A/D来检验软硬件的正确性. 4.进一步了解单片机 ...
- 单片机彩灯移动实验_实验一 单片机彩灯控制器的电路设计与仿真
实验一 单片机彩灯控制器的电路设计与仿真 一.实验要求 仿照图 1-1 在 Proteus 中绘制一个基于 89C51 的流水灯控制器电路,开关可以控制流动 的方向,拨码开关可以调整流动的快慢. 二. ...
- 蓝桥杯单片机国赛客观题_蓝桥杯单片机比赛历年试题获取
蓝桥杯单片机比赛历年试题获取!!! 准备蓝桥杯蓝桥杯比赛除了对板子各个模块的熟悉外,还有一件事,那就是把它们综合起来运用.当你单独使用板子上的某一个模块时,可能不会有什么问题,甚至对已经反复练习过后的 ...
- 单片机C语言流水灯花样编程,单片机C语言程序设计:花样流水灯
/* 名称:花样流水灯 说明:16 只 LED 分两组 按预设的多种花样变换显示 */ #include #define uchar unsigned char #define uint unsi ...
- 单片机音频节奏灯_如何用单片机做出用音乐节奏来控制LED灯?
我新安装了系统.驱动怎么办 如果你安装了操作系统,需要安装随机带的主板驱动,如果没有请安装下面的驱动.如果需要安装驱动,建议安装驱动精灵2008 ,安装之后,使用其自动更新驱动功能,它会自动下载并安装 ...
- stm32单片机屏幕一直闪_基于STM32单片机实现屏幕休眠后OLED屏幕滚动效果
这次做项目时需要实现OLED屏幕上字符滚动的功能,从网上找到一个参考:https://blog.csdn.net/tbmmagic/article/details/111999673 int main ...
- 汉语计算机系统,汉语编程单片机的计算机系统
本发明涉及一种汉语编程单片机的计算机系统,即汉语编程单片机.工控机是一种基于汉语计算机语言的单片机和工业控制机计算机系统.它适用于工业.农业.医疗.教育.环境.交通以及家庭等等行业的实时操作的应用. ...
最新文章
- android checkbox状态不刷新,android开发分享更改checkbox的值,而不触发onCheckChanged
- 未来几年,人工智能就业市场将会如何?
- 寻找唯一特等奖java,大工斩获唯一特等奖!这次,请为我工老师疯狂打call!
- SVM学习——在matlab上安装libsvm库(一)
- 非等值连接,外连接,自连接,子查询
- 解决:XXX类存在 却报错 Unkonwn class:‘XXX‘ 、@Autoeired 注入失败
- OpenCV计算机视觉实战(Python版)_005图像的梯度处理
- python怎么读发音百度翻译-用python实现百度翻译
- [转载] python 去除字符串中指定字符
- WINDOWS下,找包含特殊字串的文件的解决办法
- 编写一个以C 语言为基础的DSP程序
- 机顶盒及编解码器的音视频质量评价测试
- Ticket管理工具:Redmine
- 跨域 SameSite secure
- python 操作excel排序_python操作excel[转]
- 塔防三国志服务器维护时间,塔防三国志中期玩家教程攻略详解
- python获取今日头条搜索信息_python爬虫(十二、爬取今日头条关键词所有文章)
- 计算机进去bios方式,电脑进入BIOS的两种实用方法
- chrome android 中文版下载,Chrome浏览器安卓版
- C# 远程唤醒(远程开机)
热门文章
- 阿里CEO张勇:“亲亲节”预示未来年轻人生活方式
- Typora+picgo+gitee图片外链失效,Typora历史笔记无法显示图片
- GNSS 观测 O 文件的解读
- qq群发信息显示服务器检测到,QQ昨夜出现功能异常 你以为没发出去的消息都被对方看见了...
- 单词记忆法,由遗忘曲线制定而成
- 记忆测试系统c语言,单词记忆测试器程序设计.doc
- 设置gmail邮箱代收的方法
- 关于淘宝商品信息的爬虫
- windows mac谷歌浏览器跨域
- PHP8.0尝鲜系列(一):Windows 10安装PHP8.0