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

本文主要是介绍【四】【单片机】蜂鸣器,蜂鸣器模块化编程 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。响完之后关闭定时器。

结尾

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

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

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

这篇关于【四】【单片机】蜂鸣器,蜂鸣器模块化编程 1000HZ 鸣响 ms 毫秒,利用定时器让蜂鸣器以特定频率响 ms 毫秒的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862857

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关