原创作品,禁止转载售卖,仅供学习参考!!!
仿真目的和要求: (1) 进一步熟悉定时/计数器的应用 (2) 让单片机放个音乐听听 项目内容: (1) 选定一首歌,下载歌谱,按照音调和节拍生成数据格式,用蜂鸣器播放。 (2) 按键定义钢琴的键盘,按下按键可以发出不同的声音,可以弹奏简单的曲调。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:- #include <REGX52.H>
- sbit beep = 0xA6;
- unsigned int num = 0;
- unsigned char number = 1;//歌曲序号
- unsigned char time = 0;//节拍时间,第三个数
- unsigned char fre_num ;
- unsigned char sign = 0;
- unsigned char flag = 1;
- //简单爱
- unsigned char code music[]={
- 5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1,
- 4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1,
- 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1,
- 3,2,1, 3,2,1, 1,2,1, 5,2,1, 1,2,1, 5,2,1, 1,2,1, 7,1,1, 1,2,1, 1,2,1, 6,1,1,
- 2,2,1, 2,2,1, 3,2,1, 3,2,1, 5,2,1, 5,2,1,
- 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2,
- 5,1,1, 1,2,1, 2,1,2, 3,2,1, 2,2,1, 3,2,1, 4,2,1, 5,2,1, 5,2,1, 5,2,1,
- 4,2,1, 3,2,1, 2,2,3, 5,1,1, 1,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 4,2,1,
- 5,2,1, 5,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2, 1,2,1, 6,1,1, 2,2,1, 2,2,1,
- 3,2,1, 3,2,1, 1,2,2, 5,2,1, 1,2,1, 5,2,1, 5,2,1, 7,1,1, 1,2,1, 0,0,0 };
- // 频率-半周期数据表 高八位 共保存了四个八度的28个频率数据
- unsigned char code NOTEH[]={
- 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
- 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
- 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567
- 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567
- // 频率-半周期数据表 低八位
- unsigned char code NOTEL[]={
- 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567
- 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
- 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567
- 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567
- void Delay(unsigned char t) //延时子函数,控制发音的时间长度,每个节拍0.4S
- {
- unsigned char t1;
- unsigned long t2;
- for (t1 = 0; t1 < t; t1++) //嵌套循环, 共延时t个半拍
- {
- for (t2 = 0; t2 < 8000; t2++) //延时期间, 可进入T0中断去发音
- {
- ;
- }
- }
- TR0 = 0; //关闭T0, 停止发音
- }
- void Delay20ms() //@11.0592MHz
- {
- unsigned char i, j, k;
-
- i = 1;
- j = 216;
- k = 35;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
-
- void ONE() //演奏一个音符
- {
- beep = !beep;
- TH0 = NOTEH[fre_num];
- TL0 = NOTEL[fre_num];
- TR0 = 1;
- Delay(time);
- }
- void PlayMusic() //播放相应歌曲的某个音符
- {
- if(sign == 1)
- {
- if ((number == 1) && (flag == 1))
- {
- fre_num = music[num] + 7 * music[num + 1] - 1; //第i个是音符,第i+1个是第几个八度
- time = music[num + 2]; //读出时间长度数值
- num += 3;
- if (fre_num < 0)
- {
- num = 0;
- number = 1;
- }
- ONE(); //发出一个音符
-
- }
-
-
- }
- sign = 0;
- beep = 1;
-
-
- }
- unsigned char key_scan()
- {
- unsigned char KeyNumber = 0;
-
- P1 = 0xff;
- P1_0 = 0;
- if(P1_4 == 0){Delay20ms();while(P1_4 == 0);KeyNumber = 1;}
- if(P1_5 == 0){Delay20ms();while(P1_5 == 0);KeyNumber = 2;}
- if(P1_6 == 0){Delay20ms();while(P1_6 == 0);KeyNumber = 3;}
- if(P1_7 == 0){Delay20ms();while(P1_7 == 0);KeyNumber = 4;}
-
- P1 = 0xff;
- P1_1 = 0;
- if(P1_4 == 0){Delay20ms();while(P1_4 == 0);KeyNumber = 5;}
- if(P1_5 == 0){Delay20ms();while(P1_5 == 0);KeyNumber = 6;}
- if(P1_6 == 0){Delay20ms();while(P1_6 == 0);KeyNumber = 7;}
- if(P1_7 == 0){Delay20ms();while(P1_7 == 0);KeyNumber = 8;}
-
- P1 = 0xff;
-
- return KeyNumber;
- }
- unsigned char ss ;
- void Key()
- {
-
- ss = key_scan();
- if(ss == 1)
- {
- beep = !beep;
- TH1 = NOTEH[8];
- TL1 = NOTEL[8];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 2)
- {
- beep = !beep;
- TH1 = NOTEH[9];
- TL1 = NOTEL[9];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 3)
- {
- beep = !beep;
- TH1 = NOTEH[10];
- TL1 = NOTEL[10];
- TR1 = 1;
- Delay(1);
- beep = 0;
-
- }
- if(ss == 4)
- {
- beep = !beep;
- TH1 = NOTEH[11];
- TL1 = NOTEL[11];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 5)
- {
- beep = !beep;
- TH1 = NOTEH[12];
- TL1 = NOTEL[12];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 6)
- {
- beep = !beep;
- TH1 = NOTEH[13];
- TL1 = NOTEL[13];
- TR1 = 1;
- Delay(1);
- beep = 0;
- }
- if(ss == 7)
- {
- beep = !beep;
- TH1 = NOTEH[14];
- TL1 = NOTEL[14];
- TR1 = 1;
- Delay(1);
- beep = 0;
-
- }
-
-
- }
- void time0() interrupt 1
- {
- if(sign == 1)
- {
- beep = !beep;
- TH0 = NOTEH[fre_num];
- TL0 = NOTEL[fre_num];
- TR0 = 1;
-
-
- }
- }
- void main()
- {
- TMOD = 0x11;
- ET0 = 1;
- EA = 1;
- beep = 1;
-
- while(1)
- {
- PlayMusic();
- if(ss == 8)
- {
- sign = 1;
- }
- else
- Key();
- }
- }
复制代码 程序有问题 求帮助:
音乐播放器.7z
(142.61 KB, 下载次数: 35)
|