找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于STC系列单片机的蜂鸣器音乐播放程序

[复制链接]
跳转到指定楼层
楼主
ID:635836 发表于 2020-5-28 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采用两个定时器,一个用于产生不同频率方波,另一个控制音节长度
至少要使用有1T定时器的单片机

单片机源程序如下:
  1. #include"STC12C5A60S2.h"
  2. #include<intrins.h>
  3. typedef unsigned int u16;
  4. typedef unsigned char u8;
  5. //音乐播放小程序 @12MHz
  6. sbit output=P1^0;//接蜂鸣器
  7. u8 f[48][2]={//C4-B8
  8. //                C                        #C                        D                        #D                        E                        F                        #F                        G                        #G                        A                        #A                        B
  9.         {0x4b,0xb7},{0x56,0xe4},{0x60,0x61},{0x69,0x57},{0x71,0xcc},{0x79,0xc7},{0x81,0x50},{0x88,0x6c},{0x8f,0x22},{0x95,0x78},{0x9b,0x72},{0xa1,0x17},
  10.         {0xa5,0xdc},{0xab,0x72},{0xb0,0x31},{0xb4,0xac},{0xb8,0xe6},{0xbc,0xe4},{0xc0,0xa8},{0xc4,0x36},{0xc7,0x91},{0xca,0xbc},{0xcd,0xb9},{0xd0,0x8c},
  11.         {0xd2,0xee},{0xd5,0xb9},{0xd8,0x19},{0xda,0x56},{0xdc,0x73},{0xde,0x72},{0xe0,0x54},{0xe2,0x1b},{0xe3,0xc9},{0xe5,0x5e},{0xe6,0xdd},{0xe8,0x46},
  12.         {0xe9,0x77},{0xea,0xdd},{0xec,0x0d},{0xed,0x2b},{0xee,0x3a},{0xef,0x39},{0xf0,0x2a},{0xf1,0x0e},{0xf1,0xe5},{0xf2,0xaf},{0xf3,0x6f},{0xf4,0x23}};
  13. u8 reH,reL;
  14. u8 spH,spL;
  15. u8 length;
  16. u16 disp;
  17. u16 fulllength;//乐曲总音节数
  18. u8 speed;//速度(b/min)
  19. char tune;//调(单位为半音)
  20. u8 code music[][2]={
  21.         {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
  22.         {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
  23.         {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
  24.         {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
  25.         {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
  26.         {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
  27.         {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{21,2},{19,2},{19,1},{21,1},//10
  28.         {255,2},{21,2},{21,2},{19,1},{21,1},{255,2},{36,2},{35,2},{31,2},//9
  29.         {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
  30.         {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
  31.         {35,4},{31,4},{41,4},{38,4},//4
  32.         {38,3},{38,3},{40,2},{255,2},{36,2},{35,2},{31,2},//7
  33.         {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
  34.         {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
  35.         {33,4},{255,4},{33,2},{35,2},{36,2},{38,2},//6
  36.         {35,4},{31,4},{28,4},{31,4},//4
  37.         {31,2},{33,1},{33,3},{36,2},{35,2},{31,1},{28,1},{28,2},{31,2},//9
  38.         {31,2},{33,1},{33,17},{255,12},//4--145
  39.         {30,8},{30,2},{28,2},{30,2},{32,2},//5
  40.         {30,8},{30,2},{28,2},{30,2},{32,2},//5
  41.         {33,8},{33,2},{35,2},{33,2},{32,2},//5
  42.         {33,2},{32,2},{30,2},{37,2},{33,8},//5
  43.         {30,8},{30,2},{28,2},{30,2},{32,2},//5
  44.         {30,8},{30,2},{28,2},{30,2},{32,2},//5
  45.         {33,4},{26,4},{32,2},{30,2},{28,2},{30,2},//6
  46.         {28,6},{26,2},{26,8},//3--184
  47.         {33,2},{33,1},{33,2},{33,1},{33,4},{33,2},{32,2},{31,2},//8
  48.         {29,4},{29,2},{37,1},{37,7},{37,1},{37,1},//6
  49.         {37,2},{35,2},{33,2},{20,2},{35,1},{33,2},{32,3},{30,2},//8
  50.         {28,3},{28,3},{26,2},{30,8},//4
  51.         {30,2},{30,1},{30,2},{30,1},{30,4},{30,2},{32,2},{32,2},//8
  52.         {32,4},{32,2},{28,1},{28,5},{255,2},{28,2},//6
  53.         {26,4},{26,2},{25,2},{26,2},{28,1},{30,3},{30,2},//7
  54.         {30,6},{28,1},{26,1},{28,8},//4
  55.         {37,3},{255,2},{38,3},{255,2},{37,3},{255,3},//5--240
  56.         {255,5},{36,2},{35,2},{31,2},//4
  57.         {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
  58.         {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
  59.         {35,4},{31,4},{41,4},{38,4},//4
  60.         {38,3},{38,3},{40,2},{255,2},{36,2},{35,2},{31,2},//7
  61.         {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
  62.         {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
  63.         {33,5},{255,3},{33,2},{35,2},{36,2},{38,2},//6//////////////
  64.         {35,3},{31,3},{28,3},//3////////////////////////
  65.         {255,2},{36,2},{35,2},{31,2},//4
  66.         {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
  67.         {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
  68.         {35,4},{31,4},{41,4},{38,4},//4
  69.         {38,3},{38,3},{40,2},{255,2},{36,2},{35,2},{31,2},//7
  70.         {31,2},{33,1},{33,3},{31,2},{31,2},{33,1},{33,3},{31,2},//8
  71.         {31,2},{33,1},{33,3},{31,2},{33,2},{35,2},{36,2},{38,2},//8
  72.         {33,5},{255,3},{33,2},{35,2},{36,2},{38,2},//6/////////////////
  73.         {35,4},{31,4},{28,4},{31,4},//4
  74.         {31,2},{33,1},{33,3},{36,2},{35,2},{31,1},{28,1},{28,2},{31,2},//9
  75.         {31,2},{33,1},{33,17},{255,12},//4--366
  76. };
  77. void delay(u16 a)
  78. {
  79.         u8 i;
  80.         while(a--)
  81.         {
  82.                 i=110;
  83.                 while(i--);
  84.         }
  85. }
  86. void init()
  87. {
  88.         unsigned long auxnum;
  89.         delay(10);
  90.         AUXR|=0x80;//T0不分频,12倍速
  91.         TMOD|=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

  92.         fulllength=366;
  93.         tune=-1;
  94.         speed=115;

  95.         auxnum=7500/speed;
  96.         auxnum*=1000;
  97.         auxnum=65536-auxnum;
  98.         spH=auxnum>>8;
  99.         spL=auxnum%16;

  100.         TH0=f[music[disp][0]+tune][0];//给定时器0赋初值
  101.         TL0=f[music[disp][0]+tune][1];
  102.         TH1=spH;//一个16分音符
  103.         TL1=spL;
  104.         ET0=1;//打开定时器中断允许
  105.         ET1=1;
  106.         EA=1;//打开总中断
  107.         TR0=1;//打开定时器
  108.         TR1=1;
  109. }
  110. void main()
  111. {
  112.         init();
  113.         P1M0=0x01;
  114.         while(1)
  115.         {
  116.                 if(length>music[disp][1])
  117.                 {
  118.                         TR0=0;
  119.                         length=0;
  120.                         disp++;
  121.                         if(disp>=fulllength)
  122.                         {
  123.                                 delay(2000);
  124.                                 disp=0;
  125.                         }
  126.                         TR0=1;
  127.                         delay(100);
  128.                         if(music[disp][0]==255)//空音
  129.                                 TR0=0;
  130.                         else
  131.                         {
  132.                                 TH0=reH=f[music[disp][0]+tune][0];
  133.                                 TL0=reL=f[music[disp][0]+tune][1];
  134.                         }
  135.                 }
  136.                
  137.         }
  138. }
  139. void Timer0() interrupt 1
  140. {
  141.         TH0=reH;
  142.         TL0=reL;
  143.         output=~output;
  144. }
  145. void Timer1() interrupt 3
  146. {
  147.         TH1=spH;//一个16分音符
  148.         TL1=spL;
  149.         length++;
  150. }
复制代码

以上资料51hei提供下载:
music.rar (1.46 KB, 下载次数: 30)


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

使用道具 举报

沙发
ID:764394 发表于 2020-5-29 17:52 | 只看该作者
感谢分享,拿去测试一下,谢谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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