51单片机PWM控制灯存在LED微亮的问题
/*设置一个定时器,控制P20口输出PWM,频率为100HZ,占空比可调,按键key_add、key_sub分别控制占空比的加减*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P2^0;
sbit LED1=P2^7;//LED1常亮作为跟PWM输出时的亮度对比
sbit key_add=P3^7;//按键控制占空比增加
sbit key_sub=P3^6;//按键控制占空比减小
uchar time;
uint num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
num=0;
TMOD=0x01;//定时器0工作方式1
TH0=(65536-100)/256;
TL0=(65536-100)%256;//赋值定时0.1ms
EA=1;
ET0=1;
TR0=1;
while(1)
{
LED1=0;
while(key_add==0)//增加亮度
{
delay(5);
while(key_add==0)
{
num=num+10;
while(!key_add);//按键释放
delay(5);
while(!key_add);
}
}
while(key_sub==0)//减小亮度
{
delay(5);
while(key_sub==0)
{
num=num-10;
while(!key_sub);//按键释放
delay(5);
while(!key_sub);
}
}
}
}
void timer0() interrupt 1
{
TR0=0;//赋值时先关闭定时器
TH0=(65536-100)/256;
TL0=(65536-100)%256;//赋值定时0.1ms
TR0=1;//再从新打开定时器
time++;
if(time>=100) time=0;//0.1ms*100=10ms,即100HZ;
if(time<=num) PWM=0;
else PWM=1;
}
//在原程序里加了3条限制条件就可以了。
//我用PWM控制一个LED的光亮成度,控制占空比的变量num一开始也初始化0了,但是依然一上电后LED微亮,请高手赐教,附上程序:
/*设置一个定时器,控制P20口输出PWM,频率为100HZ,占空比可调,按键key_add、key_sub分别控制占空比的加减*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P2^0;
sbit LED1=P2^7; //LED1常亮作为跟PWM输出时的亮度对比
sbit key_add=P3^7; //按键控制占空比增加
sbit key_sub=P3^6; //按键控制占空比减小
uchar time;
uint num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
num=0;
TMOD=0x01;//定时器0工作方式1
TH0=(65536-100)/256;
TL0=(65536-100)%256;//赋值定时0.1ms
EA=1;
ET0=1;
TR0=1;
while(1)
{
LED1=0;
while(key_add==0)//增加亮度
{
delay(5);
while(key_add==0)
{
if(num<100) //限制num不大于100
num=num+10;
while(!key_add);//按键释放
delay(5);
while(!key_add);
}
}
while(key_sub==0)//减小亮度
{
delay(5);
while(key_sub==0)
{
if(num>0) //限制num不小于0
num=num-10;
while(!key_sub);//按键释放
delay(5);
while(!key_sub);
}
}
}
}
void timer0() interrupt 1
{
TR0=0;//赋值时先关闭定时器
TH0=(65536-100)/256;
TL0=(65536-100)%256;//赋值定时0.1ms
TR0=1;//再从新打开定时器
time++;
if(time>=100)
time=0;//0.1ms*100=10ms,即100HZ;
if(num==0)//这里加一条件限制,否则num=0时...if(time<=num)表达式不成立而出错
PWM=1;
else if(time<=num)
PWM=0;
else
PWM=1;
}
p2口下拉
什么意思,把P2口设计为下拉?
让你这么一提点,确实是有思考的不足的地方,谢谢指导
这个问题很好解决,你把led用低电平驱动就可以了,所谓的下拉就是输入一个低电平让灯亮
51的特性是沒有分輸入輸出,所以當成輸入時,實際是io口設置成1,內部其實是微上拉,所以一開機時的狀態就是1,io口不是懸浮的,若使用51要避免這麼情況只能外部加一顆下拉電阻
额,下拉不是下拉接地,要输高电平才可以工作吗?