这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 求助:PWM调光程序不能理解

共13条 1/2 1 2 跳转至

求助:PWM调光程序不能理解

菜鸟
2013-08-30 10:05:46     打赏

最近在学单片机,学到PWM调光程序,自己也写了一个,但是发现有个问题:
程序是这样的:
//2013.3.30
#include<reg52.h>
sbit LED=P1^0;
void Delay(unsigned int t);
void main (void)
{
unsigned int CYCLE=600,PWM_LOW=0;
while(1)
{
LED=1;
Delay(60000);
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)//逐渐变亮  
{
LED=0;
Delay(PWM_LOW);
LED=1;
Delay(CYCLE-PWM_LOW);
}
LED=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)//逐渐变暗  
{
LED=0;
Delay(PWM_LOW);
LED=1;
Delay(CYCLE-PWM_LOW);
}
}
}
void Delay(unsigned int t)
{
while(--t);
}
程序如果这样写,那会很顺畅,从暗变亮,到最亮之后从亮变暗
但如果我改一个字:
把逐渐变暗的for循环里的红色-1删掉,改成
for(PWM_LOW=CYCLE;PWM_LOW>0;PWM_LOW--)//逐渐变暗
程序就会出问题,从暗变亮之后到达最亮,然后会有一下熄灭的过程,然后才会变暗
表示不能理解为什么一个“-1”会有这么大效果?


求高手指导




关键词: 求助     调光     程序     能理解    

菜鸟
2013-08-30 10:32:10     打赏
2楼

Delay(CYCLE-PWM_LOW);
我觉得这里会有点问题,不-1的话这个结果等于0.


专家
2013-08-30 16:19:32     打赏
3楼

LED=0;
Delay(PWM_LOW);
LED=1;
Delay(CYCLE-PWM_LOW);

楼上正解。如果是-1,led就会亮一下,有个演示,如果不-1,led亮的演示为0,所以就熄灭了。


高工
2013-08-30 17:32:19     打赏
4楼

那种51?

有的51内核的带PWM模块,可以直接输出

比如stc的PCA模块


菜鸟
2013-09-04 07:50:43     打赏
5楼
不知道你们有没有遇到这样的结果,刚才从另一个网站上,高手告诉我是:没有“-1”时,Delay(CYCLE-PWM_LOW);就会变成Delay(0);而子程序里是while(--t);while()函数里面的变量就会变成负的。所以才会出现问题。感谢高手们哈!

高工
2013-09-04 13:03:52     打赏
6楼

回去翻C语言课本,-1怎么表示


另外这程序写的相当不规范,都unsigned了还-1


菜鸟
2013-09-05 08:45:30     打赏
7楼
我又发现了,不是while()函数的变亮--t变成负数
因为我定义的t的类型是unsigned int型,范围是0~65535
所以--0=65535,于是Delay(CYCLE-PWM_LOW);是循环65536次,所以延时很长时间。
所以如果改成PWM_LOW=0,Delay(PWM_LOW);所以亮很久,才从暗到亮
改成PWM_LOW=CYCLE,所以灭很久,才从亮到暗
个人经验,希望有用...

菜鸟
2013-09-06 07:42:44     打赏
8楼
多谢....见识了.

菜鸟
2013-09-09 07:54:13     打赏
9楼
老大,能不能上个图啊!

助工
2013-09-10 07:28:15     打赏
10楼
让俺也见识下!

共13条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]