⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main1.c

📁 这个程序能实现单片机发出两只老虎的音乐
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2008,重庆优易特电子
*            All rights reserved.

* 摘 要:   播放音乐:两只老虎

* 文件名称: main.c
* CPU芯片:  STC89C51RC
* 学习板型: Easy51-B 
*  
* 当前版本: 2.0
* 作 者:	 cache
* 完成日期: 2008年1月23日
*
*************************************************************************************/
			#include <reg52.h>
			#include <intrins.h>

            #define  FREQ 11059200
        
            unsigned char code music_tab[]={    //两只老虎,高4位为音乐节拍,低4位为音符
			0x31,0x32,0x33,0x31,0x31,0x32,0x33,0x31,0x33,0x34,0x45,0x33,0x34,0x45,
			0x25,0x16,0x25,0x14,0x33,0x31,0x25,0x16,0x25,0x14,0x33,0x31,
			0x31,0x35,0x41,0x31,0x35,0x41,
			0
            };
            unsigned char code music_l_tab[8]={0,1,2,3,4,6,8,16};//节拍延时单位       
            unsigned char code music_freq_tab[16]={           
                0xff,0xea,                                      //0 休止符
                255-FREQ/24/1049/256,        //1 do 高字节 //255-FREQ/24/x/256
                255-FREQ/24/1049%256,        //1 do 低字节 //256-FREQ/24/x%256
                255-FREQ/24/1178/256,256-FREQ/24/1178%256,        //2 re
                255-FREQ/24/1322/256,256-FREQ/24/1322%256,        //3 mi
                255-FREQ/24/1400/256,256-FREQ/24/1400%256,        //4 fa
                255-FREQ/24/1572/256,256-FREQ/24/1572%256,        //5 suo
                255-FREQ/24/1665/256,256-FREQ/24/1665%256,        //6 la
                255-FREQ/24/1869/256,256-FREQ/24/1869%256,        //7 xi               
            };

            unsigned char temp_TH1;
            unsigned char temp_TL1;

            sbit PIN_MSC=P1^4;                   //  音乐输出端口  //
            
            void music_delay(unsigned char x);   //音乐节拍延时
            void music_play(unsigned char *msc); //播放音乐子程序
            
            //---------------------------------------------------------------------------//
            void music_int_t1 (void) interrupt 3 using 1    //定时中断1//
                {
                PIN_MSC=~PIN_MSC;
                TH1=temp_TH1;
                TL1=temp_TL1;
            }
            //---------------------------------------------------------------------------//
            void music_delay(unsigned char n)     //延时 125*n 毫秒
                {
                unsigned char i=125,j;
                do {
                    do {
                        for (j=0; j<230; j++) _nop_(); 
                    }while(--i);
                }while(--n);
            }
            //---------------------------------------------------------------------------//
            void music_play(unsigned char *msc)   //音乐
                {
                unsigned char music_long;         //节拍
                unsigned char music_data=0;       //音符数据
                temp_TH1=0xff;
                temp_TL1=0xea;                    //关输出(输出超声波)   
                TH1=temp_TH1;
                TL1=temp_TL1;
				TR1=1;                            //开T1定时器中断
				
            //---------------------------------------------------------
                while (*msc != 0x00)
                    {
                    music_data=*msc & 0x07;
                    music_long=*msc>>4;
                    //---------------------------------------------------------
                    if (music_long != 0)          //是音符
                        {
                       	temp_TH1=music_freq_tab[music_data*2];						
                       	temp_TL1=music_freq_tab[music_data*2+1];
						music_delay(music_l_tab[music_long&0x07]); 
                         }          
                    msc++;
                }
                TR1=0;                           //播放结束
                PIN_MSC=1;                       //关输出
            }
            //---------------------------------------------------------------------------//
            void main(void)                      //示例
            {
                TMOD   =  0x11;         // TMOD: 定时器1:模式1:16位;定时器2:模式1:16位   
           		TR1=0;
				ET1=1;
				EA=1;
                while(1)
				{                  
				  music_delay(10);	//延时
				  music_play(music_tab);//播放音乐
                }
            }
            //---------------------------------------------------------------------------// 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -