单片机
返回首页

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

  }

 }

}


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外遥控音量控制

  • LM317过压保护

  • 12V转110V/220V 500W逆变器

  • DS1669数字电位器

    相关电子头条文章