[技术支持] PWM信号输出实现LED呼吸灯

[复制链接]
 楼主| rosemoore 发表于 2024-11-26 15:00 | 显示全部楼层 |阅读模式


  1. void dsqcsh(void);  //定时器初始化

  2. sbit PWM=P2^1;    //接运算放大器的引脚

  3. bit b;        //定义输出信号是否该反转的标志位(亮转暗/暗转亮)0亮1暗
  4. int zzq,zzqpd,sj;//zzq:正周期,随中断增加,到100清零当正周期等于正周期判断,则LED亮; zzqpd:正周期判断:占空比中亮起的时间,每500us增加一次; sj:记录中断次数的变量,每100us清零

  5. void main(void)
  6. {
  7. dsqcsh();    //初始化定时器
  8. while(1);
  9. }

  10. void dsqcsh()  //初始化定时器:设定定时器0工作方式是2方式,每1us中断一次
  11. {
  12. TMOD|=0X02;  //设置定时器0工作方式为2
  13. TH0=0XFF;  //中断时间为1us
  14. TL0=0XFF; //中断时间为1us
  15. ET0=1;  //允许T0定时器中断
  16. EA=1;   //打开总中断
  17. TR0=1;  //让定时器0工作

  18. }

  19. void dsq0() interrupt 1   //定时器0中断函数由判断是否该输出低电平,判断一个周期是否结束,减少和增加低电平时间组成
  20. {
  21. sj++;    //记录进入中断的次数,到100清零
  22. zzq++;   //增加一次正周期
  23. if(zzq==zzqpd)   //当正周期等于判断周期时LED亮
  24. {
  25.   PWM=0;
  26. }
  27. if(zzq==100)    //如果经过了100us判定此周期结束关闭LED,正周期清零
  28. {
  29.   zzq=0;
  30.   PWM=1;
  31. }

  32. if(sj==500 && b==1)  //判断是否标志位为1且经过了500us
  33. {
  34.   sj=0;      //记录进入中断次数清零
  35.   if(zzqpd==1)  //如果正周期被减到1(不能为0因为下次中断后已经经过1us了),标志位反转否则正周期时间减一
  36.   {
  37.    b=0;  //标志位反转
  38.   }else
  39.   {
  40.    zzqpd--;  //判断正周期时间-1
  41.   }
  42. }

  43. if(sj==500 && b==0)  //判断是否标志位为0且经过了500us
  44. {
  45.   sj=0;      //记录进入中断次数清零
  46.   if(zzqpd==100)  //如果正周期被加到100,标志位反转否则正周期时间加一
  47.   {
  48.    b=1;  //标志位反转
  49.   }else
  50.   {
  51.    zzqpd++;  //判断正周期时间+1
  52.   }
  53. }
  54. }



您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

1579

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

61

主题

1579

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部