当前位置: 首页 > news >正文

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


http://www.mrgr.cn/news/57082.html

相关文章:

  • latex表格单独编译成pdf表格
  • 华为配置 之 划分VLAN
  • 哪些WordPress的AI插件,更适合收集整理地球前100大行业的信息和关键词?谢谢。0.1
  • SAP B1 缺少税务科目 - 报错 debug
  • 秃姐学AI系列之:FCN + 代码实现
  • java和嵌入式现在哪个好?
  • js 防抖函数避免重复点击提交
  • 全域商户抽佣系统:智能分账新时代
  • 读hunter_bipedal_control-main
  • 力扣209-长度最小的子数组-滑动窗口思想
  • Chromium 沙盒Sandbox源码介绍(3)
  • ppt组合为一个整体怎么做?2个ppt常用操作和技巧分享!
  • QT-子项目管理
  • linux-牛刀小试
  • 一个非常实用的 Vue 拖拽组件,成熟、稳定且功能丰富的拖拽库,效率与灵活性的双重提升(带私活源码)
  • 数据库聚合函数
  • 等价文件名绕过
  • 技术速递|Microsoft.Extensions.AI 预览版简介 – 适用于 .NET 的统一 AI 构建块
  • 10.18做题记
  • C#中的LINQ之美:优雅的数据查询与操作