找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 759|回复: 0
收起左侧

51单片机c语言音乐程序

[复制链接]
ID:1132927 发表于 2024-11-4 18:20 | 显示全部楼层 |阅读模式
#include <reg52.h>   
#include <intrins.h>

sbit Beep =  P2^3 ;


unsigned char n=0;  //n为节拍常数变量   
unsigned char code music_tab[] ={   
0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,   
0x20, 0x40, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x10,   
0x1C, 0x10, 0x18 , 0x40,   
0x1C, 0x20, 0x20 , 0x20,   
0x1C, 0x20, 0x18 , 0x20,   
0x20, 0x80, 0xFF , 0x20,   
0x30, 0x1C, 0x10 , 0x18,   
0x20, 0x15, 0x20 , 0x1C,   
0x20, 0x20, 0x20 , 0x26,   
0x40, 0x20, 0x20 , 0x2B,   
0x20, 0x26, 0x20 , 0x20,   
0x20, 0x30, 0x80 , 0xFF,   
0x20, 0x20, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x20, 0x1C , 0x10,   
0x18, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x20, 0x15 , 0x20,   
0x1C, 0x20, 0x20 , 0x20,   
0x26, 0x40, 0x20 , 0x20,   
0x2B, 0x20, 0x26 , 0x20,   
0x20, 0x20, 0x30 , 0x80,   
0x20, 0x30, 0x1C , 0x10,   
0x20, 0x10, 0x1C , 0x10,   
0x20, 0x20, 0x26 , 0x20,   
0x2B, 0x20, 0x30 , 0x20,   
0x2B, 0x40, 0x20 , 0x15,   
0x1F, 0x05, 0x20 , 0x10,   
0x1C, 0x10, 0x20 , 0x20,   
0x26, 0x20, 0x2B , 0x20,   
0x30, 0x20, 0x2B , 0x40,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x20, 0x15 , 0x20,   
0x1C, 0x20, 0x20 , 0x20,   
0x26, 0x40, 0x20 , 0x20,   
0x2B, 0x20, 0x26 , 0x20,   
0x20, 0x20, 0x30 , 0x30,   
0x20, 0x30, 0x1C , 0x10,   
0x18, 0x40, 0x1C , 0x20,   
0x20, 0x20, 0x26 , 0x40,   
0x13, 0x60, 0x18 , 0x20,   
0x15, 0x40, 0x13 , 0x40,   
0x18, 0x80, 0x00   
};   

void delay (unsigned char m)   //控制频率延时   
{   
unsigned i=3*m;   
while(--i);   
}   
void delayms(unsigned char a)  //豪秒延时子程序   
{   
  while(--a);     
}   
void main()   
{
        unsigned char p,m;   //m为频率常数变量   
        unsigned char i=0;   
        TMOD&=0x0f;   
        TMOD|=0x01;   
        TH0=0xd8;TL0=0xef;   
        IE=0x82;   
play:
        while(1)   
    {   
        a:  p=music_tab[ i];   
                if(p==0x00)      
                {
                        i=0, delayms(1000); goto play; //如果碰到结束符,延时1秒,回到开始再来一遍  
                }      
                else
                        if(p==0xff)  
                        {
                                i=i+1;delayms(100),TR0=0; goto a;  //若碰到休止符,延时100ms,继续取下一音符
                        }      
                        else
                        {
                                m=music_tab[i++], n=music_tab[i++];         //取频率常数 和 节拍常数
                        }      
                        TR0=1;                                             //开定时器0   
                while(n!=0)                    //等待节拍完成,输出音频  
                {
                        Beep=~Beep;
                        delay(m);   
                }
                TR0=0;                                             //关定时器0   
    }   
}
void int0() interrupt 1   //采用中断定时器0 控制节拍   
{  
        TH0=0xd8;   
        TL0=0xef;   
        n--;   
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表