51单片机的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实现呼吸灯


总结

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

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏目浅石.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值