【AT89C52单片机项目】音乐播放器的设计

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

  • 实验目的

用51系列单片机设计一个可以切歌的音乐播放器。

  • 实验仪器

AT89C52单片机。

音乐播放模块。

  • 设计要求

采用重装定时器计数方式1的初值来实现发出不同频率的声音,通过控制延时长度来实现不同的节拍,之后将音乐数据表填入,即可实现音乐播放。

可通过功能按键切换歌曲

  • 实验原理

音乐播放采用重装定时器计数方式1的初值来实现发出不同频率的声音,通过控制延时长度来实现不同的节拍,之后将音乐数据表填入,即可实现音乐播放。

音乐切换方面采取按键输入,按键检测到低电平,则判断有信号输入,等待10ms去抖后,等待下一个高电平,进行音乐的切换。

  • 实验流程
  1. 根据课本学习喇叭发生实验、警车声音、救护车声音、喇叭滴答声音、报警发声、消防车、音乐播放等一系列实验了解了喇叭发声以及调节频率的方法。学习独立按键的用法用于切换歌曲
  2. 模仿音乐播放的代码,进行修改,将源代码的歌曲乐谱换成“铃儿响叮当”和“Spider Dance”的乐谱
  3. 将单片机喇叭短接,代码烧录入单片机。

【AT89C52单片机项目】音乐播放器的设计,单片机项目学习,单片机,嵌入式硬件,项目学习 

 

  • 实验结果

单片机正常运行,先播放“铃儿响叮当”的旋律,当我按下独立按键INT1时,歌曲切换为“Spider Dance”的旋律,如果重新按下独立按键INT1,可以切换回“铃儿响叮当”。

  • 代码

 

#include <reg52.h>
sbit SPK = P1 ^ 2;    //定义喇叭接口
sbit KEY = P3 ^ 3;    //设置独立按键INT1,按下按键时切换歌曲
sbit LED = P1 ^ 7;    //用于切换歌曲的显示,当LED = 1时播放铃儿响叮当,否则播放Spider Dance
int Timer0_H, Timer0_L, Time; //定义定时器变量和时间变量

code unsigned char MUSIC1[] = { //歌曲“铃儿响叮当”的乐谱,每个音由3个变量构成,前两个变量用来确定音乐频率,第三个变量确定持续时间
    3,2,2,3,2,2,  3,2,4,  3,2,2,3,2,2,  3,2,4,
    3,2,2,5,2,2,  1,2,3,2,2,1,  3,2,8,
    4,2,2,4,2,2,  4,2,2,4,2,2,  4,2,2,3,2,2,  3,2,2,3,2,2,
    5,2,2,5,2,2,  4,2,2,2,2,2,  1,2,4,  1,3,4, 0,0,0
};
code unsigned char MUSIC2[] = { //歌曲“Spider Dance”的乐谱,如果前两个变量为(0,0)时则为空拍
    6,3,4,   3,3,4,   1,3,4,   6,2,4,
	0,0,2,   2,3,2,	  2,3,2,   0,0,4,   2,3,2,   1,3,2,   5,2,2,   6,2,2,
	0,0,2,   3,3,2,   2,3,2,   1,3,2,   2,3,2,   3,3,2,   5,2,2,   6,2,2,
	1,3,2,   6,2,2,   5,2,2,   6,3,2,   0,0,2,   5,3,2,   3,3,1,   2,3,1,   1,3,2,
	6,2,4,   4,2,4,   7,2,4,   4,2,4,
	1,3,4,   4,2,4,   2,3,8,
	3,3,4,   2,3,4,   6,3,4,   3,3,4,
	5,3,4,   4,3,4,   3,3,4,   0,0,4,
	6,3,2,	 3,4,2,	  2,4,2,   3,4,2,   6,3,2,	 3,4,2,	  2,4,2,   3,4,2,
	3,3,2,	 2,4,2,	  2,4,2,   2,4,2,	3,3,2,	 3,4,2,	  7,3,2,   2,4,2,
	6,3,2,	 3,4,2,	  2,4,2,   3,4,2,   7,3,2,	 3,4,2,	  2,4,2,   3,4,2,
	1,4,2,	 3,4,2,	  2,4,2,   3,4,2,	2,4,2,	 4,4,2,	  3,4,2,   4,4,2,
	4,3,2,	 1,4,2,	  7,3,2,   1,4,2,	4,3,2,	 2,4,2,	  1,4,2,   2,4,2,
	4,3,2,	 3,4,2,	  2,4,2,   3,4,2,	4,3,2,	 4,4,2,	  3,4,2,   4,4,2, 0,0,0


};

code unsigned char FREQH[]= { //频率表前八位,第0行频率为低两个8度的音,第1行频率为低一个8度的音,第2行为正常音,第3行为高8度的音
                                //(抱歉,乐理基础没学好,音的标准说法忘了咋说了,懂意思就好)
                                // 比如说正常音la,持续时间为2,那就是(6,2,2)
    0xF2,0XF3,0xF5,0xF5,0XF6,0XF7,0XF8,
    0xF9,0XF9,0XFA,0XFA,0XFB,0XFB,0XFC,0XFC,
    0xFC,0XFD,0XFD,0XFD,0XFD,0XFE,
    0xFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFF
};

code unsigned char  FREQL[]= { //频率表后八位
    0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
    0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,
    0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
    0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16
};

void DelayUs2x(unsigned char t)  //延迟函数
{
    while (--t)
    {

    }
}
void DelayMs(unsigned char t) //延迟时间函数,略微修改,时间不准
{
    while (--t)
    {
        DelayUs2x(245);
    }
}
void delay(unsigned char t)  //延迟时间函数
{
    unsigned char i;
    for (i = 0; i < t; i++)
        DelayMs(125);
    TR0 = 0;
}

void Init_Timer0(void) //定时器初始化函数
{
    TMOD |= 0x01; //模式1,16位定时器/计数器
    EA = 1; //总中断打开
    ET0 = 1; //定时器中断打开
}
void TIM0_ISR() interrupt 1  //定时器中断函数,用于读取音符频率值,产生对应的音符
{
    TR0 = 0; //定时器暂停
    SPK = !SPK; //喇叭反转
    TH0 = Timer0_H; //重置定时
    TL0 = Timer0_L;
    TR0 = 1; //定时器开始
}

void Song()
{
    if (Timer0_H == -1 && Timer0_L == -1) //空拍判断,喇叭不发声
    {
        delay(Time);
    }
    else
    {
        TH0 = Timer0_H;  //重置定时
        TL0 = Timer0_L;
        TR0 = 1;  
        delay(Time);
    }
}

void main(void)
{
    unsigned char k, i;
    Init_Timer0();
    KEY = 1;
    LED = 1;
    while (1)
    {
        i = 0;
        if (LED) //播放“铃儿响叮当”
        {
            while (i < 76) //这个数字是MUSIC数组里的变量数
            {
                k = MUSIC1[i] + 7 * MUSIC1[i + 1] - 1;//频率位置,用两个变量进行判断
                Timer0_H = FREQH[k];// 获取频率高八位
                Timer0_L = FREQL[k];// 获取频率低八位
                Time = MUSIC1[i + 2];// 获取持续时间
                i += 3;
                Song();
                if (!KEY) //判断独立按键按下
                {
                    while (!KEY) //判断按键释放
                    { }
                    LED = !LED; //切歌
                    break;
                }
            }
        }
        else
        {
            while (i < 280) //播放“Spider Dance”
            {
                k = MUSIC2[i] + 7 * MUSIC2[i + 1] - 1;
                Timer0_H = FREQH[k];
                Timer0_L = FREQL[k];
                Time = MUSIC2[i + 2];
                i += 3;
                Song();
                if (!KEY)
                {
                    while (!KEY)
                    { }
                    LED = !LED;
                    break;
                }
            }
        }
    }
}

 文章来源地址https://www.toymoban.com/news/detail-568245.html

到了这里,关于【AT89C52单片机项目】音乐播放器的设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 基于AT89C52单片机的温湿度检测设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87704704 源码获取 主要内容: 设计一套基于51单片机的温湿度Protus仿真监控系统,采用SHT11、DHT11或DS189B20等传感器模块,用LCD液晶实时显示当前环境温湿度值。 基本要求: 1、设计报警单元,实现

    2024年02月08日
    浏览(38)
  • 基于AT89C52单片机的计算器设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/88637995?spm=1001.2014.3001.5503 源码获取 B 源码+仿真图+课程设计+51 摘 要 计算器一般是指“电子计算器”,能进行数学运算的手持机器,拥有集成电路芯片,结构简单,功能较弱,但由于它使用方便、操

    2024年01月16日
    浏览(45)
  • 基于AT89C52单片机的多功能万年历设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853675 源码获取 目 录 摘 要 1 1 方案论证 2 1.1 单片机芯片的选择方案和论证 2 1.2 显示模块选择方案和论证 2 1.3 时钟芯片的选择方案和论证 3 1.4 电路设计最终方案决定 3 2 系统的硬件设计与实现

    2024年02月07日
    浏览(34)
  • 基于AT89C52单片机的简易电子琴设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87853299?spm=1001.2014.3001.5503 源码获取 主要内容: 本设计是基于51系列的单片机进行的设计,利用所给键盘的八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间

    2024年02月04日
    浏览(38)
  • 利用AT89C52单片机实现数码管的静态与动态显示

            资源work1和work2(完整工程文件在笔者本人主页的资源中,免费欢迎下载)分别完成下面两个任务:         1、单片机接矩阵键盘和2个静态数码管,自行设计硬件电路,利用汇编语言,要求将按键值(0~15)在数码管显示。         主要代码: ……      

    2024年02月02日
    浏览(36)
  • 【嵌入式开发-8051】详细:基于AT89C52单片机设计的温控风扇(Proteus仿真设计-含设计原理图、程序源码)

    1、本设计是基于AT89C51/52单片机为核心的温控风扇系统,使用Proteus进行仿真分析。 2、由于上传后图片压缩,可以私信联系获取清晰图片。 3、本次为本人结课设计,整体比较简单,如有疑问欢迎大家交流讨论!   目录 【嵌入式开发-8051】详细:基于AT89C52单片机设计的温控风

    2024年02月07日
    浏览(46)
  • 什么是STC89C52单片机

    STC89C52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In-system programmable)的可反复擦写10000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构[1],芯片内集成了通用8位中央处理器和ISP Flash存储单元,功

    2024年02月13日
    浏览(37)
  • 89C52RC普中单片机

    资料下载 普中科技--各型号产品资料下载链接 - STM8单片机 - 普中开源电子分享网 - Powered by Discuz! (prechin.net) 2023-06-28  1.开发板    2.软件 keil,stc-isp。 1.点亮led 89C52RC芯片LED模块是P2口。       2.led1一秒闪烁  3.LED流水灯  4.独立按键控制led亮灭(按下key1亮,松手灭) 5.独立按键

    2024年02月11日
    浏览(43)
  • 【mcuclub】STC89C52单片机最小系统讲解

        3.1、主芯片 STC89C52是STC公司生产的一种低功耗、高性能8位微控制器 器件参数: 1、增强型8051单片机,指令代码完全兼容传统8051 2、工作电压:5.5V~3.3V 3、工作频率范围:0~40MHz,实际工作频率可达48MHz 4、用户应用程序空间为8K字节(程序空间) 5、片上集成512 字节RAM(

    2024年02月03日
    浏览(70)
  • STC89C52RC单片机原理图详解

    目录 1、单片机整体模块 2、 LED模块 3、独立按键模块 4、数码管模块 5、LCD1602模块 6、矩阵按键模块​编辑 7、串口通信模块 8、LED点阵屏模块 单片机使用的是TTL电平(一种电平的规范),规定为0V为低电平,5V为高电平; 字母上有一横,意为低电平有效。 单片机上电时,所有

    2024年02月05日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包