第二期:第15节,beep 大海

news2025/1/18 0:26:40

首先是 代码的编写:

里面已经有了解释了。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2221900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写&#xff1a;CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

[项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 | scp

目录 一、前言 二、项目的相关背景 三、搜索引擎的宏观原理 四、搜索引擎技术栈和项目环境 五、正排索引 VS 倒排索引--原理 正排索引 分词 倒排索引 六、编写数据去除标签和数据清洗模块 Parser 1.数据准备 parser 编码 1.枚举文件 EnumFile 2.去标签ParseHtml(…

使用Vscode配置ftp连接远程服务器(上传本地文件)

1.安装插件 扩展商店搜sftp,点击进行安装。 2.配置json文件 crtl+shift+p 输入ftp配置命令 sftp:config {"name": "My Server", //设置名字"host": "localhost"</

android app执行shell命令视频课程补充android 10/11适配-千里马android

(https://blog.csdn.net/learnframework/article/details/120103471) https://blog.csdn.net/learnframework/article/details/120103471 hi&#xff0c;有学员在学习跨进程通信专题课程时候&#xff0c;在实战app执行一个shell命令的项目时候&#xff0c;对课程本身的android …

JVM、字节码文件介绍

目录 初识JVM 什么是JVM JVM的三大核心功能 JVM的组成 字节码文件的组成 基础信息 Magic魔数 主副版本号 其它基础信息 常量池 字段 方法 属性 字节码常用工具 javap jclasslib插件 阿里Arthas 初识JVM 什么是JVM JVM的三大核心功能 1. 解释和运行虚拟机指…

js实现点击随机点名效果

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…

uniapp+vue3+uview-plus修改默认样式

最近使用uniappvue3uview-plus开发微信小程序中&#xff0c;使用uview-plus自定义底部导航栏tabbar时&#xff0c;遇到修改默认样式不生效问题 使用传统的 ::v-deep、:deep、::v-deep&#xff0c;或者style标签中去掉scoped也是无效的&#xff0c;有好的方案欢迎交流&#xff…

深入剖析 C 与 C++ 动态内存管理之术

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f970;&#xff0c;共创活力社区。 &#x1f525;&#x1f525;&#x1f525;【C】进阶&#xff1a;类相关…

Java 二分查找算法详解及通用实现模板案例示范

1. 引言 二分查找&#xff08;Binary Search&#xff09;是一种常见的搜索算法&#xff0c;专门用于在有序数组或列表中查找元素的位置。它通过每次将搜索空间缩小一半&#xff0c;从而极大地提高了查找效率。相比于线性查找算法&#xff0c;二分查找的时间复杂度为 O(log n)&…

利用Docker搭建一套Mycat2+MySQL8一主一从、读写分离的最简单集群(保姆教程)

文章目录 1、Mycat介绍1.1、mycat简介1.2、mycat重要概念1.3、Mycat1.x与Mycat2功能对比1.2、主从复制原理 2、前提准备3、集群规划4、安装和配置mysql主从复制4.1、master节点安装mysql8容器4.2、slave节点安装mysql8容器4.2、配置主从复制4.3、测试主从复制配置 5、安装mycat…

【TDA】持续同调的矢量化方法

Topological deep learning: a review of an emerging paradigm 持续同调与深度学习协同下的3D点云分类_苏潇 Applications of Topology to Data Analysis Computational Topology: An Introduction 持续同调对于特征的方式有条形码PB和持续图表PD两种形式,它们包含了持续同调的…

Qt开发技巧(十八):新窗口控件用智能指针,将一些配置类变量封装起来,Qt窗体的Z序叠放,子窗体的释放,Qt中的事件发送,Qt的全局头文件

继续讲一些Qt开发中的技巧操作&#xff1a; 1.新窗口控件用智能指针 通过对Qt自带Examples的源码研究你会发现&#xff0c;越往后的版本&#xff0c;越喜欢用智能指针QScopedPointer来定义对象&#xff0c;这样有个好处就是用的地方只管new就行&#xff0c;一直new下去&#xf…

2025 年最佳的 Retool 开源替代方案

自 2017 年推出以来&#xff0c;Retool 已迅速成为开发者的热门选择。 Retool 的出现&#xff0c;填补了当时企业在快速构建内部工具上的空白。传统的应用开发往往需要耗费大量时间和资源&#xff0c;尤其是对于定制的内部业务应用。而 Retool 提供了一个灵活的平台&#xff0…

element设置时间和日期框早于现在的时间和日期禁用

效果: 今日此时此刻之前的日期、时间禁止选用&#xff0c;切换日期和时间为“2024-10-19 00:00:00"&#xff0c;再切换为”2024-10-18 00:00:00"时&#xff0c; 会给form.time默认赋值为今日此时此刻&#xff08;日期时间少于今日此时此刻则重新赋值&#xff09; 安…

datax连接池泄漏问题排查及解决

1、问题描述 频繁调用datax服务&#xff08;从oracle同步到mysql&#xff09;出现报错&#xff0c;获取不到连接 oracle读取时报错信息 "errorMessage": "Code:[DBUtilErrorCode-10], Description:[连接数据库失败. 请检查您的 账号、密码、数据库名称、IP、…

print_hex_dump调试内核,嘎嘎香

本文首发于我的公众号 皮塞作坊 专注于干货分享&#xff0c;号欢迎大家关注,二维码文末可以扫。 公众号: 使用print_hex_dump调试内核/驱动&#xff0c;太香了 最近在验证芯片功能的过程中发现了一个好用的内核调试接口&#xff0c;print_hex_dump&#xff0c;除了直接打印16…

【AIGC】关键词智能匹配:AI驱动的RAG知识库检索技术全解析

随着大语言模型的快速发展&#xff0c;AI在知识获取和生成中的应用越发广泛。RAG&#xff08;Retrieval-Augmented Generation&#xff09;模型通过结合外部知识库&#xff0c;提升了生成文本的质量与准确性&#xff0c;而关键词搜索是其关键组成部分。本文将深入探讨AI如何通过…

【java】数组(超详细总结)

目录 一.一维数组的定义 1.创建数组 2.初始化数组 二.数组的使用 1.访问数组 2.遍历数组 3.修改数据内容 三.有关数组方法的使用 1.toString 2. copyOf 四.查找数组中的元素 1.顺序查找 2.二分查找binarySearch 五.数组排序 1.冒泡排序 2.排序方法sort 六.数组逆置…

LabVIEW伺服压机是如何实现压力位移的精度?

LabVIEW伺服压机通过精确的压力和位移控制&#xff0c;实现了高精度的压装操作。为了达到这种精度&#xff0c;系统通常依赖于多个硬件和软件模块的协同工作&#xff0c;包括伺服电机、压力传感器、位移传感器以及LabVIEW的实时控制和数据处理功能。以下是LabVIEW伺服压机如何实…

Linux修改npm的镜像源为淘宝镜像

起因&#xff1a;使用官方镜像源下载软件包速度太慢 1.查看npm当前镜像源命令 npm get registry 执行结果 2.还原为官方镜像源命令 npm config set registry https://registry.npmjs.org/ 3.修改为淘宝镜像命令 npm config set registry https://registry.npmmirror.com …