PWM控制灯的亮暗程序小问题。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1=P3^4; //增加值
sbit KEY2=P3^3;
sbit KEY3=P3^2;
sbit D1=P0^0; // 测试的灯。
sbit D2=P0^7; //指示灯,没等亮的时候 不停的闪烁。
char scale=0; //用于保存占空比的输出0的时间份额,总共10份
void delay_ms(uchar N)
{
uchar i,j;
for(i=N;i>0;i--)
for(j=110;j>0;j--);
}
void main(void) // 主程序
{
uint n;
TMOD=0X01 ;
TH0 =0xFC; //赋T0的预置值, 溢出1次是1/1000秒钟
TL0=0x66;
TR0=1; //启动定时器
ET0=1; //打开定时器2中断
EA=1;
//打开总中断
while(1) //程序循环
{
D2=1;
delay_ms(1);
D2=0;
if(KEY1==0)
{
D2=1;
for(n=0;n<30000;n++); //每过一会儿就自动加一个档次的亮度
scale++;
if(scale>12)
scale=12;
}
if(KEY2==0)
{
D2=1;
for(n=0;n<30000;n++); //每过一会儿就自动减一个档次的亮度
scale--;
if(scale<0)
scale=0;
}
}
}
//1/1000秒定时器2中断
void timer0() interrupt 1
{
static uchar tt=0; //tt用来保存当前时间在一秒中的比例位置
TH0 =0xFC;
TL0=0x66;
tt++;
if(tt==18) //每1/100秒整开始输出低电平
{
tt=0;
if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影
D1=0;
}
if(scale==tt) //按照当前占空比切换输出高电平
D1=1;
}
这个是模拟个灯慢慢变亮变暗的程序。
我想开始的时候叫D2灯闪烁,用于指示灯的。
可是我这个一开始的时候,D2就直接亮了,不闪烁么。
而且我按下KEY2后,慢慢变暗 然后突然就变灭了,为什么呢?
为什么呢,
那么大虾给我改改,小弟谢了。
[解决办法]
忘记说了,闪烁要想让人看到,1毫秒的延时是不够的,人眼的分辨能力在100ms左右,估计至少要做20`50的延时,才有比较不错的效果
[解决办法]
这个 应该是 视觉 效应!!
楼主有示波器吗?如果有的话,可以测试你下你控制LED的对应的管教的波形,应该起对应的波形 和你控制的是一样的啊。
感觉楼主的问题,很可能是你的LED其实在PWM输出低的时候为灭,但是被之前的亮所掩盖,其实就是视觉反应,
所以看着不是那样。
另外楼主如果想要PWM占空比 来试验,完全可以用其控制一般的直流电机,最最简单那种的。
效果很明显。
[解决办法]
看到这代码,就头疼,嘿嘿,你慢慢分析啊,祝你成功
[解决办法]
我怀疑你的timer0中断没有用,呵呵