网站建设友链交换,网上注册公司app,福州app开发制作,开封市住房和城乡建设局网站文章目录 前言一、PWM引脚以及寄存器的配置二、呼吸灯逻辑总结 前言
hello 大家好这里是夏目学长的51单片机课堂#xff0c;本篇博客是夏目学长观看B站up主学电超人的视频所写的一篇51单片机入门博客之51单片机PWM配置呼吸灯 #xff0c;我自己在学习这节课程的时候觉得这节… 文章目录 前言一、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; // ENO1把P0.5引脚设置为PWM引脚 INI0初始电平是低电平PWM0C CYCLE; // 写入周期值PWM05T1 0X0000; // 遇到这个值输出低电平PWM05T2 0X0001; // 遇到这个值输出高电平PWMCFG01 0X05; // PWM0CEN1开启PWM定时器开始计数 EA 1; // 打开总中断while(1){}
}演示视频 51单片机PWM实现呼吸灯 总结
这节课我看了三遍也觉得不为过因为这一节让我感受到了学习单片机的痛苦但是我虽然觉得痛苦但是我没有放弃去学习后面估计还会继续去看这个视频去学习确实会提升很大。