IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【POCKET 51】用 pocket 51学51单片机 :使用pocket 51播放音乐 -> 正文阅读

[嵌入式]【POCKET 51】用 pocket 51学51单片机 :使用pocket 51播放音乐

系列文章【完善中】:
【POCKET 51】用 pocket 51学51单片机 之一:pocket 51诞生记
【POCKET 51】用 pocket 51学51单片机 之二:pocket 51的加工及焊接
【POCKET 51】用 pocket 51学51单片机 之三:pocket 51上电测试
【POCKET 51】用 pocket 51学51单片机 之四:pocket 51功能模块测试
【本设计已在立创开源平台开源】

五、使用pocket 51播放音乐

蜂鸣器分为有源和无源两种:
有源蜂鸣器内部带有一个振荡器,只能发出特定频率的声音,使用时较为简单,直接供电即可发生。
无源蜂鸣器内部无振荡器,必须给一个震荡脉冲才能够发生,所以我们可以通过给不同频率的声音来进行音乐播放。

频率和音高对应表:
在这里插入图片描述
例如我们可以通过设定定时器来控制蜂鸣器引脚的高低电平变化,从而得到一定频率的方波,例如440Hz方波就能够使蜂鸣器发出1(do)的声音。时间长度可以通过延时进行控制。

在程序中,tone_h和tone_l用来存储音调对应的计数初始值的高8位和低8位。

在使用蜂鸣器进行音乐播放时,驱动蜂鸣器的PWM信号按照简谱的唱名改变为相应的频率,并持续相应的时长,就可以达到播放音乐的目的。

代码参考网址:http://www.51hei.com/bbs/dpj-217113-1.html

对代码做了稍许修改,能够适配STC15A60S2。
代码如下:

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
sfr AUXR        =   0x8E;   //0000,0000 辅助寄存器
sbit SPK = P3^7;

uchar tone_h;                //高音
uchar tone_l;                //低音
uint note = 1;                //音符
uchar beat;                        //节拍


uchar code chuzhi[3][16]=   //音调对应的计数初值
{
    0xff,0xff,//占0位
    0xf8,0x8c,//低1
    0xf9,0x5b,//  2
    0xfa,0x15,//  3
    0xfa,0x67,//  4
    0xfb,0x04,//  5
    0xfb,0x90,//  6
    0xfc,0x0c,//低7

    0xff,0xff,//占0位
    0xfc,0x44,//中1
    0xfc,0xac,//  2
    0xfd,0x09,//  3
    0xfd,0x34,//  4
    0xfd,0x82,//  5
    0xfd,0xc8,//  6
    0xfe,0x06,//中7

    0xff,0xff,//占0位
    0xfe,0x22,//高1
    0xfe,0x56,//        2
    0xfe,0x85,//        3
    0xfe,0x9a,//        4
    0xfe,0xc1,//        5
    0xfe,0xe4,//        6
    0xff,0x03 //高7
};

//****** 测试曲谱 ****** 个位:音调 ,十位:低中高音 对应 0 1 2,千百位:节拍 1~16
uint code test2[] = {        120, //曲速 暂时未用到
                             401,402,403,404,405,406,407,
                             611,612,613,614,615,616,617,
                             821,822,823,824,825,826,827,
                             0xffff        //0xffff表示结尾
                    };

//****** 生日快乐,虫儿飞 ******
uint code test[] = { 120,
                     413,213,213,414,415,813,812,
                     411,211,211,412,413,313,107,807,//加点40X,只有加横为11X,两个连起来加横21X.
                     406,413,812,406,413,812,406,413,312,811,410,
                     213,412,815,214,413,812,
                     215,414,213,412,315,113,812,
                     406,413,812,
                     406,413,812,
                     214,213,214,213,811,
                     214,213,214,213,811,612,211,411,410,
                     0xffff
                   };


void delayms(uint ms)          /*ms 等于1时,延时1ms 等于2时,延时2ms,以此类推*/
{
    uchar a,b,c;                                   //+3
    while(ms--)
    {
        for(c=1; c>0; c--)                      //         1+2 = 3
            for(b=142; b>0; b--)                //        1*( 1+142*2)) = 285
                for(a=2; a>0; a--);      //         142*(1+2*2) = 710
    }
}

void delay125ms(uint pai)  //延时 ?*125ms 即?个节拍
{
    uchar a,b,c;
    while(pai--)
    {
        for(c=239; c>0; c--)
            for(b=104; b>0; b--)
                for(a=1; a>0; a--);
    }
}
void timer0() interrupt 1
{
    TH0 = tone_h;
    TL0 = tone_l;
    SPK = ~SPK;
}


void timer_init()
{
	AUXR &= 0x7F;		//定时器时钟12T模式
    EA = 1;
    ET0 = 1;
    PT0 = 1;
    TMOD = 0x11;
    TH0 = 255;
    TL0 = 255;
}
void main()
{
    timer_init();
    note = 1;

    while(1)
    {
        if(test[note] == 0xffff)
        {
            note = 1;
        }
        if(test[note]%10 != 0)        //音调不为0 【音调为0时表示不发声,但有节拍】
        {
            tone_h = TH0 = chuzhi[test[note]%100/10][(test[note]%10)*2 ];                //音调高位 【二维数组 第1维表示低中高音,第二维表示音调】
            tone_l = TL0 = chuzhi[test[note]%100/10][(test[note]%10)*2 + 1];        //音调低位
            TR0 = 1;
        }
        delay125ms(test[note]/25);        //节拍
        TR0 = 0;
        delayms(30);
        note++;                                                //下一个音符

    }

}

运行效果

运行后,播放虫儿飞音乐。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 00:28:41  更:2022-04-14 01:12:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:36:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码