51单片机如何用一个定时器当多个延时电路用, 就是按下开关一 ,亮三秒。 按下开关二,灯泡亮五秒。
可以的,定时器先定时出一个秒周期,然后对秒进行计数,得变量M。这个M,可以从1计数到一万、一百万等,也可以循环计数,即计数到100就又从1开始;
然后按下开关一时,就取当前的M值=K1,并且使灯泡亮,当M=K1+3时,使灯泡灭就是了。
同理,按下开关二时,就取当前的M值=K2,并使灯泡亮,当M=K2+5时,使灯泡灭就是了。
没想法就不会有创新,你的想法就很好。像这种亮灯的程序,对时间要求不是那么严格(如果极其严格就没法实现),那么可以采用如下方法实现你的要求:
//假设晶振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;
}
//假设晶振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;
}
51单片机如何用一个定时器当多个延时电路用, 就是按下开关一 ,亮三秒...
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...
单片机的多个延时用定时器如何处理?
用定时器,定时1ms,每当到了、中断,就把 n1、n2、n3,分别加一,然后退出中断。在主函数中,分别检测n1、n2、n3是否到了50、30、60,到了,就该干什么就干什么去。用一个定时器,基本就可以满足所有的定时需求。
单片机怎么实现多任务延时
找出四种波半个周期时间的最大公约数,按你给的四个波,最大公约数就是450HZ的半个周期时间,即1.11毫秒,将定时器的中断周期设定为该时间,申明四个全局变量或静态变量,初值均为0,每次中断时四个变量均加一。第一个变量加到18(20\/1.111=18)时让其变为0,同时输出25HZ方波的单片机脚反向。第...
请问stc单片机1个定时器怎么控制两个设备?
如设备A启动后灯延时20秒熄灭 如设备B启动后另一灯灯延时30秒熄灭,可以用两 个变量分别计A B的延时时间,每次中断同时判断两 个变量的值
单片机如何用一个定时器设置两个定时
两个定时器使用没有什么特殊设置,但是有一个经验必须明白,中断里面重新对定时器赋值的操作必须放在中断处理的头端,否则会有一个整个中断处理的时间延时。如:void timer1()interupt3 using1 { ...\/\/如果这里的...程序段太长,那么每次中断就慢了处理这段程序的时间 TH1=0X..TL1=0X...\/\/如果...
单片机用一个定时器定时分别定时1ms 1S 2S去处理3个中断函数可以吗?
不可以,一个程序里可以用到3个定时器,但不能用一个定时器去处理3个中断函数。一定要一一对应,定时器0对应中断1 定时器1对应中断3 定时器2对应中断5,52单片机有3个定时器,51有2个定时器。
使用定时器1编写一个单片机延时函数,要求延时10s左右后,点亮2.6控制的L...
1\/时钟源,在我现在这块板子上,晶振频率是11.0592M,也就是时钟周期是 1\/11059200秒 机器周期:一般51单片机是12个时钟周期,我的板子也就是 12\/11059200秒 单次定时最长时间:如果是16位的计数器,16位最大值是65535,共可计数65536次。基本的常数一定要记住,还要记住8位最大值是255,共可计数...
51单片机LED延时闪烁delay(50000); 用定时器延时代替delay(50000)延时怎...
ET0 = 1; \/\/定时器0中断·开!TR0 = 1; \/\/定时器0·运行!} \/\/定时器0的中断函数:由定时器中断自动调用,你只需要写好中断后要怎么处理就好 void timeInt_T0 () interrupt 1 { \/\/每中断一次都要重新赋初值 TH0 = THx;TL0 = TLx;\/\/记够20次中断后,刷新显示 if(++counter == 20...
如何用单片机实现一个200s延时电路?
如图所示,当X0为ON,T0计时,T0计时100*100ms=10s,C0计数加一。同时T0复位清零,重新计时。当C0计数到20,即20*10s=200s时,Y0输出。这样定时器T0和计数器C0就实现了200s延时。望采纳。。。
用定时器1的工作方式2实现延时1s的程序是什么(单片机)?
用定时器1的工作方式2实现延时1s 不好,方式2最大只能定时256us,中断太频繁了.主程序中:uint a=0;TMOD=0X20;TH1=256-200;\/\/定时200us TL1=256-200;ET1=1;EA=1;TR1=1;中断程序里:a++;if(a ==5000){ a=0;其它操作 }