找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机音乐盒代码

[复制链接]
ID:415601 发表于 2018-10-26 08:39 | 显示全部楼层 |阅读模式
/***************************************************************************
    程序名称:program4-1.c
    程序功能:单片机控制的音乐盒
****************************************************************************/
    #include "reg51.h"                                        //包含头文件reg51.h
    #define  ucharunsigned char
    #define  uintunsigned int
    sbit  BEEP=P3^7;                                        //蜂鸣器控制接口
    uchar note;                                                //音符下标
    uchar code music[]={0xFC,0x44,0xFC,0xAC, 0xFD,0x09, 0xFD,0x34, 0xFD,0x82, 0xFD,0xC8};
                                                                            //T值
    uchar code 2tiger[ ]=                             //两只老虎音符数组
    {
         0x14,0x24,0x34,0x14,0x14,0x24,0x34,0x14,0x34,0x44,0x58,0x34,0x44,
     0x58,0x53,0x61,0x53,0x41,0x34,0x14,0x53,0x61,0x53,0x41,0x34,x14,
     0x14,0x54,0x18,0x14,0x54,0x18,0x00,0x00
    };                                                        
/***************************************************************************
    函数名称:delay_125ms
    函数功能:实现125ms延时函数
    形式参数:无
    返回值:无
****************************************************************************/
    void delay_125ms()
    {  
           uchar counter=0;                         //计数器初始化
       TR0=1;                                 //启动T0
      for(;counter!=5;)                         //判断计数器值是否等于5
       {
             if(TF0==1)                                 //T0溢出判断
             {
                    TF0 = 0;                                //定时器0溢出位清零
                    TH0=0xa6;                    //恢复计数器初值(可采用stc-isp软件计算)
                    TL0=0x00;
                    counter++;                         //循环次数标志位加1
             }
       }
       counter = 0;                                 //计数5次,计数器清零
    }
/***************************************************************************
    函数名称:palay_music
    函数功能:单片机控制蜂鸣器播放音乐
****************************************************************************/
                void paly_music()                                        //音乐播放函数
                {
uchar i,j,k;               
            j=0;
            while(2tiger[j]!=0x00)       //一直播放到休止符0x00为止
            {
                    k=2tiger[j]&0x0F;                         //从音符数组中得到节拍
                    note=2tiger[j]>>4;             //从音符数组中得到音符
                    TH1=music[2*note];                                //定时器1赋初值
                    TL1=music[2*note+1];               
                    TR1=1;                                                        // 启动T1
                    if((music[2*note]==0x00)&&(music[2*note+1]==0x00))//判断是否停止符
                    {
                            TR1=0;                                //当播放到停止符时关闭T1
                            BEEP=1;                                //关闭蜂鸣器
                    }
                    for(i=k;i>0;--i)                //延时,产生相应的节拍
                    {               
                            delay_125ms();                                
                    }
                    TR1=0;                                       
                    j++;                                            //取数组中的下一个数据
            }
    }                        
/***************************************************************************
    函数名称:init
    函数功能:定时器T0、T1初始化
****************************************************************************/
    void  init ()               
    {
     TMOD=0x11;                                        //T0工作定时工作方式
     TH0=0xa6;                                        //赋T0计数器初值(25ms)
     TL0=0x00;
     ET1=1;                                        //允许T1中断
     EA=1;                                                //中断允许
    }
/***************************************************************************
    函数名称:main
    函数功能:单片机控制蜂鸣器播放音乐
****************************************************************************/
         void main( )                                 //主函数
         {
           init();
           while(1)
      {
            paly_music( );                        // 播放音乐
  }
  }
/***************************************************************************
    函数名称:timer1
    函数功能:T1产生音符脉冲
****************************************************************************/
  void timer1( ) interrupt 3
      {
          TH1=music[2*note];                        //恢复计数器初始值               
     TL1=music[2*note+1];                        
     BEEP=~BEEP;
         }


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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