51单片机如何用一个定时器当多个延时电路用, 就是按下开关一 ,亮三秒。 按下开关二,灯泡亮五秒。

51单片机如何用一个定时器当多个延时电路用,
就是按下开关,一,灯泡亮三秒。
按下开关,二,灯泡亮五秒。
按下开关,三,灯泡亮八秒。

第1个回答  2017-08-30
没想法就不会有创新,你的想法就很好。像这种亮灯的程序,对时间要求不是那么严格(如果极其严格就没法实现),那么可以采用如下方法实现你的要求:
//假设晶振12MHZ,按键输入P1.0,P1.1,P1.2;LED控制P2.0,P2.1,P2.2,都是低电平有效
#include "reg51.h"
unsigned int YSJS1=0;
unsigned int YSJS2=0;
unsigned int YSJS3=0;
sbit KEY1=P1^0;按键
sbit KEY2=P1^1;按键
sbit KEY3=P1^2;按键
sbit LED1=P2^0;灯
sbit LED2=P2^1;灯
sbit LED3=P2^2;灯
void Timer1Init(void) //500微秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x0C; //设置定时初值
TH1 = 0xFE; //设置定时初值
TF1 = 0; //清除TF1标志
ET1 = 1; //使能定时器1中断
TR1=1; //定时器1开始计时
EA =1; //开总中断
}
void main(void)
{
LED1=1;
LED2=1;
LED3=1;
KEY1=1;
KEY2=1;
KEY3=1;
Timer1Init()
while(1)
{
if(KEY1==0)
{
YSJS=6000;
LED1=0;
}
if(KEY2==0)
{
YSJS=10000;
LED2=0;
}
if(KEY3==0)
{
YSJS=16000;
LED3=0;
}
}
}

void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFE; //定时器1定时时间=500us
TL1 = 0X0C;

if(YSJS1!=0)
{
YSJS1--;
}
else LED1=1;
if(YSJS2!=0)
{
YSJS2--;
}
else LED2=1;
if(YSJS2!=0)
{
YSJS2--;
}
else LED2=1;
}本回答被网友采纳