找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3326|回复: 0
打印 上一主题 下一主题
收起左侧

单片机演奏音乐(F调3个8度7音阶)程序+Proteus仿真

[复制链接]
跳转到指定楼层
楼主
单片机演奏音乐仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /********本程序中,FOSC=11.0592M*********/
  2. #include<reg51.h>

  3. #include<intrins.h>

  4. #define uchar unsigned char
  5. #define uint  unsigned int

  6. struct music_type{
  7.         uchar tone;
  8.         uchar delay;
  9. };



  10. /**********F调3个8度7音阶的音高参数**********/
  11. uint code tonetab[]={  
  12.     64216,64360,64489,64603,64654,64752,64837, //低音1~7
  13.     64876,64948,65012,65042,65095,65144,65186, //中音1~7
  14.     65206,65242,65274,65289,65315,65340,65361  //高音1~7
  15. };
  16. //曲谱,每个音符含两项数据,第1项为音高,第2项为节拍(以1/4拍为单位)
  17. /**************康定情歌乐谱***************/
  18. struct music_type code  songtab[]={  
  19.         3+7,0x02,5+7,0x02,6+7,0x02,6+7,0x01,5+7,0x01,6+7,0x03,3+7,0x01,2+7,0x04,
  20.         3+7,0x02,5+7,0x02,6+7,0x02,6+7,0x01,5+7,0x01,6+7,0x03,3+7,0x06,
  21.         3+7,0x02,5+7,0x02,6+7,0x02,6+7,0x01,5+7,0x01,6+7,0x03,3+7,0x01,2+7,0x04,
  22.         5+7,0x02,3+7,0x02,2+7,0x01,3+7,0x01,2+7,0x01,1+7,0x01,2+7,0x02,6+0,0x06,
  23.         6+0,0x02,2+7,0x06,5+7,0x02,3+7,0x06,2+7,0x01,1+7,0x01,6+0,0x06,
  24.         5+7,0x02,3+7,0x02,2+7,0x01,3+7,0x01,2+7,0x01,1+7,0x01,2+7,0x02,6+0,0x06,
  25.         //
  26.         3+7,0x01,2+7,0x01,3+7,0x01,5+7,0x01,6+7,0x01,5+7,0x01,1+14,0x01,6+7,0x01,
  27.         5+7,0x01,3+7,0x01,5+7,0x04,6+7,0x02,
  28.         1+14,0x02,2+14,0x01,3+14,0x01,2+14,0x01,1+14,0x01,6+7,0x01,1+14,0x01,
  29.         5+7,0x08,
  30.         5+7,0x01,3+7,0x01,5+7,0x04,6+7,0x02,
  31.         1+14,0x02,2+14,0x01,3+14,0x01,1+14,0x01,6+7,0x01,5+7,0x02,
  32.         5+7,0x02,2+7,0x02,3+7,0x01,5+7,0x01,3+7,0x01,2+7,0x01,
  33.         1+7,0x01,6,0x01,1+7,0x06,
  34.         3+7,0x01,2+7,0x01,1+7,0x02,2+7,0x03,3+7,0x01,
  35.         5+7,0x02,6+7,0x01,1+14,0x01,6+7,0x02,5+7,0x02,
  36.         5+7,0x01,3+7,0x01,2+7,0x02,3+7,0x01,5+7,0x01,3+7,0x01,2+7,0x01,
  37.         1+7,0x01,2+7,0x01,6,0x04,1+7,0x02,
  38.         2+7,0x03,3+7,0x01,1+7,0x01,2+7,0x01,1+7,0x02,6,0x01,
  39.         1+7,0x01,6,0x01,5,0x05,
  40.         //
  41.         3+7,0x01,2+7,0x01,3+7,0x01,5+7,0x01,6+7,0x01,5+7,0x01,1+14,0x01,6+7,0x01,
  42.         5+7,0x01,3+7,0x01,5+7,0x04,6+7,0x02,
  43.         1+14,0x02,2+14,0x01,3+14,0x01,2+14,0x01,1+14,0x01,6+7,0x01,1+14,0x01,
  44.         5+7,0x08,
  45.         5+7,0x01,3+7,0x01,5+7,0x04,6+7,0x02,
  46.         1+14,0x02,2+14,0x01,3+14,0x01,1+14,0x01,6+7,0x01,5+7,0x02,
  47.         5+7,0x02,2+7,0x02,3+7,0x01,5+7,0x01,3+7,0x01,2+7,0x01,
  48.         1+7,0x01,6,0x01,1+7,0x06,
  49.         3+7,0x01,2+7,0x01,1+7,0x02,2+7,0x03,3+7,0x01,
  50.         5+7,0x02,6+7,0x01,1+14,0x01,6+7,0x02,5+7,0x02,
  51.         5+7,0x01,3+7,0x01,2+7,0x02,3+7,0x01,5+7,0x01,3+7,0x01,2+7,0x01,
  52.         1+7,0x01,2+7,0x01,6,0x04,1+7,0x02,
  53.         2+7,0x03,3+7,0x01,1+7,0x01,2+7,0x01,1+7,0x02,6,0x01,
  54.         1+7,0x01,6,0x01,5,0x05,

  55.         0,0x00
  56. };
  57. /*********端口及变量定义**********/
  58. sbit SPEAKER = P3^7;

  59. uchar tlow1,thig1;

  60. /*******软件延时,约n*10us******/
  61. void delay10us(unsigned char n){
  62.         do{
  63.         _nop_();
  64.         _nop_();
  65.         _nop_();
  66.         _nop_();
  67.         _nop_();
  68.         }while(--n);
  69. }
  70. /*******软件延时,约n ms******/
  71. void delayms(unsigned int n){
  72.         do {
  73.                 delay10us(131);
  74.         }while(--n);
  75. }


  76. main () {
  77.         uchar i,j;
  78.         EA=1;ET0=1;
  79.         TMOD=0X01;
  80.         while(1){
  81.                 i=0;
  82.                 while(songtab[i].delay!=0){
  83.                         if(songtab[i].tone==0)TR0=0;  //音高数据为0
  84.                         else{     //音高数据不为0
  85.                                 //用定时器参数控制T1的振荡频率,即音高
  86.                                 thig1=TH0=tonetab[songtab[i].tone-1]/256;
  87.                                 tlow1=TL0=tonetab[songtab[i].tone-1]%256;
  88.                                 TR0=1;
  89.                         }
  90.                         //控制音符的持续时间,即节拍
  91.                         for(j=0;j<songtab[i].delay;j++){

  92.                                 delayms(200);
  93.                         }
  94.                         i++; //下一个音符
  95.                 }
  96.                 TR0=0;  //停止演奏
  97.                 delayms(1000);  //一遍完成后等待
  98.         }
  99. }

  100. /*******定时器1中断,控制蜂鸣器发声频率*******/
  101. void  t0 () interrupt 1{
  102.         TH0=thig1;TL0=tlow1;
  103.         SPEAKER = !SPEAKER;  //蜂鸣器发声
  104. }
复制代码

所有资料51hei提供下载:
单片机演奏音乐.rar (54.52 KB, 下载次数: 43)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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