【【51单片机的蜂鸣器实现小星星】】

news2024/11/25 12:50:58

用单片机的蜂鸣,实现简单小星星

我们在设置板子的时候要翻转
翻转IO口是因为使用了步进电机的多余的芯片管脚
我们翻转之后还想让它保持一段时间
就是先翻转500次 Delay(1)之后 就是最小的单位每隔1ms 周期就是2ms 频率就是500HZ

蜂鸣器播放音乐
我们首先在前面到现在必须明白一个道理 就是我们的蜂鸣器发声是因为蜂鸣器的
在这里插入图片描述
我们可以不停的反转的电平,而且随着电平翻转频率的变化,它的音调也会变化,依据此原理可以用蜂鸣器来播放音乐。我们可以控制电平的时序,传递合适的周期以便于控制音调的高低。
我们可以这么想 ,就像一个鼓,我们如果不敲动,那么就不会发声。我们必须给他一个扰动 也就是翻转 。就像是我们控制
举例

void Timer0_Routine() interrupt 1
{
    
    TL0 = 64580%256;        //设置定时初值
    TH0 = 64580%256;        //设置定时初值
    Buzzer=!Buzzer; //蜂鸣器的频率
}

当我们在实现音乐控制的时候还会出现一个问题就是我们的数组前两个数字是一样的那该怎么办
这样听声音就会有一种顿挫感

unsigned char Music[]={12,12,19,19,21,21,19,17,17,16,16,14,14,12};

例如这是最经典的小星星的一段
我们最好在中间插入一点东西使得能够听出不一样的感觉

FreqSelect=Music[MusicSelect];
MusicSelect++;
Delay(500);
TR0=0;
Delay(5);
TR0=1;
  

做到这里我们会发现还有问题 我们看乐谱的时候就会发现有些音他是延长 而又有些音是两个音的组合成一个
那么在这里我们是否再提供一个数组用来确定
这时候我们想到上面的music 是一维数组的形式 我们可以将其改写为二维数组的形式
but 用一个数组也行 最好是二维更加清晰一点吧

FreqSelect=Music[MusicSelect];
MusicSelect++;
Delay(125*Music[MusicSelect]);
MusicSelect++;
TR0=0;
Delay(5);
TR0=1;
}

另外 我们拿到乐谱并不能很好的取一个基准 有很多16分 8分 4分频 我们按照男人的思维 用数学的逻辑 取最小的记为1 哪个最小就用哪个

unsigned char Music[]={
12,4,
12,4,
19,4,
19,4,
21,4,
21,4,
19,4+4,
17,4,
17,4,
16,4,
16,4,
14,4,
14,4,
12,4+4
};

    unsigned char FreqSelect,MusicSelect;
    
void main()
{
    
    Timer0Init();
    while(1)
    {
        FreqSelect=Music[MusicSelect];
        MusicSelect++;
        Delay(125*Music[MusicSelect]);
        MusicSelect++;
       TR0=0;
        Delay(5);
        TR0=1;
    }    
    
}

新修改的代码

还有乐谱中会出现休止符 休止符 就是不弹奏的意思
我们再开头插入一个0 为什么再开头不再结尾 其实你插入在哪里都可以 开头最好做好识别一点吧

另外作为一个数组 难免会出现越界的行为 声音走了 那么我们需要在特定位置增加一个判断确定声音是否越界
ok好了下面是小星星的完整代码

main.c

#include <REGX52.H>
#include "Delay.h"
#include"Timer0.h"

sbit Buzzer=P2^5;


#define SPEED 500  //我们以4分音符为基准
unsigned int FreqTable[]={
    0,
    63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64524,
    64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
    65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283
};

unsigned char Music[]={
13,4,
13,4,
20,4,
20,4,
22,4,
22,4,
20,4+4,
    0,4,
18,4,
18,4,
16,4,
16,4,
15,4,
15,4,
13,4+4,
    
    
    
    0xFF
};

    unsigned char FreqSelect,MusicSelect;
    
void main()
{
    
    Timer0Init();
    while(1)
    {
        if(Music[MusicSelect]!=0xFF)
        {
        FreqSelect=Music[MusicSelect];
        MusicSelect++;
        Delay(SPEED/4*Music[MusicSelect]);
        MusicSelect++;
       TR0=0;
        Delay(5);
        TR0=1;    
            
        }
        else
        {
            TR0=0;
            while(1);
            
        }
        
    }    
    
}


void Timer0_Routine() interrupt 1
{
    if(FreqTable[FreqSelect])
    {
        TL0 = FreqTable[FreqSelect]%256;              //设置定时初值
    TH0 = FreqTable[FreqSelect]/256;              //设置定时初值
    Buzzer=!Buzzer;     //蜂鸣器的频率
        
    }
    
    
    
    
}

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);
	}
}

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;
}

Timer0.h

#ifndef __TIMER0_H__
#define __TIMER0_H__

void Timer0Init(void);

#endif

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

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

相关文章

【040】巧妙地穿梭双端:掌握C++ STL中deque容器的强大功能

巧妙地穿梭双端&#xff1a;掌握C STL中deque容器的强大功能 引言一、deque容器概述二、deque容器实现原理三、deque容器常用API3.1、deque的构造函数3.2、deque的赋值操作3.3、deque的大小操作3.4、deque的双端插入和删除操作3.5、deque的数据存取3.6、deque的插入操作3.7、de…

Spring IOC AOP

IOC容器 概念 IOC&#xff0c;全程Inversion of Control&#xff08;控制反转&#xff09; 通过控制反转&#xff08;创建对象的权限交给框架&#xff0c;所以叫反转&#xff09;创建的对象被称为Spring Bean&#xff0c;这个Bean和用new创建出来的对象是没有任何区别的。 官…

排序算法第三辑——交换排序

目录 ​编辑 一&#xff0c;交换排序算法的简介 二&#xff0c;冒泡排序 冒泡排序代码&#xff1a;排升序 三&#xff0c;快速排序 1.霍尔大佬写的快速排序 2.挖坑法 3.前后指针法 四&#xff0c;以上代码的缺陷与改正方法 三数取中 三路划分&#xff1a; 五&#…

真的绝了,通过注释来埋点好简单!!

目录 回顾 开始 插件编写 功能一 功能二 功能三 合并功能 运行代码 总结 这篇文章主要讲如何根据注释&#xff0c;通过babel插件自动地&#xff0c;给相应函数插入埋点代码&#xff0c;在实现埋点逻辑和业务逻辑分离的基础上&#xff0c;配置更加灵活 回顾 上篇文章…

微服务系列文章之 Springboot应用在k8s集群中配置的使用

Docker部署其实也可以再docker run或者dockerfile里面&#xff0c;将配置文件目录映射到宿主机&#xff0c;然后通过宿主机配置文件修改参数。 FROM docker.io/python:3.6MAINTAINER tianye # 设置容器时间 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&am…

Windows安装Oh-My-Posh美化Powershell

Windows Terminal&#xff1a;https://www.microsoft.com/store/productId/9N0DX20HK701 最新Powershell下载&#xff1a;https://github.com/PowerShell/PowerShell/releases Oh-My-Posh官网&#xff1a;https://ohmyposh.dev/ Nerd字体下载&#xff1a;https://www.nerdfonts…

Git源代码管理方案

背景 现阶段的Git源代码管理上有一些漏洞&#xff0c;导致在每次上线发布的时间长、出问题&#xff0c;对整体产品的进度有一定的影响。 作用 新的Git源代码管理方案有以下作用&#xff1a; 多功能并行开发时&#xff0c;测试人员可以根据需求任务分配测试自己的功能&#…

MyBatis-Plus条件查询问题解决

问题描述 系统中有用户注册的功能&#xff0c;但是会出现重复注册的现象&#xff0c;代码中有做过重复校验&#xff0c;但是没有生效。 问题解决 首先排查数据生成时间点不同&#xff0c;相差时间有长有短&#xff0c;不是用户同时多次点击的原因&#xff0c;应该是用户这边…

js判断两个数组是增加还是删除

JS判断两个数组的数据&#xff0c;增加的数据以及删除的数据。 // 第一个参数是新数组&#xff0c;第二个参数是旧数 const compareArrays function(arr1, arr2 ) {let remove []let add []// 旧数据循环for (let i 0; i < arr2.length; i) {let item arr2[i];if (arr…

EvilBox---One靶机复盘

EvilBox—One靶机复盘 这个靶场学会了原来id_rsa的私钥可以直接爆破&#xff0c;利用ssh2john工具提取私钥&#xff0c;然后john直接爆破就可以了。 靶场下载地址&#xff1a;https://download.vulnhub.com/evilbox/EvilBox—One.ova 这个靶场是直接给ip地址的我们就不用扫描…

Spring Boot使用httpcomponents实现http请求

基于org.apache.httpcomponents的httpclient实现&#xff0c;其它的实现方式都行。 1. pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/…

快速实现主从表编辑,实现多个不定长从表

目录 1 前言 2 不定长表、定长表的定义 3 根据已有的电子表格制作数据库表并导入数据 3.1 订单 3.2 订单明细 3.3 客户 4 配置主从关联关系 5 继续增加一个主从关联关系 6 测试一下运行结果 7 一段代码用于实现在panel中画出字段列表面板 1 前言 实际工作中&#xff…

扑克牌检测Y8S

采用YOLOV8训练&#xff0c;得到PT模型&#xff0c;然后直接转ONNX&#xff0c;使用OPENCV的DNN&#xff0c;不需要其他依赖&#xff0c;支持C/PYTHON 扑克牌检测Y8S

数据结构(王道)——线性表的存储结构之顺序表

线性表和顺序表的关系&#xff1a; 两种实现方式&#xff1a;静态分配、动态分配 总结&#xff1a;

Win7如何合并C盘与D盘?

电脑C盘不够用&#xff0c;需要把D盘的卷删除并合并到C盘中。 整体步骤&#xff1a; 1.右击此电脑-管理-磁盘管理。 2.假如要把D盘容量合并到C盘&#xff0c;右击D盘&#xff0c;选择删除卷&#xff0c;点击“是”。此时D盘数据会被清空&#xff0c;建议先备份数据。 3.删除…

消息队列MQ入门理解

功能特性: 物联网应用 物联网设备通过微消息队列(LMQ)连接云端,双向通信,数据传输;设备数据通过消息队列(MQ)连接计算引擎,分析数据或者源数据实时高效写入到 HiTSDB / HiStore / ODPS 等。 大规模缓存同步 在商业大促活动中,如“双11”大促,各个分会场会有琳琅…

基于输出调节的一致性编队控制

参考博客&#xff1a; https://blog.csdn.net/weixin_44346182/article/details/131747082 在输出调节的基础上&#xff0c;实现了输出一致性&#xff0c;而编队控制就是没有偏移量的状态一致性&#xff0c;恰好本题的C矩阵就是系统的第一阶的状态&#xff08;位置&#xff0…

spring boot security自定义权限检查

前言 鉴权主要分为身份认证和权限控制两部分&#xff1a; 身份认证&#xff1a;检查当前用户是否合法&#xff08;比如已登录&#xff09; 权限控制&#xff1a;检查当前用户是否有访问该资源的权限 本文主要给出一个示例&#xff0c;说明如何自定义权限控制。 因为一个完整的…

增长能力模型:最大限度地发挥增长团队的潜力

作为增长领导者&#xff0c;准确评估你的组织和团队成员是一项非常重要且耗时的工作。但是如果我们计划为未来的增长领导者创造一条职业道路&#xff0c;我们就需要一个流程来为整个团队提供客观的反馈&#xff0c;这就是增长能力模型的用武之地。 增长能力模型提供了一个框架&…

argc,argv

文章目录 argc 是argument count的缩写表示传入main函数中的参数个数&#xff0c;包括这个程序本身 argv 是 argument vector的缩写表示传入main函数中的参数列表&#xff0c;其中argv[0]:程序的名字(.exe) int main(int argc, char** argv) {std::cout << "argc:…