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

相关推荐
tokepson2 小时前
Mysql下载部署方法备份(Windows/Linux)
linux·服务器·windows·mysql
zz_nj5 小时前
工作的环境
linux·运维·服务器
极客先躯5 小时前
如何自动提取Git指定时间段的修改文件?Win/Linux双平台解决方案
linux·git·elasticsearch
suijishengchengde6 小时前
****LINUX时间同步配置*****
linux·运维
qiuqyue6 小时前
基于虹软Linux Pro SDK的多路RTSP流并发接入、解码与帧级处理实践
linux·运维·网络
切糕师学AI6 小时前
Linux 操作系统简介
linux
南烟斋..7 小时前
GDB调试核心指南
linux·服务器
爱跑马的程序员7 小时前
Linux 如何查看文件夹的大小(du、df、ls、find)
linux·运维·ubuntu
oMcLin9 小时前
如何在 Ubuntu 22.04 LTS 上部署并优化 Magento 电商平台,提升高并发请求的响应速度与稳定性?
linux·运维·ubuntu
Qinti_mm9 小时前
Linux io_uring:高性能异步I/O革命
linux·i/o·io_uring