第二期:第15节,beep 大海
首先是 代码的编写:
里面已经有了解释了。
1 /*2 * main.c3 *4 * Created on: 2023-3-85 * Author: pengdan6 */7 #include "exynos_4412.h"89 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 2500035 void beep_set_frequence( unsigned int fre )36 {37 if( 0==fre )38 return ;39 // 这里我有一个疑问,这个频率最大能够设置多大呢?40 // 这里的 25000 我不知道是怎么来的.41 // 这里就是在设置 频率, 频率既跟 音高有关,也跟 音符 1234567 有关。42 // 这里都是 一半高电平, 一半低电平。434445 PWM.TCMPB0 = SYS_SET_FREQUENCE/(fre+fre);46 PWM.TCNTB0 = SYS_SET_FREQUENCE/fre;47 }484950 // 这里的 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, 17071 };7273 // 这里的 数组代表的是 具体的 频率的设置o7475 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, 197580 };818283 int main (void)84 {85 unsigned int loop = 0;86 unsigned int a = 0;87 unsigned int b = 0;88 unsigned int delay = 0;8990 pwm_init();9192 while(1)93 {94 for(loop=0; loop<sizeof(dahai)/(sizeof(unsigned char)); loop++)95 {96 // 这里取出 数组的行97 a = dahai[loop]>>4 ;9899 // 这里取出数组的 列, 列是从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 的音乐的 播放就是正产的了。