谁能告诉我单片机模拟PWM控制LED由暗到亮,再有亮到暗这个程序?

haoqianxiao 2010-08-31 09:53:58
这个程序我看不懂,是怎么控制占空比的?我有些不太明白!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar ucT0;
uchar PWM=0;
bit Flag=1;
sbit LED=P0^0;
void Timer0_Init(void);
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
ET0=1;
TMOD=0x02;
TH0=0x47;
TL0=0x47;
TR0=1;
EA=1;
while(1)
{
delayms(1000);
if(Flag)
PWM++;
else
PWM--;
if(PWM>=10) Flag=0;
if(PWM==0) Flag=1;
}
}
void Timer0(void) interrupt 1
{
ucT0++;
if(ucT0==10)
{
ucT0=0;
if(PWM!=0)
LED=0;
}
if(ucT0==PWM)
{
LED=1;
}
}
...全文
480 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
a13656010646 2011-04-26
  • 打赏
  • 举报
回复
很感谢——yangtao0559的解说,可以给个邮箱吗?
cr541574515 2011-01-03
  • 打赏
  • 举报
回复
HAO
Devin_la 2010-09-02
  • 打赏
  • 举报
回复
yangtao0559 2010-09-02
  • 打赏
  • 举报
回复
楼主可以自己软件调试一下 就能看清楚了!
yangtao0559 2010-09-02
  • 打赏
  • 举报
回复
我在开发板上试过了,每一秒变化一次亮度。
首先看一下中断服务函数,假设用的是12的晶振,那么就是每185us产生一次中断,每产生一次中断ucT0自加一次,如果ucT0==10,ucT0清零一次,并判断PWM等不等于0,如果不等于0就给P0.0口一个低电平,也就是说每1.85ms是一个脉冲周期,如果ucT0==PWM那我们就给P0.0口一个高电平,(这么说好像不太明白,一步一步的说吧,程序刚从主函数处执行的时候,PWM是等于0的,初始化定时器,然后进入while循环,再进入delay函数,在执行delay函数的过程中就发生了中断,因为延时1s,而中断是185us产生一次,所以延时的时候会几千次产生中断。因为PWM=0,故产生10次中断,ucT0置零的时候,会执行LED=1;直到第一次执行完delay函数,LED都是等于1的。然后PWM++;PWM就等于1了,然后再次进入delay函数,在delay函数中发生第一次中断,ucT0自加后变成1,,满足PWM==ucT0的条件,LED置1,再经过9次中断,ucT0自加成10,
if(ucT0==10)
{
ucT0=0;
if(PWM!=0)
LED=0;
}
这个语句的条件满足,ucT0被清0
LED被置0,再经过一个中断,LED又被置1,也就是说LED=0仅保持了1个185us,而LED=1确可以保持9个185us
LED=0保持多长时间和PWM的值有关PWM等于N,LED=0就保持N个185us,相应的LED=1,也就保持10-N个185us
这样随之PWM的变化,占空比也开始变化!
占空比变化了,LED的亮度也就变化了!
shizhiyong001 2010-09-02
  • 打赏
  • 举报
回复
程序不全 都贴出来看看
wackestar 2010-09-01
  • 打赏
  • 举报
回复
很简单的程序。我已经看懂了。呵呵。

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧