STC8H8K64U 学习笔记 - PWM

STC8H8K64U 学习笔记 - PWM

  • 环境说明
    • 引脚说明
  • PWM
    • 呼吸灯
    • 震动马达
  • 乐谱

环境说明

该内容仅针对我自己学习的开发板做的笔记,在实际开发中需要针对目标电路板的原理图进行针对性研究。

  • 芯片:STC8H8K64U
  • 烧录软件:stc-isp-v6.92G
  • 编码工具:天问

引脚说明

  • P0_0:蜂鸣器,按频率发音,1:高,0:低
  • P0_1:电动马达,0:停,1:动
  • P5_3:小蓝灯,0:灭,1:亮
  • P2_7:1 号 LED 灯,0:亮,1:灭
  • P2_6:2 号 LED 灯,0:亮,1:灭
  • P1_5:3 号 LED 灯,0:亮,1:灭
  • P1_4:4 号 LED 灯,0:亮,1:灭
  • P2_3:5 号 LED 灯,0:亮,1:灭
  • P2_2:6 号 LED 灯,0:亮,1:灭
  • P2_1:7 号 LED 灯,0:亮,1:灭
  • P2_0:8 号 LED 灯,0:亮,1:灭
  • P5_1:1 号按键,0:按下,1:弹起
  • P5_2:2 号按键,0:按下,1:弹起
  • P5_3:3 号按键,0:按下,1:弹起
  • P5_4:4 号按键,0:按下,1:弹起
  • P3_4:矩阵键盘第 1 行引脚
  • P3_5:矩阵键盘第 2 行引脚
  • P4_0:矩阵键盘第 3 行引脚
  • P4_1:矩阵键盘第 4 行引脚
  • P0_3:矩阵键盘第 1 列引脚
  • P0_6:矩阵键盘第 2 列引脚
  • P0_7:矩阵键盘第 3 列引脚
  • P1_7:矩阵键盘第 4 列引脚

PWM

  • 频率和周期的关系
    • 频率(Frequency): 表示单位时间内发生事件的次数。常用单位是赫兹(Hz),1赫兹等于每秒一个周期。
    • 周期(Period): 表示一个完整事件发生所需的时间。周期是频率的倒数。
    • 举例:
      • 24MHz(兆赫兹),每秒计算24M次,1M = 1k * 1k = 1 000 000
        • 那么周期的时间就是1/24MHz=41.67ns,那么计算1次需要41.67ns,就是说执行1次所需的时间
  • PWM全称是脉宽调制(Pulse Width Modulation),是一种通过改变信号的脉冲宽度来控制电路输出的技术。
  • PWM与引脚对应关系(引脚来源:《stc8h.pdf》的 997 页)

在这里插入图片描述

呼吸灯

通过 PWM 设置 LED 灯的亮度

#define PWM_DUTY_MAX 1000//PWM最大占空比值#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "lib/PWM.h"
#include "lib/delay.h"uint16 index = 0;
int16 inc = 5;
uint16 frequency = 1000;void setup() {twen_board_init();//天问51初始化pwm_init(PWM4N_P27, frequency, 0);pwm_init(PWM4P_P26, frequency, 0);// pwm_init(PWM3N_P15, frequency, 0);// pwm_init(PWM3P_P14, frequency, 0);// pwm_init(PWM2N_P23, frequency, 0);// pwm_init(PWM2P_P22, frequency, 0);// pwm_init(PWM1N_P21, frequency, 0);// pwm_init(PWM1P_P20, frequency, 0);
}void loop() {pwm_duty(PWM4N_P27, index);pwm_duty(PWM4P_P26, index);// pwm_duty(PWM3N_P15, index);// pwm_duty(PWM3P_P14, index);// pwm_duty(PWM2N_P23, index);// pwm_duty(PWM2P_P22, index);// pwm_duty(PWM1N_P21, index);// pwm_duty(PWM1P_P20, index);delay(1);if(index >= 1000) {inc = -5;}if(index <= 0) {inc = 5;}index+= inc;
}void main(void) {setup();while(1){loop();}
}

震动马达

通过 PWM 设置马达的震动强度

#define PWM_DUTY_MAX 1000//PWM最大占空比值#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "lib/PWM.h"
#include "lib/delay.h"uint16 index = 0;
int16 inc = 5;
uint16 frequency = 1000;void setup() {twen_board_init();//天问51初始化pwm_init(PWM6_P01, frequency, 0);P0M1&=~0x02;P0M0|=0x02;//推挽输出
}void loop() {  pwm_duty(PWM6_P01, index);delay(1);if(index >= 1000) {inc = -5;}if(index <= 0) {inc = 5;}index+= inc;
}void main(void) {setup();while(1){loop();}
}

乐谱

#define PWM_DUTY_MAX 1000//PWM最大占空比值#include <STC8HX.h>
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include "lib/twen_board.h"
#include "lib/UART.h"
#include "lib/PWM.h"// 哆Do  来Re  咪Mi  发Fa  唆So  拉La  西Si  哆Do
// 523,  587,  659,  698,  784,  880,  988,  1047
// 1047, 1175, 1319, 1397, 1568, 1760, 1976, 2093
// 2093, 2349, 2637, 2794, 3135, 3520, 3951, 4186// 设定小字2组的音阶
#define s2_Do 1047
#define s2_Re 1175
#define s2_Mi 1319
#define s2_Fa 1397
#define s2_So 1568
#define s2_La 1760
#define s2_Si 1976
// 设定小字3组的音阶
#define s3_Do 2093
#define s3_Re 2349
#define s3_Mi 2637
#define s3_Fa 2794
#define s3_So 3135
#define s3_La 3520
#define s3_Si 3951
#define s4_Do 4186
// 设定默认的中音(小字2组的音阶)
#define M1 1047
#define M2 1175
#define M3 1319
#define M4 1397
#define M5 1568
#define M6 1760
#define M7 1976
// 设定默认的高音(小字3组的音阶)
#define G1 2093
#define G2 2349
#define G3 2637
#define G4 2794
#define G5 3135
#define G6 3520
#define G7 3951void putchar(char c) {if (c == '\n') {uart_putchar(UART_1, 0x0d);uart_putchar(UART_1, 0x0a);} else {uart_putchar(UART_1, (uint8)c);}
}// 每个音阶之间的停顿时间
uint16 spot = 200;
// 单个音阶的持续时间
uint16 duration = 100;
// 按键按下标志位
uint8 pressed1 = 0;
uint8 pressed2 = 0;
// 连续播放乐谱数组过程中的循环索引值
uint16 index = 0;
// 连续播放乐谱数组过程中的循环长度
uint16 lenth = 0;void setup() {twen_board_init();//天问51初始化P0M1&=~0x01;P0M0|=0x01;//推挽输出uart_init(UART_1, UART1_RX_P30, UART1_TX_P31, 115200, TIM_1);//初始化串口
}// 启动蜂鸣器(输入单位 hz)
// @param hz        蜂鸣器输入频率
// @param recess    与下一个音阶之间的休息时间
void launchBuzzer(const uint16 hz, uint16 recess) {// 假设入参是 523 Hz, 即  523 次/秒// 换算为 1000ms 执行 523 次// 得到每次执行的时间是 1000ms / 523 次 ≈ 1.912 ms// 高低电平各占一半, 即约等于 0.956 ms// duration = 1000 / hz / 2;// printf_small("duration is %d\n", duration);// P0_0 = 1;// delay(duration);// P0_0 = 0;// delay(duration);if(hz == 0) {// 如果传入是 0 表示该音阶置空delay(duration);return;}pwm_init(PWM5_P00, hz, 500);delay(duration);pwm_duty(PWM5_P00, 0);if(recess > 0) {delay(recess);}
}// 乐谱 —— 生日快乐
xdata uint16 music_score_birthday[] = {G5, G5, G6, G5, M1, G7,G5, G5, G6, G5, M2, M1,G5, G5, M5, M3, M1, G7, G6,M4, M4, M3, M1, M2, M1
};// 乐谱 —— 哆啦A梦
xdata uint16 music_score_doraemon[] = {G5,M1,M1,M3,  M6,M3,M5,M5,M6,M5,M3,  M4,M3,M2,M6,M2,M2,M4,  M7,M7,M6,M5,M4,M4,M3,  M6,M7,M1,M2,G5,M1,M1,M3,  M6,M3,M5,M5,M6,M5,M3,  M4,M3,M2,M6,M2,M2,M4,  M7,M6,M5,M4,M4,M3,M2,  M7,M2,M1
};// 播放指定乐谱
void play(uint16 *ps, uint16 len) {for(index = 0; index < len; index++) {launchBuzzer(ps[index], spot);}delay(1000);
}void loop() {// 按下按键 1 播放 生日快乐if(P5_1 == 0 && pressed1 == 0) {pressed1 = 1;lenth = sizeof(music_score_birthday) / sizeof(uint16);play(music_score_birthday, lenth);} else if(P5_1 == 1 && pressed1 == 1) {pressed1 = 0;}// 按下按键 2 播放 哆啦A梦if(P5_2 == 0 && pressed2 == 0) {pressed2 = 1;lenth = sizeof(music_score_doraemon) / sizeof(uint16);play(music_score_doraemon, lenth);} else if(P5_2 == 1 && pressed2 == 1) {pressed2 = 0;}
}void main(void) {setup();while(1){loop();}
}

有部分音阶不太对,可能是频率值弄错了,但影响不大!

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

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

相关文章

wireshark抓包之DNS协议

DNS协议 DNS协议的主要作用是将域名解析为对应的IP地址。当我们在浏览器中输入一个网址时&#xff0c;计算机需要通过DNS协议来查找该网址对应的IP地址&#xff0c;以便能够建立连接并访问目标资源。 DNS协议的工作流程大致如下&#xff1a; 用户的计算机或设备&#xff08;充…

又到清明,祝你健康珍重!Wish you health and treasure!

随着清明节的到来&#xff0c;全国各地的人们都在怀念和哀悼逝去的亲友。People around China commemorated deceased relatives and friends as theQingming Festival begins. 清明节不仅是中国的二十四节气之一&#xff0c;也是中国人缅怀逝去亲人的日子。Qingming is not on…

数学矩阵(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容&#xff0c;但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数&#xff0c;只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时&#xff0c;才能相乘&#xff0c;否则不允…

游戏APP如何提高广告变现收益的同时,保证用户留存率?

APP广告变现对接第三方聚合广告平台主要通过SDK文档对接&#xff0c;一些媒体APP不具备专业运营广告变现的对接能力和资源沉淀&#xff0c;导致APP被封控&#xff0c;设置列入黑名单&#xff0c;借助第三方聚合广告平台进行商业化变现是最佳选择。#APP广告变现# 接入第三方平台…

EasyDarwin 、ffmpeg 音视频推流拉流;OBS视频推理软件、obs-rtspserver服务器;python读取rtsp流

参考&#xff1a;https://blog.csdn.net/N71FS1/article/details/130019563 一、EasyDarwin ffmpeg ffmpeg 推送音视频流到rtsp流服务器 EasyDarwin 作为rtsp流服务器 &#xff08;下载&#xff1a;https://www.easydarwin.org/p/easydarwin.html&#xff09;OBS 直播音视频录…

分享:搭建企微知识库简单易学步骤

说起企微知识库&#xff0c;可能有些人还不太清楚&#xff0c;为什么现在很懂企业选择搭建企微知识库&#xff1f;其实&#xff0c;企微知识库就是一个装满了企业的各种知识、经验和资料的载体。目的是为了方便员工随时查找和学习、有助于知识的传承和共享、加强团队协作和沟通…

专题三_二分查找(2)

目录 35. 搜索插入位置 解析 题解 852. 山脉数组的峰顶索引 解析 题解 162. 寻找峰值 解析 题解 35. 搜索插入位置 35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:int searchInsert(vector<int>& nums, int…

MS SQL Server STUFF 函数实战 统计记录行转为列显示

目录 范例运行环境 视图样本设计 数据统计要求 STUFF函数实现 小结 范例运行环境 操作系统&#xff1a; Windows Server 2019 DataCenter 数据库&#xff1a;Microsoft SQL Server 2016 视图样本设计 假设某一视图 [v_pj_rep1_lname_score] 可查询对某一被评价人的绩效…

重生奇迹mu召唤技能

1、召唤师与法师的共通技能&#xff1a;火球术、真空波、陨石、冰封。 2、摄魂咒&#xff1a;夺取敌人的体力来补充自己的体力。 3、链雷咒&#xff1a;雷系列的技能&#xff0c;给予敌人连锁3次的雷电攻击&#xff0c;如果目标附近没有其他目标&#xff0c;就会攻击第一个对…

手撕算法-有效的括号

描述 分析 使用栈&#xff0c;如果是左括号&#xff0c;入栈&#xff0c;如果是右括号&#xff0c;判断栈是否为空&#xff0c;不是空出栈并校验是否匹配&#xff0c;不匹配返回false。最后如果栈为空&#xff0c;返回true。 代码 class Solution {public boolean isValid(…

朵米3.5客服系统源码,附带系统搭建教程

朵米客服系统是一款全功能的客户服务解决方案&#xff0c;提供多渠道支持&#xff08;如在线聊天、邮件、电话等&#xff09;&#xff0c;帮助企业建立与客户的实时互动。该系统具有智能分流功能&#xff0c;可以快速将客户请求分配给适当的客服人员&#xff0c;提高工作效率。…

【网课必备】学浪视频下载到本地

学浪作为知识付费平台&#xff0c;拥有大量的课程&#xff0c;所以很多人在学浪上购买自己的课程&#xff0c;但是学浪官方没有提供下载选项&#xff0c;只可以在学浪客户端软件观看&#xff0c;并不是很方便 于是为了解决这一个需求&#xff0c;小白老师s开发了学浪视频下载到…

Three.js真实相机模拟

有没有想过如何在 3D Web 应用程序中模拟物理相机&#xff1f; 在这篇博文中&#xff0c;我将向你展示如何使用 Three.js和 OpenCV 来完成此操作。 我们将从模拟针孔相机模型开始&#xff0c;然后添加真实的镜头畸变。 具体来说&#xff0c;我们将仔细研究 OpenCV 的两个失真模…

C语言第三十八弹---编译和链接

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 编译和链接 1、翻译环境和运行环境 2、翻译环境 2.1、预处理&#xff08;预编译&#xff09; 2.2、编译 2.2.1、词法分析 2.2.2、语法分析 2.2.3、语义分…

共享WiFi项目加盟怎么做?碰到这些服务商要留意!

自2014年共享WiFi项目被微火研发出来让大众都可以参与其中&#xff0c;市场上不少合作伙伴都发现了该项目市场缺口大、推广难度低及落地性强等优势&#xff0c;想要加盟共享wifi项目。从目前的情况来看&#xff0c;不少代理商虽然对这个项目本身有一定的了解&#xff0c;但是靠…

扫地机器人(蓝桥杯)

文章目录 扫地机器人题目描述解题思路二分贪心 扫地机器人 题目描述 小明公司的办公区有一条长长的走廊&#xff0c;由 N 个方格区域组成&#xff0c;如下图所 示。 走廊内部署了 K 台扫地机器人&#xff0c;其中第 i 台在第 Ai 个方格区域中。已知扫地机器人每分钟可以移动…

Transformer模型-用jupyter演示逐步计算attention

学习transformer模型-用jupyter演示如何计算attention&#xff0c;不含multi-head attention&#xff0c;但包括权重矩阵W。 input embedding&#xff1a;文本嵌入 每个字符用长度为5的向量表示&#xff1a; 注意力公式&#xff1a; 1&#xff0c;准备Q K V&#xff1a; 先 生…

漏洞扫描神器:Netsparker 保姆级教程(附链接)

一、介绍 Netsparker是一款专业的网络安全扫描工具&#xff0c;用于自动化地发现和修复网站和Web应用程序中的安全漏洞。它提供了全面的安全测试&#xff0c;包括SQL注入、跨站脚本攻击、远程文件包含、命令注入等常见的安全漏洞。 Netsparker具有以下特点&#xff1a; 自动化…

AI预测福彩3D第24弹【2024年4月2日预测--第6套算法开始计算第1次测试】

今天&#xff0c;咱们进行第6套算法测试&#xff0c;本套算法将结合012路直选共27种组合&#xff0c;同时考虑了对012路的和值进行统计分析。今天为第1次测试&#xff0c;好了&#xff0c;废话不多说了。直接上结果~ 仍旧是分为两个方案&#xff0c;1大1小。 经过人工神经网络计…

Neo4j数据库(一)

目录 新建节点 Neo4j CQL创建具有属性的节点 多个标签到节点 单个标签到关系 MATCH命令 RETURN命令&#xff1a; Neo4j CQL - MATCH & RETURN匹配和返回 总结&#xff1a;本文介绍了Neo4j的CREATE&#xff0c;MATCH&#xff0c;RETURN的基本操作 新建节点 Neo4j创建一…