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

这篇具有很好参考价值的文章主要介绍了【【51单片机的蜂鸣器实现小星星】】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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好了下面是小星星的完整代码文章来源地址https://www.toymoban.com/news/detail-570658.html

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

到了这里,关于【【51单片机的蜂鸣器实现小星星】】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【【51单片机的蜂鸣器-11】】

    DS1302我一直有问题搁置了几百天了 先来看看蜂鸣器 搞了一个礼拜verilog然后出去吃饭 估计自己得有10多天没看c语言和51单片机了 现在先处理一下蜂鸣器的问题 蜂鸣器 蜂鸣器分为有源蜂鸣器和无源蜂鸣器 有源内部自带震荡源,将正负极接上直流电压及可持续发声,频率固定

    2024年02月16日
    浏览(51)
  • 【【51单片机的蜂鸣器发声】】

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

    2024年02月16日
    浏览(51)
  • 51单片机学习笔记-9蜂鸣器

    [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 蜂鸣器 是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号。蜂鸣器按驱动方式可分

    2024年02月06日
    浏览(33)
  • stm32单片机/51单片机蜂鸣器不响(proteus模拟)

    1提高蜂鸣器电阻,这样根据分压原理,可以提升蜂鸣器2段电压 2更改蜂鸣器的工作电压为更小的值,这个可以通过在proteus内设置探针查看电压值,更改为其值就可以了 我觉得如果不是仿真的话,蜂鸣器额定电压是不能改的,如果电压不够的话好像就只能够选用合适的三极管

    2024年02月11日
    浏览(29)
  • MCU-51:单片机蜂鸣器播放音乐和提示音

    蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定 无源蜂鸣器:内部不带振荡源,需要控制器提供振

    2024年02月02日
    浏览(34)
  • 33、基于51单片机老人防跌倒蜂鸣器报警系统加速度检测

    背景技术 老年人出门由于身体不灵活、视力较差,容易发生跌倒,现用的老年人跌倒报警装置是通过无线对讲系统研发的,它外观精美,自动化程度高,有很强的专业性,但是,设计者忽略了一个问题,因为大多数老年人使用现代化产品不熟练,随着视力、操作能力的下降,

    2023年04月08日
    浏览(70)
  • 【51单片机】:闪灯、流水灯(从左往右)、流水灯(从右往左)、蜂鸣器。

            言归正传,一切都回归本源,从51再来一次,首先就是最简单的点灯大师。         这么些年从51 到  32  再到  arduino  再到  ESP  等等,都是从点灯大师开始的。 于是介绍如下: 闪灯 流水灯(从左往右) 流水灯(从右往左) 蜂鸣器         LED灯的原理:LED是发

    2024年02月11日
    浏览(37)
  • 基于51单片机的烟雾检测+温度检测+蜂鸣器报警+光耦+风扇+LCD4602液晶显示(含原理图/PCB/代码)

    讲在前面: 51单片机是大多数电子爱好者的入门级单片机,这款设计是一个比较综合的单片机设计。本文介绍了一个典型的51单片机设计,希望对各位有帮助。 本人也在其他平台开源了一些项目和分享: 点击进入B站传送门 1)产品功能: 使用51单片机作为控制器,与ADC0832(

    2024年01月22日
    浏览(36)
  • 单片机-蜂鸣器

    蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电 蜂鸣器主要分为 压电式蜂鸣器 和 电磁式蜂鸣器 两 种类型。 压电式蜂鸣器 主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V 直流工

    2024年02月09日
    浏览(36)
  • 单片机学习-蜂鸣器如何发出声音

    BEEP =! BEEP    为何使用 非运算,这里面 P2 的管脚默认 有上拉电阻,P2^5 输出高电平 每次循环 非运算一下 为低电平 ,产生那种评率 0 1  0 1  0 1 循环下去 

    2024年02月11日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包