打印

LED的亮、灭可以控制,但是较亮、较暗

[复制链接]
1643|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhenykun|  楼主 | 2013-11-22 23:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想控制LED的亮暗程度,完全程序来实现。接口定义入下:
P1^0——LED,输出为高电平时点亮二极管;
P2^0——KEY1,按键后LED最亮;
P2^1——KEY2,按键后LED较亮;
P2^2——KEY3,按键后LED较暗;
P2^3——KEY4,按键后LED灭掉;


试验程序如下:
#include <REGX51.H>
#define uchar unsigned char                     
void init_sys(void);            /*系统初始化函数*/
void Delay5Ms(void);
unsigned char ZKB1;
void main (void)
{
init_sys();
  ZKB1=0;            /*占空比初始值设定*/
           
   while(1)
  {
       if (!P2_0)
       {
       Delay5Ms();
       if (!P2_0)
         {
         ZKB1=100;         
          }
      }

   if (!P2_1)
       {
       Delay5Ms();
       if (!P2_1)
         {
         ZKB1=75;         
          }
      }
    if (!P2_2)
       {
       Delay5Ms();
       if (!P2_2)
         {
         ZKB1=25;         
          }
      }
     
       if (!P2_3)
      {
       Delay5Ms();
       if (!P2_3)
         {
         ZKB1=0;        
          }
      }
/*对占空比值限定范围*/
if (ZKB1>75) ZKB1=100;
if (ZKB1<25) ZKB1=0;
  }
}

void init_sys(void)           
{

  TMOD=0X01;
  TH0=0XFF;
  TL0=0XF6;
  TR0=1;
  ET0=1;
  EA=1;
}


void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}

void timer0(void) interrupt 1 using 2
{
static uchar click=0;               
TH0=0XFF;                                    
TL0=0XF6;
++click;
if (click>=100) click=0;
if (click<=ZKB1)      
   P1_3=0;
else
  P1_3=1;
}

实验效果:
LED的亮、灭可以控制,但是较亮、较暗,一直闪烁不定,请大家看看,什么地方出了问题,并给出修改方法,谢谢。

相关帖子

沙发
spark周| | 2013-11-22 23:48 | 只看该作者
中断太快,超过51的处理能力是最主要原因
根本没有必要中断这么快

使用特权

评论回复
板凳
shimx| | 2013-11-22 23:49 | 只看该作者
对,中断程序不老练,应该先做必须的事情,然后做对时间抖动敏感的事情

使用特权

评论回复
地板
dengdc| | 2013-11-22 23:51 | 只看该作者
因为软件处理需要时间,而且一般讲处理时间还不固定,这种情况要考虑尽量不使用会产生跳转指令的算法,或插入必须NOP来补偿抖动

使用特权

评论回复
5
heweibig| | 2013-11-22 23:51 | 只看该作者
是的,这里其实是指LED控制部分,就你的具体情况本身应该自动重装载初值

使用特权

评论回复
6
liliang9554| | 2013-11-22 23:52 | 只看该作者
教你个方法实现软件PWM,做一个基本时基 比如: 频率100HZ,分100阶可调那么应该10MS(100HZ)/100阶 = 100US/阶,亦即每100US中断一回,而不是你的每10US中断一回,你的情况10US都不够处理你的中断程序

使用特权

评论回复
7
午夜粪车| | 2013-11-22 23:53 | 只看该作者
也可以直接根据占空比,和频率计算0和1状态的初值,在中断中直接控制定时器的下一次溢出时间,这样可以更精密的调整占空比

使用特权

评论回复
8
zhaoxqi| | 2013-11-22 23:54 | 只看该作者
软件PWM在占空比接近0%和100%控制比较困难

使用特权

评论回复
9
zhenykun|  楼主 | 2013-11-22 23:54 | 只看该作者
哦,明白了,多谢

使用特权

评论回复
10
zhenykun|  楼主 | 2013-11-22 23:54 | 只看该作者
先结贴了

使用特权

评论回复
11
wishu| | 2013-11-23 09:23 | 只看该作者
中断时间短了,模拟PWM 100HZ-500HZ就可以了。

使用特权

评论回复
12
酸梅粉| | 2013-11-23 10:28 | 只看该作者
没见过这么写PWM的,有点奇怪

使用特权

评论回复
13
黄小俊| | 2013-11-23 13:59 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

868

主题

11535

帖子

3

粉丝