首先是 代码的编写:
里面已经有了解释了。
1 /*
2 * main.c
3 *
4 * Created on: 2023-3-8
5 * Author: pengdan
6 */
7 #include "exynos_4412.h"
8
9 void delay_ms(unsigned int num)
10 {
11 int i,j;
12 for(i=num; i>0;i--)
13 for(j=1000;j>0;j--)
14 ;
15 }
16 void pwm_init(void)
17 {
18 GPD0.CON = GPD0.CON & (~(0xf))| 0x2;
19 GPD0.PUD = GPD0.PUD & (~(0xf)) ;
20 PWM.TCFG0 = PWM.TCFG0 & (~(0xff))|0xf9;
21 PWM.TCFG1 = PWM.TCFG1 & (~(0xf)) | 0x2;
22 PWM.TCMPB0 = 50;
23 PWM.TCNTB0 = 100;
24 PWM.TCON = PWM.TCON & (~(0xff)) | (1 << 0) | (1 << 1) ;
25 }
26 void beep_on(void)
27 {
28 PWM.TCON = PWM.TCON & (~(0xff)) | (1 << 0) | (1 << 3) ;
29 }
30 void beep_off(void)
31 {
32 PWM.TCON = PWM.TCON & (~(1 << 0)) ;
33 }
34 #define SYS_SET_FREQUENCE 25000
35 void beep_set_frequence( unsigned int fre )
36 {
37 if( 0==fre )
38 return ;
39 // 这里我有一个疑问,这个频率最大能够设置多大呢?
40 // 这里的 25000 我不知道是怎么来的.
41 // 这里就是在设置 频率, 频率既跟 音高有关,也跟 音符 1234567 有关。
42 // 这里都是 一半高电平, 一半低电平。
43
44
45 PWM.TCMPB0 = SYS_SET_FREQUENCE/(fre+fre);
46 PWM.TCNTB0 = SYS_SET_FREQUENCE/fre;
47 }
48
49
50 // 这里的 0x13 , 不是数字, 而是数组的下表.
51 // 1 代表的是 数组的 横坐标, 3 代表的是数组的 列。
52 const unsigned char dahai[] =
53 {
54 0x13, 0x15 , 0x16, 0x16, 0x16, 0x16, 0x21, 0x16, 0x15, 0x15, 0x16, 0x15,
55 0x13, 0x12 , 0x11, 0x11, 0x11, 0x11, 0x12, 0x13,
56 0x13, 0x12 , 0x11, 0x11, 0x11, 0x11, 0x21, 0x16, 0x15, 0x15, 0x16, 0x15,
57 0x13, 0x15, 0x16, 0x21, 0x21, 0x16, 0x15, 0x15,
58 };
62 // 这里的time 指的是 音符的间隔时间, 也就是节拍。
63 // 也就是 延时时间
64 const unsigned char time[] =
65 {
66 4, 4, 4, 2, 4 , 2, 4, 4, 4, 2, 4, 2 ,
67 4, 4, 4, 2, 4, 2, 2, 1,
68 4, 4, 4, 2, 4, 2, 4, 4, 4, 2, 4, 2,
69 4, 4, 2, 4, 2, 4, 4, 1
70
71 };
72
73 // 这里的 数组代表的是 具体的 频率的设置o
74
75 const unsigned int yinyue[3][7]
76 ={
77 262, 294, 330, 370, 415, 266, 294,
78 523, 578, 659, 698, 784, 880, 988,
79 1046, 1174, 1318, 1396, 1567, 1700, 1975
80 };
81
82
83 int main (void)
84 {
85 unsigned int loop = 0;
86 unsigned int a = 0;
87 unsigned int b = 0;
88 unsigned int delay = 0;
89
90 pwm_init();
91
92 while(1)
93 {
94 for(loop=0; loop<sizeof(dahai)/(sizeof(unsigned char)); loop++)
95 {
96 // 这里取出 数组的行
97 a = dahai[loop]>>4 ;
98
99 // 这里取出数组的 列, 列是从0 开始的, 但是音符1234567 是从1 开始的,所以这里为了计算出 数据的位置,需要减1 , 其实这里 可以 提前计算好,不用在这里减。
100
101 b = (dahai[loop] & 0x0f )-1;
102
103 // 这里 的1500 怎么来的我不知道。
104 // 这里在计算延时的时间
105 // delay = 0x1500/time[loop];
106 delay = 0x150/time[loop];
107 // 设置频率。
108 beep_set_frequence( yinyue[a][b] );
109 beep_on();
110
111 // 延时
112 delay_ms(delay);
113
114 beep_off();
115 // delay_ms(100);
116 delay_ms(10);
117 }
118
119 delay_ms(1000000);
120 }
121 return 0;
122 }
123
然后是我自己的测试:
将程序编译完之后,烧写在板子上进行测试:
我发现时间 非常的快, 就像是在 两倍速 播放,
修改一下代码:
我改的主要是这个地方:
到这里 , pwm 的音乐的 播放就是正产的了。