【四】【单片机】蜂鸣器,蜂鸣器模块化编程 1000HZ 鸣响 ms 毫秒,利用定时器让蜂鸣器以特定频率响 ms 毫秒

蜂鸣器模块化编程 1000HZ 鸣响 ms 毫秒

 
//Buzzer.h
#ifndef __BUZZER_H__
#define __BUZZER_H__void Buzzer_Time(unsigned int ms);#endif

Buzzer.h文件中只含有一个Buzzer_Time函数,这个函数用来让蜂鸣器以1000HZ固定频率发声ms毫秒。

 
//Buzzer.c
#include <REGX52.H>
#include <INTRINS.H>//蜂鸣器端口:
sbit Buzzer=P1^5;/*** @brief  蜂鸣器私有延时函数,延时500us* @param  无* @retval 无*/
void Buzzer_Delay500us()                //@12.000MHz
{unsigned char i;_nop_();i = 247;while (--i);
}/*** @brief  蜂鸣器发声* @param  ms 发声的时长,范围:0~32767* @retval 无*/
void Buzzer_Time(unsigned int ms)
{unsigned int i;for(i=0;i<ms*2;i++){Buzzer=!Buzzer;Buzzer_Delay500us();}
}

蜂鸣器中BEEP接口接入进电机中12号引脚,P15控制12号引脚,也就是P15高低电平控制蜂鸣器的高低电平。

如何让蜂鸣器响?首先我们要确定蜂鸣器的频率,也就是需要控制高电平低电平交替的周期。

for(i=0;i<ms*2;i++) { Buzzer=!Buzzer; Buzzer_Delay500us(); }

这段函数控制了蜂鸣器以高电平低电平进行交替。高电平维持 500 微秒,低电平维持 500 微秒,一个周期就是 1 毫秒,频率则为 1s/1ms=1000HZ,秒/毫秒等价于乘以 1000。

//蜂鸣器端口: sbit Buzzer=P1^5;

sbit是用于定义特殊功能寄存器的位变量的关键字。在 C51 扩展的变量类型中,sbitbit都是可以用来定义位操作的变量类型。通过使用sbit关键字,可以为特定的端口上的位取一个名字,这样就可以直接通过这个名字来访问和操作这些位,而不需要知道它们在内存中的具体地址。例如,在代码中使用sbit P0_0=P0^0;这样的语句,就是将P0_0定义为P0口的第1位,这样做是为了便于进行位操作。

在给定的问题中,sbit Buzzer=P1^5;的含义是定义了一个名为Buzzer的变量,这个变量指向P1口的第5位。也就是P1_5

其次我们需要控制蜂鸣器的鸣响时间,也就是以确定的周期为单位运行的总时长。

for(i=0;i<ms*2;i++) { Buzzer=!Buzzer; Buzzer_Delay500us(); }

我们已经固定了蜂鸣器的频率,为1000HZ,我们控制蜂鸣器鸣响ms毫秒,因此需要执行Delay500us延时函数ms*2次。

#include <INTRINS.H>头文件,对应使用_nop_();语句。

_nop_();在编程中通常表示一个空操作(no-operation)。它是一个什么也不做的指令,用于占位或确保代码结构的完整性,而不产生任何效果。在单周期指令中,可以通过晶振频率计算出具体的延时时间,例如对于 12M 晶振,延时 1 微秒(uS)。

利用定时器让蜂鸣器以特定频率响 ms 毫秒

 
//Timer0.h
#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0Init(void);#endif
 
//Timer0.c
#include <REGX52.H>/*** @brief  定时器0初始化,1毫秒@12.000MHz* @param  无* @retval 无*/
void Timer0Init(void)
{TMOD &= 0xF0;                //设置定时器模式TMOD |= 0x01;                //设置定时器模式TL0 = 0x18;                //设置定时初值TH0 = 0xFC;                //设置定时初值TF0 = 0;                //清除TF0标志TR0 = 1;                //定时器0开始计时ET0=1;EA=1;PT0=0;
}/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x18;                //设置定时初值TH0 = 0xFC;                //设置定时初值T0Count++;if(T0Count>=1000){T0Count=0;}
}
*/

定时器初始化函数里面是定时器最基本的配置。

TR0 = 1表示启动定时器,TR0 = 0表示关闭定时器。

TL0 = 0x18; TH0 = 0xFC;

两条语句是设置定时器开始计时的初值。

定时器启动之后,会从初值开始计时,直到超过65536us,此时打断进程去执行中断函数。

也就是定时器最多计时65536us

如果想要记录1s的时间,可以定义一个T0count变量记录有多少个1ms1s=1000*1ms

也就是我们需要让计时器记录1ms的时间,然后中断函数执行1000次的时候就是1s

让定时器记录1ms就需要改变定时器的初值,让初值等于64536us,此时过1ms之后定时器就会执行一次中断函数。

定时器每一次执行中断函数时,初值会默认置0,所以我们可以在中断函数中维护初值为64536us

定义初值为64536us,只需要TL0=64536%256;TH0=64536/256即可。

TL0表示低四位,TH0表示高四位,对256取余表示取低四位,除以256表示取高四位。

 
//Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif
 
//Delay.c
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
 
//mian.c
#include <REGX52.H>
#include "Timer0.h"
#include "Delay.h"
//蜂鸣器端口定义
sbit Buzzer=P2^5;
int us=500;
void main(){Timer0Init();TR0=0;while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);TR0=1;TL0=(65536-us)%256;TH0=(65536-us)/256;Delay(100);TR0=0;}}
}void Timer0_Routine() interrupt 1{
//        int us_max=65536;//        int us_num=us_max-us;TL0=(65536-us)%256;TH0=(65536-us)/256;Buzzer=!Buzzer;
}

我们需要控制蜂鸣器的频率和持续时间,控制频率相当于控制翻转蜂鸣器 IO 口的周期。只需要控制定时器即可。

int us=500;

void Timer0_Routine() interrupt 1{ // int us_max=65536; // int us_num=us_max-us; TL0=(65536-us)%256; TH0=(65536-us)/256; Buzzer=!Buzzer; }

定时器计时时长为500us,也就是500us翻转一次蜂鸣器IO口,蜂鸣器周期为1ms,频率为1s/1ms=1000HZ

1000HZ的频率让蜂鸣器响。

void main(){ Timer0Init(); TR0=0;

对定时器初始化之后先关闭定时器。 while(1){ if(P3_1==0){ Delay(20); while(P3_1==0); Delay(20); TR0=1; TL0=(65536-us)%256; TH0=(65536-us)/256; Delay(100); TR0=0; } }

当我们按下K1按键(对应P3_1=0)并且抬起按键的时候,启动定时器,并且修改定时器的初值,此时我们延时100ms,也就是让蜂鸣器以1000HZ100ms。响完之后关闭定时器。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习(二)

数据容器 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否支持重复元素是否可以修改是否有序&#xff0c;等 分为5类&#xff0c;分别是&#xff1a; 列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、字符串&#xff08;str&#xff09;、集…

09_Web组件

文章目录 Web组件Listener监听器ServletContextListener执行过程 Filter过滤器Filter与Servlet的执行 案例&#xff08;登录案例&#xff09; 小结Web组件 Web组件 JavaEE的Web组件&#xff08;三大Web组件&#xff09;&#xff1a; Servlet → 处理请求对应的业务Listener →…

Linux利用Jenkins部署SpringBoot项目保姆级教程

在当今快速发展的软件开发领域&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;已经成为提升开发效率、缩短产品上市时间的关键实践。Linux系统以其稳定性和开源友好性&#xff0c;成为众多开发者和企业的首选平台。而Spring Boot&#xff0c;作为一个轻量级的Jav…

飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress

文章目录 安装helm添加仓库下载包配置创建命名空间安装 安装helm https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gztar -xf helm-v3.2.3-linux-amd64.tar.gzcd linux-amd64mv helm /usr/local/bin修改/etc/profile 文件&#xff0c;修改里面内容,然后重新启用export PATH$P…

深入理解 Hadoop 上的 Hive 查询执行流程

在 Hadoop 生态系统中&#xff0c;Hive 是一个重要的分支&#xff0c;它构建在 Hadoop 之上&#xff0c;提供了一个开源的数据仓库系统。它的主要功能是查询和分析存储在 Hadoop 文件中的大型数据集&#xff0c;包括结构化和半结构化数据。Hive 在数据查询、分析和汇总方面发挥…

如何使用 Python 本地客户端操作读写云服务器 Redis 缓存数据库详细教程(更新中)

Redis 基本概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的使用 ANSI C 语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库&#xff0c;并提供多种语言的 API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value…

本地虚拟机服务器修改站点根目录并使用域名访问的简单示例

说明&#xff1a;本文提及效果是使用vmware虚拟机&#xff0c;镜像文件是Rocky8.6 一、配置文件路径 1. /etc/httpd/conf/httpd.conf #主配置文件 2. /etc/httpd/conf.d/*.conf #调用配置文件 调用配置文件的使用&#xff1a; vim /etc/httpd/conf.d/webpage.conf 因为在主配…

5个免费的3D钣金CAD软件

如果你正在设计简单的折叠钣金零件&#xff0c;则只需设计一些具有圆角半径的法兰&#xff1a;一个简单的钣金模块。 首先&#xff0c;你可以采用老式方式绘图并以 2D 方式完成所有操作。 许多传统制造商仍在使用 2D DWG 和 DXF 图纸。 因此&#xff0c;你很有可能只需快速起草…

【MySQL】DQL-聚合函数介绍&常见聚合函数&语法&注意事项&可cv例题语句

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

java Web 疫苗预约管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 疫苗预约管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

使用1panel部署Ollama WebUI(dcoekr版)浅谈

文章目录 说明配置镜像加速Ollama WebUI容器部署Ollama WebUI使用问题解决&#xff1a;访问页面空白 说明 1Panel简化了docker的部署&#xff0c;提供了可视化的操作&#xff0c;但是我在尝试创建Ollama WebUI容器时&#xff0c;遇到了从github拉取镜像网速很慢的问题&#xf…

公司官网怎么才会被百度收录

在互联网时代&#xff0c;公司官网是企业展示自身形象、产品与服务的重要窗口。然而&#xff0c;即使拥有精美的官网&#xff0c;如果不被搜索引擎收录&#xff0c;就无法被用户发现。本文将介绍公司官网如何被百度收录的一些方法和步骤。 1. 创建和提交网站地图 创建网站地图…

Matlab|孤岛划分|弹性配网故障划分模型

目录 1 主要内容 1.1 DistFlow 模型 1.2 虚拟潮流 1.3 目标函数 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要复现《A New Model for Resilient Distribution Systems by Microgrids Formation》&#xff0c;建立灾害情况下配网优化孤岛划分方案&#xff0c;通…

【Linux】POSIX信号量{基于环形队列的PC模型/理解信号量的出现/参考代码}

文章目录 1.POSIX信号量1.1介绍1.2接口 2.基于环形队列的PC模型2.1环形队列常用计算2.2如何设计&#xff1f;2.3如何实现&#xff1f; 3.细节处理3.1空间资源和数据资源3.2push/pop3.3理解信号量的出现1.回顾基于阻塞队列的PC模型中条件变量的使用2.如何理解信号量的投入使用&a…

P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值

题目描述 给定一棵包含 &#xfffd;N 个节点的完全二叉树&#xff0c;树上每个节点都有一个权值&#xff0c;按从上到下、从左到右的顺序依次是 &#xfffd;1,&#xfffd;2,⋯&#xfffd;&#xfffd;A1​,A2​,⋯AN​&#xff0c;如下图所示&#xff1a; 现在小明要把相同…

9.动态规划——1.从递归到动态规划

例题——N阶楼梯上楼问题 分析 大事化小&#xff1a;爬N层有F(N)种可能&#xff0c;有 F ( N ) F ( N − 1 ) F ( N − 2 ) F(N)F(N-1)F(N-2) F(N)F(N−1)F(N−2)小事化了&#xff1a; F ( 1 ) 1 &#xff0c; F ( 2 ) 2 F(1)1&#xff0c;F(2)2 F(1)1&#xff0c;F(2)2 …

IDE/VS2015和VS2017帮助文档MSDN安装和使用

文章目录 概述VS2015MSDN离线安装离线MSDN的下载离线MSDN安装 MSDN使用方法从VS内F1启动直接启动帮助程序跳转到了Qt的帮助网页 VS2017在线安装MSDN有些函数在本地MSDN没有帮助&#xff1f;切换中英文在线帮助文档 概述 本文主要介绍了VS集成开发环境中&#xff0c;帮助文档MS…

R语言颜色细分

1.如何对R语言中两种颜色之间进行细分 2.代码&#xff1a; x <- colorRampPalette(c("#FC8D62","#FDEAE6"))(12) #打印向量值 # 按字典顺序排序颜色值 x_sorted <- sort(x,decreasing TRUE)# 打印排序后的颜色值 print(x_sorted)#展示颜色 scales:…

Linux系统---如何理解Linux中的文件系统

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、理解文件系统 1.ls与stat 我们使用ls -l的时候看到的除了看到文件名&#xff0c;还看到了文件元数据。 每行包含7列…

神经网络与深度学习(一)

线性回归 定义 利用数理统计中回归分析&#xff0c;来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法 要素 训练集&#xff08;训练数据&#xff09;输出数据拟合函数数据条目数 场景 预测价格&#xff08;房屋、股票等&#xff09;、预测住院时间&#…