打印
[技术支持]

PWM信号输出实现LED呼吸灯

[复制链接]
29|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rosemoore|  楼主 | 2024-11-26 15:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


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
  }
}
}



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

1334

帖子

2

粉丝