51单片机的PWM控制呼吸灯

news/2025/3/30 3:40:05/

文章目录

  • 前言
  • 一、PWM引脚以及寄存器的配置
  • 二、呼吸灯逻辑
  • 总结


前言

hello 大家好这里是夏目学长的51单片机课堂,本篇博客是夏目学长观看B站up主学电超人的视频所写的一篇51单片机入门博客之51单片机PWM配置呼吸灯 ,我自己在学习这节课程的时候觉得这节课非常适合学完B站up主江科大视频的同学,适合去进阶自己的知识,掌握的更加牢固。PWM == 脉宽调制

本节的单片机主要是STC8G2K64S4单片机


一、PWM引脚以及寄存器的配置

首先我们要使得LED_R进行呼吸灯闪烁所以看原理图:
在这里插入图片描述

所以首先要配置P_SW2,因为我们要访问特殊的寄存器
最高位EAXFR置1 允许访问XFR寄存器
在这里插入图片描述
在这里插入图片描述
然后我们需要选择PWM0的时钟为系统时钟,并且初始化PWM0模块,使得可以驱动PWM0模块

在这里插入图片描述
当然配置这些我们都需要去看手册去学习配置,本身这些东西就很难,我们又是初学者,所以一定要耐下性子去学习
配置PWM0CKS—>配置为PWM0CKS = 0X00;

在这里插入图片描述
** 配置PWMSET—>配置为PWMSET |= 0X01; **

在这里插入图片描述
**配置PWM05CR—>配置为PWM05CR = 0X80; **
在这里插入图片描述
配置这个需要把ENO设置为1即可

配置PWM0C —>配置为PWM0C = 0x1000;
因为这两个寄存器是一起写的所以还需要一个宏定义:#define PWM0C (*(unsigned int volatile xdata *)0xFF00)
在这里插入图片描述
配置PWM05T1 —>配置为PWM05T1 = 0X0000;
配置PWM05T2 —>配置为PWM05T2 = 0X0001;
在这里插入图片描述
配置打开中断的寄存器
在这里插入图片描述


二、呼吸灯逻辑

/* PWM中断处理函数 */
void PWM_Isr() interrupt 22
{static bit dir = 1;//类似于C语言的bool值static int val = 0;if(PWMCFG01 & 0x08) {PWMCFG01 &= ~0x08;     //清中断标志if(dir){val++;if(val >= CYCLE) dir = 0;//加到周期就要反向}else{val--;if(val <= 1) dir = 1;//减到1就要从头开始也就是反向呼吸}PWM05T2 = val;}
}

所以利用PWM实现LED得呼吸灯的总代码是:

#include "stc8g.h"
#include "intrins.h"/* 寄存器定义 */
#define     PWM0C      (*(unsigned int volatile xdata *)0xFF00)
#define     PWM05T1    (*(unsigned int volatile xdata *)0xFF38)
#define     PWM05T2    (*(unsigned int volatile xdata *)0xFF3A)/* PWM中断处理函数 */
void PWM_Isr() interrupt 22
{static bit dir = 1;//类似于C语言的bool值static int val = 0;if(PWMCFG01 & 0x08) {PWMCFG01 &= ~0x08;     //清中断标志if(dir){val++;if(val >= CYCLE) dir = 0;//加到周期就要反向}else{val--;if(val <= 1) dir = 1;//减到1就要从头开始也就是反向呼吸}PWM05T2 = val;}
}void main()
{P0M0 = 0x00;   //设置P0.0~P0.7为双向口模式P0M1 = 0x00;/* PWM初始化设置 */P_SW2 |= 0x80; // 最高位EAXFR置1 允许访问XFR寄存器PWM0CKS = 0X00; // 选择PWM0的时钟为系统时钟PWMSET |= 0X01; // 使能PWM0模块PWM05CR = 0X80; // ENO=1把P0.5引脚设置为PWM引脚   INI=0初始电平是低电平PWM0C = CYCLE; // 写入周期值PWM05T1 = 0X0000; // 遇到这个值输出低电平PWM05T2 = 0X0001; // 遇到这个值输出高电平PWMCFG01 = 0X05; // PWM0CEN=1开启PWM定时器开始计数 EA = 1; // 打开总中断while(1){}
}

演示视频:

51单片机PWM实现呼吸灯


总结

这节课我看了三遍也觉得不为过,因为这一节让我感受到了学习单片机的痛苦,但是我虽然觉得痛苦但是我没有放弃去学习,后面估计还会继续去看这个视频去学习,确实会提升很大。


http://www.ppmy.cn/news/1179885.html

相关文章

2023-10-21 美团2024秋招后端开发岗笔试题

1 考察dfs和拓扑排序 1.1 题目描述&#xff08;如果拓扑排序不清楚可以去做一下lc 207. 课程表&#xff09; 1.2 答案 import java.util.*;public class Meituan {static int m,n;public static void main(String[] args) {Scanner in new Scanner(System.in);m in.nextInt…

如何选择专业的汽车托运平台

汽车托运是一种非常合理和实用的出行方式&#xff0c;它可以为车主带来很多便利和优势。汽车托运可以让车主省去自己开车的麻烦和危险&#xff0c;节省时间和金钱&#xff0c;享受旅行的乐趣&#xff0c;每种方式有各自的特点和适用场景&#xff0c;车主可以根据自己的需求和预…

下南洋捕风

杨帆丈天际&#xff0c;飞桨捕八风。 雷公断清阳&#xff0c;风婆收氢云。 嗡嗡阵阵疾驰去&#xff0c;环游归来已满仓。 登岸燃尽清阳云&#xff0c;银号腾飞串串零。 背景&#xff1a;去南半球捕西风能

Typora(morkdown编辑器)的安装包和安装教程

Typora&#xff08;morkdown编辑器&#xff09;的安装包和安装教程 下载安装1、覆盖文件2、输入序列号①打开 typora &#xff0c;点击“输入序列号”&#xff1a;②邮箱一栏中任意填写&#xff08;但须保证邮箱地址格式正确&#xff09;&#xff0c;输入序列号&#xff0c;点击…

Spring中Bean的作用域

目录 一、什么是Bean的作用域 二、Scope注解 三、Bean的6种作用域 3.1 singleton单例模式 3.2 prototype 原型模式 3.3 request 3.4 session 3.5 application 3.6 websocket 一、什么是Bean的作用域 在之前学习的过程中&#xff0c;我们把作用域定义为&#xff1a;限定程序中变…

22年上半年下午题

第一大题题目 第一大题解答 第一小问 看加工交互和说明来得出实体的名字。如果不太确定&#xff0c;可以多去看几条数据流来确认答案。仔细一点&#xff0c;这分稳啦。 第二小问 需要对应加工结合说明得出数据存储的名称。 一般可以在后面加上表字或者加上信息表。自拟&…

【速看】如何通过合理的封装,让你的自动化脚本更上一层楼!

1. 前言 上一篇推文利用一个在图片范围内实现随机坐标点击的例子&#xff0c;去教会大家如何将自己想要的效果实现出来&#xff0c;受到大家的热情反响&#xff0c;在我们官方讨论群中&#xff0c;还有大佬对我们的示例代码进行优化改进&#xff0c;做了很多合理的函数封装&…

【Python】【Flask】flask_login的初始化

【背景】 想要更高效地用现有的Flask_login包来实现用户管理方面的常用功能会话管理等。不想再手搓了。 【要点】 首先引入flask_login from flask_login import LoginManager, login_user, login_required, logout_user,current_user然后进行app级别的设置和初始化 login…