51单片机.之蜂鸣器振动播放歌曲

2024-08-31 21:12

本文主要是介绍51单片机.之蜂鸣器振动播放歌曲,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

蜂鸣器发声是通过喇叭振动发声的,通电产生磁场,磁铁吸收,而振动。不断释放,吸收。

在这里插入图片描述
1、蜂鸣器发声,播放不同频率的声音逐渐变尖

#include<reg52.h>sbit BUZZ = P1^6;unsigned char T0RH=0;
unsigned char T0RL=0;
void OpenBuzz(unsigned int frequ);
void StopBuzz();void main()
{unsigned int i;EA =1;TMOD = 0x01;while(1){OpenBuzz(4000);for(i=0; i<40000; i++);StopBuzz();for(i=0; i<40000; i++);OpenBuzz(1000);for(i=0; i<40000; i++);StopBuzz();for(i=0; i<40000; i++);}
}void OpenBuzz(unsigned int frequ)
{unsigned int reload;reload = 65536 - (11059200/12)/(frequ*2); T0RH = (unsigned char)(reload >>8);T0RL = (unsigned char)reload;TH0 = 0xFF;TL0 = 0xFE;ET0 = 1;TR0 = 1;
}void StopBuzz()
{ET0 = 0;TR0 = 0;
}void InterruptTimer0() interrupt 1
{TH0 = T0RH;TL0 = T0RL;BUZZ = ~BUZZ;
}

2、蜂鸣器播放歌曲


#include <reg52.h>sbit BUZZ = P1^6;  //蜂鸣器控制引脚unsigned int code NoteFrequ[] = {  //中音1-7和高音1-7对应频率列表523,  587,  659,  698,  784,  880,  988,  //中音1-71047, 1175, 1319, 1397, 1568, 1760, 1976  //高音1-7
};
unsigned int code NoteReload[] = { //中音1-7和高音1-7对应的定时器重载值65536 - (11059200/12) / (523*2),  //中音165536 - (11059200/12) / (587*2),  //265536 - (11059200/12) / (659*2),  //365536 - (11059200/12) / (698*2),  //465536 - (11059200/12) / (784*2),  //565536 - (11059200/12) / (880*2),  //665536 - (11059200/12) / (988*2),  //765536 - (11059200/12) / (1047*2), //高音165536 - (11059200/12) / (1175*2), //265536 - (11059200/12) / (1319*2), //365536 - (11059200/12) / (1397*2), //465536 - (11059200/12) / (1568*2), //565536 - (11059200/12) / (1760*2), //665536 - (11059200/12) / (1976*2), //7
};
bit enable = 1;   //蜂鸣器发声使能标志
bit tmrflag = 0;  //定时器中断完成标志
unsigned char T0RH = 0xFF;  //T0重载值的高字节
unsigned char T0RL = 0x00;  //T0重载值的低字节void PlayTwoTiger();void main()
{unsigned int i;EA = 1;       //使能全局中断TMOD = 0x01;  //配置T0工作在模式1TH0 = T0RH;TL0 = T0RL;ET0 = 1;      //使能T0中断TR0 = 1;      //启动T0while (1){PlayTwoTiger();  //播放乐曲--两支老虎for (i=0; i<40000; i++);  //停止一段时间}
}
/* 两只老虎乐曲播放函数 */
void PlayTwoTiger()
{unsigned char beat;   //当前节拍索引unsigned char note;   //当前节拍对应的音符unsigned int time = 0;      //当前节拍计时unsigned int beatTime = 0;  //当前节拍总时间unsigned int soundTime = 0; //当前节拍需发声时间//两只老虎音符表unsigned char code TwoTigerNote[] = {1,   2,   3, 1,    1,   2,   3, 1,   3, 4, 5,   3, 4, 5,5,6, 5,4, 3, 1,    5,6, 5,4, 3, 1,   1, 5, 1,   1, 5, 1,};//两只老虎节拍表,4表示一拍,1就是1/4拍,8就是2拍unsigned char code TwoTigerBeat[] = {4,   4,   4, 4,    4,   4,   4, 4,   4, 4, 8,   4, 4, 8,3,1, 3,1, 4, 4,    3,1, 3,1, 4, 4,   4, 4, 8,   4, 4, 8,};for (beat=0; beat<sizeof(TwoTigerNote); )  //用节拍索引作为循环变量{while (!tmrflag);  //每次定时器中断完成后,检测并处理节拍tmrflag = 0;if (time == 0)  //当前节拍播完则启动一个新节拍{note = TwoTigerNote[beat] - 1;T0RH = NoteReload[note] >> 8;T0RL = NoteReload[note];//计算节拍总时间,右移2位相当于除4,移位代替除法可以加快执行速度beatTime = (TwoTigerBeat[beat] * NoteFrequ[note]) >> 2;//计算发声时间,为总时间的0.75,移位原理同上soundTime = beatTime - (beatTime >> 2);enable = 1;  //指示蜂鸣器开始发声time++;}else  //当前节拍未播完则处理当前节拍{if (time >= beatTime)  //当前持续时间到达节拍总时间时归零,{                      //并递增节拍索引,以准备启动新节拍time = 0;beat++;}else  //当前持续时间未达到总时间时,{time++;   //累加时间计数if (time == soundTime)  //到达发声时间后,指示关闭蜂鸣器,{                       //插入0.25*总时间的静音间隔,enable = 0;         //用以区分连续的两个节拍}}}}
}
/* T0中断服务函数,用于控制蜂鸣器发声 */
void InterruptTimer0() interrupt 1
{TH0 = T0RH;   //重新加载重载值TL0 = T0RL;tmrflag = 1;if (enable)   //使能时反转蜂鸣器控制电平BUZZ = ~BUZZ;else          //未使能时关闭蜂鸣器BUZZ = 1;
}

这篇关于51单片机.之蜂鸣器振动播放歌曲的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

代码训练营 Day26 | 47.排序II | 51. N-皇后 |

47.排序II 1.跟46题一样只不过加一个树层去重 class Solution(object):def backtracking(self,nums,path,result,used):# recursion stopif len(path) == len(nums):# collect our setresult.append(path[:])return for i in range(

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口

MCU5.51单片机的最小系统

1.最小系统的组成部分 晶振电路(时钟),复位电路,电源电路(控制电压,保持稳定),下载电路(外加的,用于烧录程序) 烧录: 通过下载电路,把程序下载到单片机中用于运行 2.晶振电路 电路图: 是晶振 是电容 为了防止晶振起振时产生影响,因此加电容 3.复位电路 电路图: 按按钮RSTK1(保持一段时间的高电平)即可实现STC芯片的复位 4.电源电路 电路图:

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是

Circuit Design 三极管驱动蜂鸣器电路 及 蜂鸣器两端电压正确但是不响的解决方案

利用三极管进行电流放大的蜂鸣器驱动电路图: (百度图片找的) 我用有源蜂鸣器实现的这个电路,但是蜂鸣器不响。 details: 1. VCC =5V 蜂鸣器两端的直接电压约为4.5V, 但是蜂鸣器不响。 2. 将蜂鸣器直接接在4.5V的电源两端,蜂鸣器响。(说明蜂鸣器是好的) 3. 测了三极管各个管脚的电压, 和理论上的是一致的。 情况很奇怪,换了好几个三极管结果都是一样的,

飞凌单片机开发IDE环境

飞凌单片机 资料下载选择芯片类型:MCU->GPIO选择芯片型号:FM8PE53B IDE工具安装: 资料下载 飞凌官网 选择芯片类型:MCU->GPIO 选择芯片型号:FM8PE53B IDE工具安装: 运行Generic ICE 0.02-250.03 setup,一直点击“下一步”即可。 双击运行:Generic ICE