标题:
PWM调光 led还有点微亮
[打印本页]
作者:
lids
时间:
2016-10-24 16:16
标题:
PWM调光 led还有点微亮
//两个键控制亮度加减,一个键控制灯开关;在实验板上测试通过,就是还有点问题,开关键关灯的状态,led还有点微亮,原因还不明。
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
作者:
lids
时间:
2016-10-24 16:17
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16; //define
sbit down = P3^0; //亮度减
sbit up = P3^1; //亮度加
sbit KEY3 = P3^2; //开关键
bit flag;
uint8 t = 0;
uint8 PWM_T = 0; //占空比控制变
void delay_1ms(uint16 t)
{
uint16 x,y;
for(x=t;x>0;x--)
for(y=120;y>0;y--);
}
/****************************************************
主程序
****************************************************/
void main(void)
{
TMOD = 0x02; //定时器0,工作模式2,8位定时模式
TH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)
TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
// P1=0xff; //初始化P1,输出端口
PWM_T=100; //这里的值决定开机时的亮度,数值越大亮度越大
while(1)
{
if(flag==0)
{
if(!up)
{
if(PWM_T<250)
{
PWM_T++;
}
delay_1ms(20);
}
if(!down)
{
if(PWM_T>0)
{
PWM_T--;
}
delay_1ms(20);
}
}
else
{
P1=0xff;
}
if(KEY3==0)
{
delay_1ms(20);
if(KEY3==0)
{
flag=~flag;
while(!KEY3);
}
}
}
}
/****************************************************
/定时器0中断模拟PWM
****************************************************/
timer0() interrupt 1
{
t++; //每次定时器溢出加1
if(t==250) //PWM周期 100个单位
{
t=0; //使t=0,开始新的PWM周期
P1=0x00; //输出端口
}
if(PWM_T==t) //按照当前占空比切换输出为高电平
{
P1=0xff; //
}
}
作者:
lids
时间:
2016-10-25 09:51
程序修改好了,开关键关灯状态,LED不再有微亮
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
unsigned int flag, temp;
unsigned char menu;
sbit down = P3^0; //亮度减
sbit up = P3^1; //亮度加
sbit KEY3 = P3^2; //开关键
//bit flag;
uint8 t = 0;
uint8 PWM_T = 0; //占空比控制变
void delay_1ms(uint16 t)
{
uint16 x,y;
for(x=t;x>0;x--)
for(y=120;y>0;y--);
}
/****************************************************
主程序
****************************************************/
void main(void)
{
TMOD = 0x02; //定时器0,工作模式2,8位定时模式
TH0=210; //写入预置初值(取值1-255,数越大PWM频率越高)
TL0=210; //写入预置值 (取值1-255,数越大PWM频率越高)
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
P1=0xff; //初始化P1,输出端口
PWM_T=100; //这里的值决定开机时的亮度,数值越大亮度越大
menu=0;
while(1)
{
if(flag==0)
{
if(!up)
{
if(PWM_T<250)
{
PWM_T++;
}
delay_1ms(20);
}
if(!down)
{
if(PWM_T>0)
{
PWM_T--;
}
delay_1ms(20);
}
}
else
{
temp=0xff;
P1=temp;
}
if(menu==0)
{
if(KEY3==0)
{
delay_1ms(20);
if(KEY3==0)
{ menu++;
flag=~flag;
TR0=0;
while(!KEY3);
}
}
}
if(menu==1)
{
if(KEY3==0)
{
delay_1ms(20);
if(KEY3==0)
{ menu=0;
flag=~flag;
TR0=1;
while(!KEY3);
}
}
}
}
}
/****************************************************
/定时器0中断模拟PWM
****************************************************/
timer0() interrupt 1
{
t++; //每次定时器溢出加1
if(t==250) //PWM周期 100个单位
{
t=0; //使t=0,开始新的PWM周期
P1=0x00; //输出端口
}
if(PWM_T==t) //按照当前占空比切换输出为高电平
{
P1=0xff;
//
}
}
作者:
嘿小毅
时间:
2016-11-11 11:44
用电阻拉低
作者:
CHEN08046792
时间:
2016-11-11 12:17
不错
作者:
CHEN08046792
时间:
2016-11-11 12:17
好方法
作者:
wuyibin2003
时间:
2016-11-11 12:28
多练练
作者:
xixdpj-2
时间:
2019-3-20 23:25
这个好像对 我有用,仔细看一下
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1