利用定时器产生乐曲仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源码:
- #include<reg52.h> //库文件
- #define uchar unsigned char//宏定义无符号字符型
- #define uint unsigned int //宏定义无符号整型
- /********************************************************************
- 初始定义
- *********************************************************************/
- uchar Count;
- sbit _Speak =P3^7 ; //讯响器控制脚
- /********************************************************************
- 歌曲字根码
- *********************************************************************/
- unsigned char code SONG[] ={ //祝你平安
- 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
- 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
- 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
- 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
- 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
- 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
- 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
- 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
- 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
- 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
- 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
- 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
- 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
- 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
- //路边的野华不要采
- 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 Time0_Init()
- {
- TMOD = 0x01;
- IE = 0x82;
- TH0 = 0xD8;
- TL0 = 0xEF; //12MZ晶振,10ms
- }
- /*********************************************************************/
- void Time0_Int() interrupt 1
- {
- TH0 = 0xD8;
- TL0 = 0xEF;
- Count++; //长度加1
- }
- /*********************************************************************/
- void Delay_xMs(unsigned int x) //1MS 延时子程序
- {
- unsigned int i,j;
- for( i =0;i < x;i++ )
- {
- for( j =0;j<3;j++ );
- }
- }
- /*********************************************************************/
- void Play_Song(unsigned char i) //:歌曲播放子程序i 为播放哪一段曲目
- {
- unsigned char Temp1,Temp2;
- unsigned int Addr;
- Count = 0; //中断计数器清0
- Addr = i * 217;
- while(1)
- {
- Temp1 = SONG[Addr++];
- if ( Temp1 == 0xFF ) //休止符
- {
- TR0 = 0; Delay_xMs(100);
- }
- else if ( Temp1 == 0x00 ) //歌曲结束符
- {
- return;
- }
- else
- {
- Temp2 = SONG[Addr++];
- TR0 = 1;
- while(1)
- {
- _Speak = ~_Speak;
- Delay_xMs(Temp1);
- if ( Temp2 == Count )
- {
- Count = 0;
- break;
- }
- }
- }
- }
- }
- /********************************************************************
- 主函数
- *********************************************************************/
- void main() //主程序
- {
- Time0_Init(); //定时器0 中断初始化
- while(1)
- {
- Play_Song(0);
- } //播放
- }
- /********************************************************************
- 结束
- *********************************************************************/
复制代码
全部资料51hei下载地址:
利用定时器产生乐曲.zip
(61.3 KB, 下载次数: 10)
|