51单片机day6——中断控制PWM信号输出实现LED呼吸灯
2025-09-24 来源:bilibili
/***
*中断控制PWM信号输出实现LED呼吸灯
*顺序:亮➡暗➡亮......
*接口:P2^1口连接运算放大器后经跳线帽链接LED
*原理:
* 1.PWM:控制数字电路输出占空比模拟模拟电路的效果
*思路:
* 1.用定时器0的2方式定时每1us中断一次,每500us增加1%占空比,一个周期100us
***/
#include "reg52.h"
void dsqcsh(void); //定时器初始化
sbit PWM=P2^1; //接运算放大器的引脚
bit b; //定义输出信号是否该反转的标志位(亮转暗/暗转亮)0亮1暗
int zzq,zzqpd,sj;//zzq:正周期,随中断增加,到100清零当正周期等于正周期判断,则LED亮; zzqpd:正周期判断:占空比中亮起的时间,每500us增加一次; sj:记录中断次数的变量,每100us清零
void main(void)
{
dsqcsh(); //初始化定时器
while(1);
}
void dsqcsh() //初始化定时器:设定定时器0工作方式是2方式,每1us中断一次
{
TMOD|=0X02; //设置定时器0工作方式为2
TH0=0XFF; //中断时间为1us
TL0=0XFF; //中断时间为1us
ET0=1; //允许T0定时器中断
EA=1; //打开总中断
TR0=1; //让定时器0工作
}
void dsq0() interrupt 1 //定时器0中断函数由判断是否该输出低电平,判断一个周期是否结束,减少和增加低电平时间组成
{
sj++; //记录进入中断的次数,到100清零
zzq++; //增加一次正周期
if(zzq==zzqpd) //当正周期等于判断周期时LED亮
{
PWM=0;
}
if(zzq==100) //如果经过了100us判定此周期结束关闭LED,正周期清零
{
zzq=0;
PWM=1;
}
if(sj==500 && b==1) //判断是否标志位为1且经过了500us
{
sj=0; //记录进入中断次数清零
if(zzqpd==1) //如果正周期被减到1(不能为0因为下次中断后已经经过1us了),标志位反转否则正周期时间减一
{
b=0; //标志位反转
}else
{
zzqpd--; //判断正周期时间-1
}
}
if(sj==500 && b==0) //判断是否标志位为0且经过了500us
{
sj=0; //记录进入中断次数清零
if(zzqpd==100) //如果正周期被加到100,标志位反转否则正周期时间加一
{
b=1; //标志位反转
}else
{
zzqpd++; //判断正周期时间+1
}
}
}
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策




