找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1793|回复: 5
打印 上一主题 下一主题
收起左侧

我想用单片机进行pwm分级调整改变LED亮度

[复制链接]
跳转到指定楼层
楼主
最后进行调试时候,为什么这个发光二极管led就总是一闪一闪的,加1时候,led闪得越来越快?
这算是调整亮度吗?我要是亮和暗那种样子。

程序都编辑好了
sbit led1=P2^0;
sbit led2=P2^2;
sbit PWM=P3^7;
sbit key1=P2^6;//A加
sbit key2=P2^7;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 fenpin=1;                       
u16 chuzhi=500;        
u16 timer0;                                       
void delay(u16 i)
{
        while(i--);        
}

void key()
{
  if(key1==0)   //A加
        {
          delay(100);
                 if(key1==0)
           {
                          if(fenpin<16)
                                {
                     fenpin++;
                                        beep=0;
                                }else
                                {
                                 beep=1;
                                }
                 }
                 while(!key1);
        }
        if(key2==0)     //A减
        {
          delay(100);
                 if(key2==0)
           {
                         if(fenpin>=2)
                         {
                           fenpin--;
                                  beep=0;
                         }else
                         {
                            beep=1;
                         }
                 }
                 while(!key2);
        }
}
void timer_init(void)  //定时器初始化函数
{
        TMOD=0X51;          //设置定时器工作模式
        PT0=1;     
        TH0 = (65536 -chuzhi)/256;//给定时器赋初值
        TL0 = (65536 -chuzhi)%256;
        TH1=0;              //不设初值
        TL1=0;
        ET0=1;              //开中断
        ET1=1;
        TR0=1;              //开定时器
        TR1=1;
        EA=1;               //开总中断
}
void main()
{        
        timer_init();
         beep=0;
        while(1)
        {
                        key();
               
        }
}


void timer() interrupt 1          //定时器0中断函数
{
        TH0 = (65536 - chuzhi)/256;//给定时器赋初值
        TL0 = (65536 - chuzhi)%256;
        timer0=!timer0;          //时间变量
        if(TL1>=fenpin)
                {
                  TL1=0;
                        PWM=!PWM;
                }
  if(timer0)
        {
                P1=0x00;
          led1=0;
    led2=1;        
                P1=smgduan[fenpin/10];
        }else
        {
                P1=0x00;
          led1=1;
    led2=0;               
                P1=smgduan[fenpin%10];
        }
}         

51hei图片_20200102211904.png (147.7 KB, 下载次数: 20)

51hei图片_20200102211904.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:462827 发表于 2020-1-3 09:16 | 只看该作者
仿真的只能这样闪了,你要用实物单片机的led灯才能真正展现亮度的变化
回复

使用道具 举报

板凳
ID:454178 发表于 2020-1-3 10:10 | 只看该作者
hantu 发表于 2020-1-3 09:16
仿真的只能这样闪了,你要用实物单片机的led灯才能真正展现亮度的变化

但是 我用实物焊接单片机led灯,其他什么没问题,就这个led灯,我加1时候最后,它就是闪闪闪着闪烁,感觉没有亮度调整。
回复

使用道具 举报

地板
ID:475247 发表于 2020-1-3 10:46 | 只看该作者
将你后面PWM如下图这样接就能看到仿真的亮度变化

pwm.jpg (29.18 KB, 下载次数: 16)

pwm.jpg
回复

使用道具 举报

5#
ID:401564 发表于 2020-1-4 11:04 | 只看该作者
我在这总能看到很多人先花很大精力去解决好仿真的问题,总感觉仿真OK了就万事大吉了一样,然后拼命的解决好了仿真的问题,实物却又是另外一回事,何苦呢?
这原本是一个很简单的项目:
1,把PWM频率设定为1KHZ,不管是延时,定时器还是片上自带的PWM功能都行,这1KHZ是大多LED调光都用的频率,可以适应90%以上的LED
2,LEDVF值(就是LED的正向导通压降)不同,它对PWM占空比的亮度变化也不同,所以,你就设定9个等级,占空比从10%到90%,每次调节占空比加1,然后你就可以大概知道这个LED要怎么调节了。
3,如果你连占空比都不知道怎么调节。…。……。…。…。…。……。…。…。……
回复

使用道具 举报

6#
ID:680894 发表于 2020-1-4 20:32 | 只看该作者
仿真玩的好,实物做起来才更简单!有些个人自以为随便说说就是解决了问题,其实是没有入到精髓!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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