找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 688|回复: 2
收起左侧

基于51单片机音乐播放器Proteus仿真源程序设计

[复制链接]
ID:1106310 发表于 2023-12-25 20:02 | 显示全部楼层 |阅读模式
原创作品,禁止转载售卖,仅供学习参考!!!
仿真目的和要求:
(1)  进一步熟悉定时/计数器的应用
(2)  让单片机放个音乐听听
项目内容:
(1)  选定一首歌,下载歌谱,按照音调和节拍生成数据格式,用蜂鸣器播放。
(2)  按键定义钢琴的键盘,按下按键可以发出不同的声音,可以弹奏简单的曲调。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

Proteus

Proteus

部分代码截图

部分代码截图


单片机源程序如下:
  1. #include <REGX52.H>
  2. sbit beep = 0xA6;
  3. unsigned int num = 0;
  4. unsigned char number = 1;//歌曲序号
  5. unsigned char time = 0;//节拍时间,第三个数
  6. unsigned char fre_num ;
  7. unsigned char sign = 0;

  8. unsigned char flag = 1;

  9. //简单爱
  10. unsigned char code music[]={
  11.     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,
  12.     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,
  13.     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,
  14.     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,
  15.     2,2,1, 2,2,1, 3,2,1, 3,2,1, 5,2,1, 5,2,1,
  16.     5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,1, 1,2,2,  
  17.     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,
  18.     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,
  19.     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,
  20.     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 };



  21. // 频率-半周期数据表 高八位  共保存了四个八度的28个频率数据
  22. unsigned char code NOTEH[]={
  23.     0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,    //低音1234567
  24.     0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
  25.     0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,            //高音 234567
  26.     0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};   //超高音 1234567

  27. // 频率-半周期数据表 低八位
  28. unsigned char code NOTEL[]={
  29.     0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,    //低音1234567
  30.     0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
  31.     0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,             //高音 234567
  32.     0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};   //超高音 1234567

  33. void Delay(unsigned char t) //延时子函数,控制发音的时间长度,每个节拍0.4S
  34. {
  35.     unsigned char t1;
  36.     unsigned long t2;
  37.     for (t1 = 0; t1 < t; t1++) //嵌套循环, 共延时t个半拍
  38.     {
  39.         for (t2 = 0; t2 < 8000; t2++) //延时期间, 可进入T0中断去发音
  40.         {
  41.             ;
  42.         }
  43.     }
  44.     TR0 = 0; //关闭T0, 停止发音
  45. }
  46. void Delay20ms()                //@11.0592MHz
  47. {
  48.         unsigned char i, j, k;

  49.         
  50.         i = 1;
  51.         j = 216;
  52.         k = 35;
  53.         do
  54.         {
  55.                 do
  56.                 {
  57.                         while (--k);
  58.                 } while (--j);
  59.         } while (--i);
  60. }

  61.         
  62. void ONE() //演奏一个音符
  63. {
  64.                 beep = !beep;
  65.     TH0 = NOTEH[fre_num];      
  66.     TL0 = NOTEL[fre_num];
  67.     TR0 = 1;     
  68.     Delay(time);
  69. }

  70. void PlayMusic() //播放相应歌曲的某个音符
  71.         {
  72.                 if(sign == 1)
  73.                 {
  74.                 if ((number == 1) && (flag == 1))
  75.     {
  76.         fre_num = music[num] + 7 * music[num + 1] - 1; //第i个是音符,第i+1个是第几个八度
  77.         time = music[num + 2]; //读出时间长度数值
  78.         num += 3;
  79.         if (fre_num < 0)
  80.         {
  81.             num = 0;
  82.             number = 1;
  83.         }
  84.         ONE(); //发出一个音符
  85.         
  86.     }
  87.    
  88.    
  89.                 }
  90.                 sign = 0;
  91.                 beep = 1;
  92.    
  93.    
  94.         }        
  95.         unsigned char key_scan()
  96. {
  97.         unsigned char KeyNumber = 0;
  98.         
  99.         P1 = 0xff;
  100.         P1_0 = 0;
  101.         if(P1_4 == 0){Delay20ms();while(P1_4 == 0);KeyNumber = 1;}
  102.         if(P1_5 == 0){Delay20ms();while(P1_5 == 0);KeyNumber = 2;}
  103.         if(P1_6 == 0){Delay20ms();while(P1_6 == 0);KeyNumber = 3;}
  104.         if(P1_7 == 0){Delay20ms();while(P1_7 == 0);KeyNumber = 4;}
  105.         
  106.         P1 = 0xff;
  107.         P1_1 = 0;
  108.         if(P1_4 == 0){Delay20ms();while(P1_4 == 0);KeyNumber = 5;}
  109.         if(P1_5 == 0){Delay20ms();while(P1_5 == 0);KeyNumber = 6;}
  110.         if(P1_6 == 0){Delay20ms();while(P1_6 == 0);KeyNumber = 7;}
  111.         if(P1_7 == 0){Delay20ms();while(P1_7 == 0);KeyNumber = 8;}
  112.         
  113.         P1 = 0xff;
  114.         
  115.         return KeyNumber;
  116. }
  117. unsigned char ss ;
  118. void Key()
  119. {
  120.         
  121.         ss = key_scan();
  122.         if(ss == 1)
  123.                 {
  124.                                 beep = !beep;        
  125.                                 TH1 = NOTEH[8];
  126.                                 TL1 = NOTEL[8];
  127.                                 TR1 = 1;
  128.                                 Delay(1);
  129.                                 beep = 0;
  130.                         }        
  131.         if(ss == 2)
  132.                 {
  133.                                 beep = !beep;        
  134.                                 TH1 = NOTEH[9];
  135.                                 TL1 = NOTEL[9];
  136.                                 TR1 = 1;
  137.                                 Delay(1);
  138.                                 beep = 0;
  139.                         }               
  140.         if(ss == 3)
  141.         {
  142.                                 beep = !beep;        
  143.                                 TH1 = NOTEH[10];
  144.                                 TL1 = NOTEL[10];
  145.                                 TR1 = 1;
  146.                                 Delay(1);
  147.                                 beep = 0;
  148.                                 
  149.         }
  150.         if(ss == 4)
  151.         {
  152.                                 beep = !beep;        
  153.                                 TH1 = NOTEH[11];
  154.                                 TL1 = NOTEL[11];
  155.                                 TR1 = 1;
  156.                                 Delay(1);
  157.                                 beep = 0;
  158.                         }        
  159.         if(ss == 5)
  160.         {
  161.                 beep = !beep;        
  162.                                 TH1 = NOTEH[12];
  163.                                 TL1 = NOTEL[12];
  164.                                 TR1 = 1;
  165.                                 Delay(1);
  166.                                 beep = 0;
  167.         }
  168.         if(ss == 6)
  169.         {
  170.                         beep = !beep;        
  171.                                 TH1 = NOTEH[13];
  172.                                 TL1 = NOTEL[13];
  173.                                 TR1 = 1;
  174.                                 Delay(1);
  175.                                 beep = 0;
  176.         }
  177.         if(ss == 7)
  178.         {
  179.                 beep = !beep;        
  180.                                 TH1 = NOTEH[14];
  181.                                 TL1 = NOTEL[14];
  182.                                 TR1 = 1;
  183.                                 Delay(1);
  184.                                 beep = 0;
  185.                                 
  186.         }
  187.         
  188.         
  189. }

  190. void time0() interrupt 1
  191. {
  192.         if(sign == 1)
  193.                 {               
  194.                                 beep = !beep;         
  195.                                 TH0 = NOTEH[fre_num];  
  196.                                 TL0 = NOTEL[fre_num];
  197.                                 TR0 = 1;
  198.                                 
  199.                                                 
  200.                 }
  201. }
  202. void main()
  203. {
  204.         TMOD = 0x11;
  205.         ET0 = 1;
  206.         EA = 1;
  207.         beep = 1;
  208.         
  209.         while(1)
  210.         {
  211.                 PlayMusic();
  212.                 if(ss == 8)
  213.                 {
  214.                                 sign = 1;
  215.                 }
  216.                 else
  217.                         Key();
  218.         }
  219. }
复制代码
程序有问题 求帮助: 音乐播放器.7z (142.61 KB, 下载次数: 23)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1106038 发表于 2023-12-28 20:06 | 显示全部楼层
哥们我用你这个试了下没有效果啊
回复

使用道具 举报

ID:1106157 发表于 2023-12-29 00:55 | 显示全部楼层
czbj666 发表于 2023-12-28 20:06
哥们我用你这个试了下没有效果啊

是部分代码,我前面没注意弄了好几次都不行后面才看到
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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