lium 发表于 2022-5-15 14:34

控制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的亮、灭可以控制,但是较亮、较暗,一直闪烁不定,请大家看看,什么地方出了问题,并给出修改方法

dengdc 发表于 2022-5-15 14:36


中断太快,超过51的处理能力是最主要原因
根本没有必要中断这么快

zhanghqi 发表于 2022-5-15 14:38

对,中断程序不老练,应该先做必须的事情,然后做对时间抖动敏感的事情

chuxh 发表于 2022-5-15 14:42

因为软件处理需要时间,而且一般讲处理时间还不固定,这种情况要考虑尽量不使用会产生跳转指令的算法,或插入必须NOP来补偿抖动

llljh 发表于 2022-5-15 14:44

是的,这里其实是指LED控制部分,就你的具体情况本身应该自动重装载初值

xxrs 发表于 2022-5-15 14:46

教你个方法实现软件PWM,做一个基本时基 比如: 频率100HZ,分100阶可调那么应该10MS(100HZ)/100阶 = 100US/阶,亦即每100US中断一回,而不是你的每10US中断一回,你的情况10US都不够处理你的中断程序

zhenykun 发表于 2022-5-15 14:50

软件PWM在占空比接近0%和100%控制比较困难

zwll 发表于 2022-5-15 14:52

不懂,帮顶了

lium 发表于 2022-5-15 15:00

控制LED的亮暗程可以使用PWM波来控制

lium 发表于 2022-5-15 15:04

嗯,我再好好缕一缕吧,有了好消息及时通知大家
页: [1]
查看完整版本: 控制LED亮暗