原创 AI8051U为主控芯片歌曲播放

2025-6-21 07:36 1141 0 分类: MCU/ 嵌入式

/*************  功能说明    **************

本例程基于AI8051U为主控芯片的实验箱进行编写测试.

使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。

edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。

下载时, 选择时钟 24MHZ (用户可自行修改频率).

******************************************/

#include "AI8051U.h"

#include "stdio.h"

#include "intrins.h"

// 定义 GPIO_P5_0 宏

#define GPIO_P4 (*(volatile unsigned char *)0x00C0)

#define GPIO_P5 (*(volatile unsigned char *)0x00C8)

sbit GPIO_P4_1 = GPIO_P4^1;

sbit GPIO_P5_0 = GPIO_P5^0;

//#define  GPIO_P5_0 P50

typedef unsigned char u8;

typedef unsigned int u16;

typedef unsigned long u32;

u8 code LED[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

#define MAIN_Fosc       24000000UL

#define Timer0_Reload   (65536UL - (MAIN_Fosc / 1000))  // Timer 0 中断频率, 1000次/秒

// 定义延时函数

void delay_ms(unsigned int ms) {

        unsigned int i;

        do{

//          i=MAIN_Fosc/96000L;                //STC89/90_12T

//          i=MAIN_Fosc/48000L;                //STC89/90_6T

//          i=MAIN_Fosc/14000;                //STC11、STC12

//          i=MAIN_Fosc/13000;                //STC15  14T per loop

//            i=MAIN_Fosc/10000;                //STC8 10T per loop

              i=MAIN_Fosc/6030;                 //STC32 6T per loop

                while(--i);

        }while(--ms);

      

}

// 生日快乐歌音符序列

u8 code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,

        212,212,106,126,159,169,190,119,119,126,159,142,159,0};

u8 code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,

        9,3,12,12,12,12,12,9,3,12,12,12,24,0};

//控制音频、节拍函数

void PlayMusic()

{

        u16 i=0,j,k;

        u8 a=0;

        while(SONG_LONG[ i]!=0||SONG_TONE[ i]!=0)

        {  

                for(j=0;j<SONG_LONG[ i]*40;j++)  //播放各个音符,SONG_LONG 为拍子长度

                {

                        GPIO_P5_0=~GPIO_P5_0;

         GPIO_P4_1=~GPIO_P4_1;

                        for(k=0;k<SONG_TONE[ i]*7;k++);//SONG_TONE 延时表决定了每个音符的频率

                }

                P2=LED[a];

                 a++;

                if(a==8)

                      {a=0;}                      

                delay_ms(10);

                i++;

        }

}

void main() {

      

    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快

    EAXFR = 1; //扩展寄存器(XFR)访问使能

    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出

    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口

    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口

    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口

    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口

          P4M0 = 0x01; P4M1 = 0x00; // 设置P4.1为推挽输出

          GPIO_P4_1 = 0;

          P5M0 = 0x01; P5M1 = 0x00; // 设置P5.0为推挽输出

          GPIO_P5_0 = 0;

    P40 = 0;                //LED Power On

      

    while(1) {

                                PlayMusic(); //播放生日快乐

        delay_ms(3000); // 歌曲播放完后停顿3秒

    }

}

作者: 丙丁先生, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3996156.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
0
关闭 站长推荐上一条 /4 下一条