找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2357|回复: 6
收起左侧

各位大神 能解释下这段pwm输出呼吸灯的代码吗?

[复制链接]
ID:370913 发表于 2018-7-17 16:32 | 显示全部楼层 |阅读模式
  • #include<reg52.h>
  • #include<intrins.h>
  • #define uintunsigned int
  • #define ucharunsigned char
  • sbit pwm =P2^1;
  • uintcount=0,timer1=0,value=0;
  • bit DIR=1;
  • void main()
  • {
  • TMOD=1;
  •     TH0=(65536-1)/256;
  •        TL0=(65536-1)%256;
  •        EA=1;//开总中断
  •        ET0=1;//开定时器0中断
  •    TR0=1;//TR0置位,启动定时器
  • while(1)
  • {
  •   if(timer1>value)
  •   {
  •      pwm=1;
  •   }
  •   else
  •   {
  •   pwm=0;
  •   }
  •        }
  • }
  • void time0()interrupt 1 using 1
  • {
  •        TH0=(65536-1)/256;
  •        TL0=(65536-1)%256;
  •        timer1++;//timer1不是周期吗?却一直在变.
  •        count++;
  •        if(timer1>700)
  •        {
  •        timer1=0;
  •        }
  •        if(count>100)//为什么count要大于100才开始value的计数
  •   {
  •   count=0;
  •      if(DIR==1)
  •        {
  •         value++;
  •        }
  •        if(DIR==0)
  •        {
  •         value--;
  •        }
  •   }
  •   if(value==700)
  •   {
  •        value=0;
  •   }
  • }
回复

使用道具 举报

ID:142059 发表于 2018-7-18 00:53 | 显示全部楼层
问题1: timer1++;//timer1不是周期吗?却一直在变.?
问题2: if(count>100)//为什么count要大于100才开始value的计数?
回答1:timer1是从0至700循环计数,且if(timer1>value)  pwm=1;  else   pwm=0;由此看出timer1是调节占空比的参数, if(count>100) value++; if(value==700)  value=0;可以看出value是周期计数值,一个周期是700*100,因为count计数100次,value才加1,为什么引入count而不直接用value计数,是因为51单片机变量最大值是2的16次方=65536-1,所以value最大只能计数65536次即65ms的周期值,为了突破这一限制,引用count来辅助计数,这样就可以实现65536*65536次的计数次数即最大3.85秒的周期。PS:DIR是计数方式选择位,即是向上计数还是向下计数。

评分

参与人数 1黑币 +100 收起 理由
admin + 100 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:366559 发表于 2018-7-18 08:00 | 显示全部楼层
关于大于100开始计数,我猜测可能和LED的压降有关,等效电压在压降以下基本不亮,这一段不应该算在呼吸灯循环里面
回复

使用道具 举报

ID:370913 发表于 2018-7-18 10:57 | 显示全部楼层
Angle145 发表于 2018-7-18 00:53
问题1: timer1++;//timer1不是周期吗?却一直在变.?
问题2: if(count>100)//为什么count要大于100才开 ...

timer1是如何调节占空比的?timer1如果最大加到700那么就占周期的1%?
回复

使用道具 举报

ID:374015 发表于 2018-7-18 14:21 | 显示全部楼层
首先,要理解呼吸灯的原理,是通过控制PWM波形的占空比来实现的。
1、timer1不是周期,700才是周期,timer是对周期的计时(就是计算是否一个周期完成)
2、100是一个变化单位,100的时候应该是灯光最弱且能被看见的值。应该是100、200、300……700,再700,600……100这样一个“呼吸”变化周期。
回复

使用道具 举报

ID:370913 发表于 2018-7-18 16:53 | 显示全部楼层
Leo李 发表于 2018-7-18 14:21
首先,要理解呼吸灯的原理,是通过控制PWM波形的占空比来实现的。
1、timer1不是周期,700才是周期,timer ...

哪一个才是调节占空比的参数呢
回复

使用道具 举报

ID:461428 发表于 2019-1-3 23:45 来自手机 | 显示全部楼层
dir这个标志位好像永远都等于1丫
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表