4.蜂鸣器实验

#include "reg52.h"

typedef unsigned int u16;    //对系统默认数据类型进行重定义
typedef unsigned char u8;

sbit BEEP=P2^5;    //将P2.5管脚定义为BEEP
void delay_10us(u16 ten_us)
{
    while(ten_us--);    
}

void main()
{    
    u16 i=2000;

    while(1)
    {
           while(i--)//循环2000次
        {
            BEEP=!BEEP;//产生一定频率的脉冲信号
            delay_10us(100);
        }
        i=0;//清零
        BEEP=0;//关闭蜂鸣器
    }        
}

1. 包含头文件

#include "reg52.h"

这一行代码包含了一个名为reg52.h的头文件,这个头文件通常包含了8051单片机的一些特殊功能寄存器的定义。这些定义对于编写针对8051单片机的程序是必要的。

2. 类型重定义

typedef unsigned int u16; // 对系统默认数据类型进行重定义typedef unsigned char u8;

这里使用了typedef关键字来创建新的数据类型别名。u16是无符号整型(unsigned int)的别名,u8是无符号字符型(unsigned char)的别名。这样做可以使代码更加清晰,并且在修改数据类型大小时只需更改别名定义,而不需要修改整个程序。

3. 定义蜂鸣器管脚

sbit BEEP=P2^5; // 将P2.5管脚定义为BEEP

sbit是8051单片机中用于定义单个位的关键字。这里将P2端口的第5位定义为BEEP,用来控制蜂鸣器。

4. 延时函数

void delay_10us(u16 ten_us){    while(ten_us--); // 循环直到ten_us为0}

这个delay_10us函数用于创建一个短暂的延时。函数接受一个参数ten_us,这个参数的值在进入函数后开始递减,直到为0。由于8051单片机的每个机器周期的时间是固定的,这个简单的循环可以创建一个大约10微秒的延时。不过,实际的延时时间会受到单片机的时钟频率和编译器的代码优化影响。

5. 主函数

void main(){     u16 i=2000; // 定义一个变量i,并初始化为2000    

while(1) // 无限循环  

  {        while(i--) // 循环2000次     

   {            BEEP=!BEEP; // 切换BEEP的状态,产生脉冲信号           

 delay_10us(100); // 延时大约100微秒        }     

   i=0; // 重置i的值为0        BEEP=0; // 关闭蜂鸣器    

}

}

main函数是程序的入口点。在这个函数中,首先定义了一个u16类型的变量i并初始化为2000。然后进入一个无限循环,在循环中,通过一个内部的while(i--)循环来控制蜂鸣器发声。每次循环,都会通过BEEP=!BEEP切换BEEP管脚的状态,从而产生一定频率的脉冲信号来驱动蜂鸣器发声。delay_10us(100)函数被调用来在每次状态切换后产生延时。 当内部循环的i减到0时,外部循环的i=0语句会将i重置为0,并通过BEEP=0关闭蜂鸣器,停止发声。然后程序会重新开始新一轮的循环。

详细解释

让我们详细解释一下这个操作:

- `!` 是逻辑非(NOT)运算符。在C语言中,它用来取反一个布尔表达式的值。如果变量的值为1(真),那么`!`运算符会将其变为0(假);如果变量的值为0(假),那么`!`运算符会将其变为1(真)。

- `BEEP` 是一个位变量,它直接对应于8051单片机P2端口的第5位。在8051单片机中,一个端口(如P2)是一个8位的寄存器,每一位可以独立地被设置为高电平(1)或低电平(0)。

因此,当你执行 `BEEP=!BEEP;` 这行代码时,实际上是在做以下操作:

1. 检查`BEEP`位当前的状态(是0还是1)。

2. 将这个状态取反:

如果`BEEP`是0,那么`!BEEP`就是1;

如果`BEEP`是1,那么`!BEEP`就是0。

3. 将这个取反后的状态赋值回给`BEEP`位。

在蜂鸣器实验中,这个操作用于生成一个方波信号,因为蜂鸣器是一个无源蜂鸣器,它需要一个方波信号来驱动。通过快速地在高电平和低电平之间切换`BEEP`的状态,就可以产生一个音频信号,这个信号的频率取决于状态切换的速度。

在代码中,`BEEP=!BEEP;`后面跟着一个延时函数调用`delay_10us(100);`,这个延时决定了状态切换的频率。在这个例子中,如果`delay_10us(100)`产生的延时是100微秒,那么每100微秒`BEEP`的状态就会翻转一次,从而产生一个频率约为10kHz的方波信号,这个频率的声波在人耳的听觉范围内,因此我们会听到蜂鸣器发出声音。

在这段代码中,外部循环的`i=0`语句用于重置变量`i`的值,这是为了控制蜂鸣器发声后停止发声的逻辑。这个重置操作是必要的,因为它标志着一个发声周期的结束,并为下一个发声周期做准备。下面是详细解释:

1. **控制发声周期**:内部`while(i--)`循环用于控制蜂鸣器发声的持续时间。每次循环,`i`的值都会减少1,直到`i`的值减到0。当`i`为0时,内部循环结束,此时蜂鸣器已经发声了一段时间(由`i`的初始值决定)。

2. **停止发声**:一旦内部循环结束,`i`的值已经为0。此时执行`BEEP=0;`语句,将蜂鸣器的控制位设置为低电平,从而关闭蜂鸣器,停止发声。

3. **准备下一个周期**:为了开始下一个发声周期,需要重新设置`i`的值,使其回到初始状态(在这个程序中是2000)。这样,当外部循环继续时,`i`将再次从2000开始递减,从而再次启动内部循环和蜂鸣器的发声。

4. **循环逻辑**:`i=0;`语句确保了每次外部循环结束时,`i`都会被重置。这个重置操作是外部循环控制逻辑的一部分,它允许程序无限循环地重复发声和停止发声的周期。

简而言之,`i=0;`语句是控制蜂鸣器发声和停止发声的关键。通过重置`i`的值,程序能够周期性地控制蜂鸣器,使其按照预定的时间间隔发声和停止。这是嵌入式系统中常见的一种定时控制方法,通过循环和计数来实现对硬件设备(如蜂鸣器)的控制。

总结

这个程序通过控制P2.5管脚的高低电平变化来驱动蜂鸣器发出声音。通过内部循环控制发声的频率,外部循环控制发声的持续时间。每次外部循环结束时,蜂鸣器会停止发声,直到下一次外部循环开始。这个程序是学习8051单片机基础控制的一个很好例子。

`BEEP=!BEEP;` 这行代码是8051单片机C语言编程中的一个常见用法,用于翻转(或称为取反)某个位的状态。在这个特定的程序中,`BEEP`是一个已经被定义为P2端口第5位的位变量(`sbit BEEP=P2^5;`)。这行代码的作用是生成一个用于驱动蜂鸣器的脉冲信号。

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

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

相关文章

大厂基础面试题(之二)

Q1:flex布局 Flex布局容器属性包括: flex-direction: 定义主轴的方向,决定flex容器中的子元素的排列方式 flex-wrap:设置子元素是否换行 flex-flow:是flex-direction和flex-wrap的简写形式,用于设置容器的排…

大话设计模式——22.访问者模式(Visitor Pattern)

简介 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作 UML图 应用场景 适用于数据结构相对稳定且算法易于变化的系统,该模式将数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合…

创建sftp用户,自行把cywl替换成别的用户

# 创建新的用户组 groupadd sftpcywl # 添加用户组sftpcywl# 创建新用户,设置其主目录和禁止登录shell useradd -G sftpcywl -d /home/sftp/cywl -s /sbin/nologin cywluser # 创建用户cywluser,加入sftpcywl组,设置主目录,并禁止…

react 初学增删改查购物车案例

界面 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>react-购物车案例</title><…

WebService反向代理的配置和

WebService反向代理的配置和 家都知道&#xff0c;联网上有很多被墙了的网站&#xff0c;虽然这是让人很伤心的一件事情&#xff0c;但还好咱们有办法绕过这个限制&#xff0c;那就是使用IP代理。今天我就来给大家讲讲如何配置和使用WebService反向代理。 什么是WebService反向…

maven之pom中的build标签

1、build标签分类 1.1、全局配置&#xff08;project build&#xff09; 针对整个项目的所有情况都有效。 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"htt…

常见的垃圾回收器(上)

文章目录 Serial垃圾回收器 SerialOld垃圾回收器PS POParNewCMS 常见的垃圾回收器&#xff08;下&#xff09; Serial垃圾回收器 SerialOld垃圾回收器 Serial是一种单线程串行回收年轻代的垃圾回收器 回收年代和算法 年轻代&#xff1a;复制算法 老年代&#xff1a;标记-整…

Autosar初学习

前言&#xff1a; 已下面这张图为例&#xff0c;进行Autosar初学习中SWC设计。 简单解释一下这张图&#xff0c;S-R Interface中 Receive Port的话有两个 分别是输入SeatSwitch和PowerManagement; Sender Port有一个 DialLED&#xff0c; 有一个标定量Calibration 1、Simulink…

openjudge_2.5基本算法之搜索_1756:八皇后

题目 1756:八皇后 查看提交统计提问 总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚&#xff1a;皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上&#xff08;有8 * 8个方格&#xff09;&#xff0c;使它们谁也不能被吃掉&am…

java求三个整数x,y,z中的最大值

求三个整数x,y,z中的最大值&#xff08;使用三元运算符&#xff09; 定义三个int类型变量,x,y,z&#xff0c;随意赋值整数值 定义一个int类型变量max&#xff0c;先存储x与y中的最大值&#xff08;使用三元运算符&#xff09; 再次对max赋值&#xff0c;让它等于上面max与z中…

一些知识点小细节

当遇到的问题有关逆序输出&#xff0c;可以转换一下思想&#xff0c;就是使用for循环的时候&#xff0c;i的初始化是从数组或者是字符串的最后一个&#xff0c;然后注意设置循环结束的条件&#xff0c;最重要的是不要忘记i--;而不是I&#xff1b; 注意&#xff1a;当要逆序输出…

OpenHarmony实例:【资源管理器】

介绍 本工程使用[ohos.app.ability.common] 接口中的AbilityContext类&#xff0c;获取资源管理器resourceManager&#xff0c;使用[ohos.resourceManager.d.ts]中的接口&#xff0c;展示了格式化字符串查询、基于指定屏幕分辨率查询媒体资源、获取系统资源管理对象等基础功能…

Trinamic步进电机控制模块助力抗击疟疾

疟疾是世界上最致命的传染病之一。这种疾病在亚洲、非洲和南美洲的热带地区十分常见&#xff0c;越早诊断&#xff0c;越能有效治疗。标准疟疾检测需要由训练有素的技术人员在显微镜下检测血液样本&#xff0c;以确认是否存在疟原虫&#xff0c;以及疟原虫的数量和类型。仅在印…

弱口令入侵FE企业管理平台【附口令】

漏洞描述 飞企互联-FE企业运营管理平台 druid路径弱口令&#xff0c;攻击者可能通过尝试弱口令&#xff0c;非法进入系统&#xff0c;恶意操作或者收集信息进一步攻击利用。 漏洞复现 1、Fofa app"飞企互联-FE企业运营管理平台"2、零零信安 (html_banner360浏览…

前端使用minio传输文件

minio官方文档 minio-js可以支持ts。 安装完可能会出现 Can‘t import the named export ‘xxx‘ from non EcmaScript module (only default export is available)可以尝试降低minio的版本 npm install minio7.0.18 --save代码&#xff1a; 初始化 const Minio require(…

Java 10 新特性

Java 10 新特性 Java10它号称有109项新特性&#xff0c;包含12个JEP。 需要注意的是&#xff0c;本次Java10并不是Oracle的官方LTS版本&#xff0c;所以咱们可以先了解新特性。然后坐等java11的发布再考虑在生产中使用吧。 特性列表 局部变量的类型推断 var关键字 GC改进和…

【python】基于pyttsx3库的字符串转音频文件

一、源码 import pyttsx3 engine pyttsx3.init() engine.setProperty(volume, 0.8) engine.setProperty(rate, 150) engine.save_to_file("Hello, World!", "output.mp3") engine.runAndWait()二、介绍 使用pyttsx3库&#xff0c;设置声音与速率&#x…

聊一聊一些关于npm、pnpm、yarn的事

前言 整理了最近的闲聊&#xff0c;话题是前端各个包管理器&#xff0c;如果分享的不对或者有异议的地方&#xff0c;麻烦请及时告诉我~ 耐心看完&#xff0c;也许你会有所收获~ 概述 本文阅读时间&#xff1a;10-15分钟左右&#xff1b; 难度&#xff1a;初级&#xff0c…

【回溯】Leetcode 51. N 皇后【困难】

N 皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。…

C# Web应用调用EXE文件的一些实践

目录 需求 范例运行环境 可执行文件的设计 调用可执行文件方法 RunExecuteFile RunShellExecuteFile 方法的区别 WEB调用举例 小结 需求 最近同事使用Python开发了一款智能文字转语音的程序&#xff0c;经讨论部署在WINDOWS环境服务器下&#xff0c;因此需要生成目标…