找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3852|回复: 12
收起左侧

求大神用pwm控制LED灯的亮度

  [复制链接]
ID:85540 发表于 2015-7-13 14:28 | 显示全部楼层 |阅读模式
求大神用pwm控制LED灯的亮度
回复

使用道具 举报

ID:72995 发表于 2015-7-13 15:00 | 显示全部楼层
控制输出信号占空比就可以了

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:72399 发表于 2015-7-13 18:32 | 显示全部楼层
#include <reg52.h>

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:72399 发表于 2015-7-13 18:33 | 显示全部楼层
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int        
uchar code num0[]="跟踪电压值PWM/V";
uchar code num1[]="  V";
uchar code num2[]="0123456789";//电压值
sbit rs=P3^5;
sbit rw=P3^6;
sbit e=P3^4;
sbit psb=P3^7;
sbit dula=P2^6;
sbit wela=P2^7;
sbit S2=P3^0;
sbit S3=P3^1;
sbit fm=P2^3;

uchar pwm,num,i,j,a=5;

void delay(uint ms)
{
        uchar i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}

void lcd_com(uchar com)//写指令位置
{
        rs=0;
        rw=0;
        e=0;
        P0=com;
        delay(0);
        e=1;
        delay(0);
        e=0;
}
void lcd_dat(uchar dat) //写数据内容
{
        rs=1;
        rw=0;
        e=0;
        P0=dat;
        delay(0);
        e=1;
        delay(0);
        e=0;
}
void init()//液晶初始化
{
        psb=1;
        lcd_com(0x30);
        delay(1);
        lcd_com(0x0c);
        delay(1);
        lcd_com(0x01);
        delay(1);
}
void disp()
{
        uchar i;
        lcd_com(0x80);
        for(i=0;i<16;i++)
        {
                lcd_dat(num0[i]);
        }
}
void disp1()
{
        uchar i;
        lcd_com(0x90);
        for(i=0;i<3;i++)
        {
                lcd_dat(num1[i]);
        }

}
void bee()
{
        fm=0;
        delay(100);
        fm=1;
        delay(100);
}

void keyscan()
{                       
        if(S2==0)
        {
                delay(50);
                if(S2==0)
                {
                        if(pwm<10)
                        {
                                pwm++;         delay(50);                       
                                a--;        delay(50);                                                       
                        }
                }
                        else
                        {
                                bee();
                        }
                }


        if(S3==0)
        {
                delay(50);
                if(S3==0)
                {
                        if(pwm>1)
                        {
                                pwm--;        delay(50);                       
                                a++;        delay(50);                       
                        }
                        else
                        {
                                bee();
                        }
                }
        }
        if(a>9)a=9;
        if(a<0)a=0;
}
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>10)
        {
                num=0;
        }
        if(num<=pwm)
        {
                P1=0xff;
                P0=0x00;
        }
        else
        {
                P1=0x00;
                P0=0xff;
        }
        TR0=1;
}

void main()
{
        init_t0();
        init();        //初始化液晶
        num=0;
        pwm=5;
        wela=0;
        dula=0;                          
        while(1)
        {
       
                disp();
                disp1();
                lcd_com(0x90);        //电源跟踪值显示位置                         
                lcd_dat(num2[a]); //电源跟踪值
                keyscan();
        }
}


这里是调电机的,你下载也是可以用的

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:74784 发表于 2015-7-13 19:39 | 显示全部楼层
我在本坛发过一个~~~~~~~~~~~

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:250568 发表于 2017-11-28 15:14 | 显示全部楼层
利用pwm控制占空比,就可以实现这个功能
回复

使用道具 举报

ID:254733 发表于 2017-11-28 17:15 | 显示全部楼层
不停的改定时器的预装载时间自增或自减,占空比就变了亮度也会变。我这有正点原子的pwm程序
回复

使用道具 举报

ID:254893 发表于 2017-11-28 21:03 | 显示全部楼层
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

#define  pwm P0                                                                                                                                     

uint cycle,high,low;                //周期 高电平 低电平

void delayxms(uint x)
{
    while(x--);
}
                                                                                                                                                                  
void main()
{
         cycle=800;
         while(1)
         {
                 high=1;
                 for(high=1;high<=cycle;high++)
                 {
                          pwm=0xff;
                          delayxms(high);
                          pwm=0x00;
                          low=cycle-high;
                          delayxms(low);
                 }
                 low=1;
                 for(low=1;low<=cycle;low++)
                 {
                          pwm=0xff;
                          high=cycle-low;
                          delayxms(high);
                          pwm=0x00;
                          delayxms(low);
                 }
         }
}
回复

使用道具 举报

ID:255101 发表于 2017-11-29 11:28 | 显示全部楼层
去看看定时器怎么用就行
回复

使用道具 举报

ID:240626 发表于 2017-11-29 12:00 | 显示全部楼层
#include <reg51.h>

#define uInt unsigned int
#define uchar unsigned char

uchar PWM_T = 0;   //占空比控制变量
sbit c7=P3^7;  //6个按键,决定输出PWM_T值
sbit c6=P3^6;
sbit c5=P3^5;
sbit c4=P3^4;
sbit c3=P3^3;
sbit c2=P3^2;

            
/****************************************************
                  主程序
****************************************************/

void main(void)      
{
uInt n;

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,输出端口
P0=0xff;  //初始化P0

while(1)      //PWM周期100,高电平100- PWM_T, 低电平PWM_T,低电平工作
{   
  for(n=0;n<200;n++);           //延时,取值0-65535,数字越大变化越慢

  if(!c7||!c6||!c5||!c4||!c3||!c2)     //通过按键改变占空比
  {  
  if(!c7)         PWM_T=0;      //这些值可以改变
else if(!c6)    PWM_T=10;
else if(!c5)    PWM_T=35;
else if(!c4)    PWM_T=60;
else if(!c3)    PWM_T=85;
else if(!c2)    PWM_T=100;
  }
}      
}

/****************************************************
               /定时器0中断模拟PWM
****************************************************/

timer0() interrupt 1 using 2   
{
static  uchar   t ;   //PWM计数
t++;    //每次定时器溢出加1
  
if(t==100)   //PWM周期 100个单位
{
  t=0;  //使t=0,开始新的PWM周期
  P1=0x00;  //使LED灯亮  ,输出端口
  P0=0x00;  //使LED灯亮  ,输出端口
}
  
if(PWM_T==t)  //按照当前占空比切换输出为高电平
{  P1=0xff;        //使LED灯灭   
    P0=0xff;        //使LED灯灭  
}
}




给你一个简单的
回复

使用道具 举报

ID:255119 发表于 2017-11-29 12:15 | 显示全部楼层
#include <reg52.h>
sbit LED = P1^2;
unsigned char CYCLE;
unsigned char PWM_ON ;
void delay(unsigned int cnt)
{
while(--cnt);
}

main()
{
bit Flag;

TMOD |=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
IE= 0x82;
TR0=1;

CYCLE = 10;
while(!Flag)
  {
   delay(20000);
   PWM_ON++;     
   if(PWM_ON == CYCLE)
     {         
      Flag=1;
          }
  }

while(Flag)   
  {
   delay(20000);
   PWM_ON--;
   if(PWM_ON == 0)
     {
      Flag=0;
          }
  }
}

void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if (count==PWM_ON)
    {
     LED = 1;
    }
  count++;
if(count == CYCLE)
    {
    count=0;
        if(PWM_ON!=0)
           LED = 0;
    }

}
这个是本人测试验证程序。
回复

使用道具 举报

ID:255119 发表于 2017-11-29 12:16 | 显示全部楼层
#include <reg52.h> sbit LED = P1^2; unsigned char CYCLE;  unsigned char PWM_ON ; void delay(unsigned int cnt) {  while(--cnt); }  main() { bit Flag;  TMOD |=0x01; TH0=(65536-100)/256;  TL0=(65536-100)%256; IE= 0x82; TR0=1;  CYCLE = 10; while(!Flag)   {    delay(20000);     PWM_ON++;         if(PWM_ON == CYCLE)      {                 Flag=1;           }   }   while(Flag)      {    delay(20000);    PWM_ON--;    if(PWM_ON == 0)      {       Flag=0;           }   } }  void tim(void) interrupt 1 using 1 { static unsigned char count; // TH0=(65536-100)/256;  TL0=(65536-100)%256; if (count==PWM_ON)     {      LED = 1;      }   count++; if(count == CYCLE)     {     count=0;         if(PWM_ON!=0)             LED = 0;     }  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表