第二期:第15节,beep 大海

首先是 代码的编写:

里面已经有了解释了。

  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 的音乐的 播放就是正产的了。

相关推荐
Stark、1 小时前
【Linux】文件IO--fcntl/lseek/阻塞与非阻塞/文件偏移
linux·运维·服务器·c语言·后端
新手上路狂踩坑2 小时前
Android Studio的笔记--BusyBox相关
android·linux·笔记·android studio·busybox
fnd_LN3 小时前
Linux文件目录 --- 复制命令CP、递归复制目录、软连接、硬链接
linux·运维·服务器
OopspoO3 小时前
Linux查看键鼠输入
linux
七七powerful3 小时前
ansible play-book玩法
linux·服务器·ansible
晚安,cheems4 小时前
linux的权限
linux·运维·服务器
路溪非溪4 小时前
Linux加载一个应用程序的过程总结
linux·运维·服务器
QT.qtqtqtqtqt5 小时前
攻防世界easyphp
linux·运维·服务器
菜鸟康5 小时前
Linux系统编程——系统内核中的信号
linux·运维·服务器
CSND7407 小时前
Ubuntu vi(vim)编辑器配置一键补全main函数
linux·c语言·ubuntu·编辑器·vim