想用PWM给51单片机实现呼吸灯,代码如下,但是一直灯都是一闪一闪的,没有逐渐亮灭的效果。
sbit PWM=P2^1;
#define uchar unsigned char
uchar dir,value,t0;
void init();
void main()
{
init();
while(1)
{
if(dir==0)
{
value++;
if(t0>value)
{
PWM=0;
}
if(value==100)
{
dir=1;
}
}
else
{
value--;
if(t0<value)
{
PWM=1;
}
if(value==0)
{
dir=0;
}
}
if(t0>100)
{
t0=0;
}
}
}
void init()
{
t0=100;
PWM=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void Time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
}
没有用单片搞过 用LM358和NE555搞过
你这个当然是亮灭了,想要逐渐变化的话,最好改变通断的频率来实现,简单说就是频率由慢到快然后由快到慢就可以了,另外一点,注意间隔时间的控制。
你这样实现不了,如楼上所说你应该通过改变亮灭的频率,去控制亮度,逐渐加大,然后减小,通过时间的调整实现
dddddddddddddddddddddddddd
改变定时器的值在中断里面翻转引脚。
看看一下,,,,,,,,,,
while(1)
{
value++;
if(t0>value)
{
PWM=0;
}
else
{
PWM=1;
}
}
你这样试一下,
好的
要是灯上并个的电容呢?
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit S2=P3^4;
sbit S3=P3^5;
sbit fm=P2^3;
uchar pwm,num;
void delay(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void bee()
{
fm=0;
delay(100);
fm=1;
delay(100);
}
void keyscan()
{
if(S2==0)
{
delay(50);
if(S2==0)
{
if(pwm<32)
{
pwm++;
delay(100);
}
else
{
bee();
}
}
}
if(S3==0)
{
delay(50);
if(S3==0)
{
if(pwm>1)
{
pwm--;
delay(100);
}
else
{
bee();
}
}
}
}
void init_t0()
{
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
EA=1;
ET0=1;
TR0=1;
}
void t0() interrupt 1
{
TR0=0;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
num++;
if(num>32)
{
num=0;
}
if(num<=pwm)
{
P0=0x00;
}
else
{
P0=0xff;
}
TR0=1;
}
void main()
{
init_t0();
num=0;
pwm=16;
while(1)
{
keyscan();
}
}
可以实现由暗到亮和有亮到暗 控制中断函数里面的pwm值就可以实现