蜂鸣器演唱音乐
扫描二维码
随时随地手机看文章
修改自51单片机,launchpad的P10连接蜂鸣器,蜂鸣器演奏《八月桂花》
1 #include "msp430g2553.h"
2
3 unsigned char n=0; //n为节拍常数变量
4 unsigned char music_tab[] ={
5 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
6 0x20, 0x40, 0x1C , 0x10,
7 0x18, 0x10, 0x20 , 0x10,
8 0x1C, 0x10, 0x18 , 0x40,
9 0x1C, 0x20, 0x20 , 0x20,
10 0x1C, 0x20, 0x18 , 0x20,
11 0x20, 0x80, 0xFF , 0x20,
12 0x30, 0x1C, 0x10 , 0x18,
13 0x20, 0x15, 0x20 , 0x1C,
14 0x20, 0x20, 0x20 , 0x26,
15 0x40, 0x20, 0x20 , 0x2B,
16 0x20, 0x26, 0x20 , 0x20,
17 0x20, 0x30, 0x80 , 0xFF,
18 0x20, 0x20, 0x1C , 0x10,
19 0x18, 0x10, 0x20 , 0x20,
20 0x26, 0x20, 0x2B , 0x20,
21 0x30, 0x20, 0x2B , 0x40,
22 0x20, 0x20, 0x1C , 0x10,
23 0x18, 0x10, 0x20 , 0x20,
24 0x26, 0x20, 0x2B , 0x20,
25 0x30, 0x20, 0x2B , 0x40,
26 0x20, 0x30, 0x1C , 0x10,
27 0x18, 0x20, 0x15 , 0x20,
28 0x1C, 0x20, 0x20 , 0x20,
29 0x26, 0x40, 0x20 , 0x20,
30 0x2B, 0x20, 0x26 , 0x20,
31 0x20, 0x20, 0x30 , 0x80,
32 0x20, 0x30, 0x1C , 0x10,
33 0x20, 0x10, 0x1C , 0x10,
34 0x20, 0x20, 0x26 , 0x20,
35 0x2B, 0x20, 0x30 , 0x20,
36 0x2B, 0x40, 0x20 , 0x15,
37 0x1F, 0x05, 0x20 , 0x10,
38 0x1C, 0x10, 0x20 , 0x20,
39 0x26, 0x20, 0x2B , 0x20,
40 0x30, 0x20, 0x2B , 0x40,
41 0x20, 0x30, 0x1C , 0x10,
42 0x18, 0x20, 0x15 , 0x20,
43 0x1C, 0x20, 0x20 , 0x20,
44 0x26, 0x40, 0x20 , 0x20,
45 0x2B, 0x20, 0x26 , 0x20,
46 0x20, 0x20, 0x30 , 0x30,
47 0x20, 0x30, 0x1C , 0x10,
48 0x18, 0x40, 0x1C , 0x20,
49 0x20, 0x20, 0x26 , 0x40,
50 0x13, 0x60, 0x18 , 0x20,
51 0x15, 0x40, 0x13 , 0x40,
52 0x18, 0x80, 0x00
53 };
54
55
56 void delay (unsigned char m) //控制频率延时
57 {
58 unsigned i=3*m;
59 while(--i);
60 }
61
62 void delaymms(unsigned int a) //毫秒延时子程序
63 {
64 unsigned int t;
65 while(--a)
66 for(t=0;t<200;t++);
67 }
68
69 void main(void)
70 {
71 unsigned char p,m; //m为频率常数变量
72 unsigned char i=0;
73
74 WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
75
76 P1DIR = 0Xff;
77 P2DIR = 0Xff;
78
79 CCTL0 |= CCIE; // CCR0 interrupt enabled
80 CCR0 = 10000; //10ms
81 TACTL = TASSEL_2 ; // SMCLK, contmode
82 _EINT();
83
84
85 while(1)
86 {
87 p=music_tab[i];
88 if(p==0x00)
89 {
90 i=0;
91 delaymms(1000);
92 continue;;
93 } //如果碰到结束符,延时1秒,回到开始再来一遍
94 else if(p==0xff)
95 {
96 i=i+1;
97 delaymms(100);
98 TACTL &=~MC_1;
99 continue;
100 } //若碰到休止符,延时100ms,继续取下一音符
101 else
102 {
103 m=music_tab[i++];
104 n=music_tab[i++];
105 } //取频率常数 和 节拍常数
106
107 TACTL |= MC_1+TACLR; //开定时器
108 while(n!=0) P1OUT ^= BIT0,delay(m); //等待节拍完成
109 TACTL &=~MC_1; //关定时器
110 }
111
112 }
113
114
115 // Timer A0 interrupt service routine
116 #pragma vector=TIMER0_A0_VECTOR
117 __interrupt void Timer_A (void)
118 {
119 n--;
120 }