文章目录
- 前言
- 一、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实现呼吸灯
总结
这节课我看了三遍也觉得不为过,因为这一节让我感受到了学习单片机的痛苦,但是我虽然觉得痛苦但是我没有放弃去学习,后面估计还会继续去看这个视频去学习,确实会提升很大。