单片机按键控制LED延时比如按下按键5秒,LED在按下按键时就亮5秒,松开按键再亮5秒。按下按键时间随机。

单片机按键控制LED延时比如按下按键5秒,LED在按下按键时就亮5秒,松开按键再亮5秒。按下按键时间随机。,第1张

我也建议用定时器计时,用中断处理按键

还有一个疑问

如果按下,LED点亮,不足5秒,比如3秒。此时释放按键的话,你需要怎么反应

是在3秒的基础上重新计时5秒后熄灭么

系统时钟是11059MHz

那么定时器每走一次是1/11059us,那么5ms就要n=5000/(1/11059)次,向定时器(若是16位)初值就是65536-n

外部晶振很准的,程序写好后在用示波器观察,再做细调

开始按下时,显示零秒,p10一直输出高。再按一下。显示1,p10灯亮一秒,

----

应该从没有按,就开始显示零秒。

;使用 110592MHz,程序如下。

LED BIT P10

KEY BIT P17

ORG 0000H

SJMP START

ORG 000BH

MOV TH0, #4CH

SETB F0

RETI

;--------------------------------------

START:

MOV TMOD, #01H

MOV TH0, #4CH

MOV TL0, #00H ;50ms@110592MHz

SETB TR0

MOV IE, #82H

;--------------------------------------

M_LOOP:

MOV R2, #0

LP0:MOV A, R2

ADD A, #(TAB - $ - 3)

MOVC A, @A + PC

MOV P2, A

MOV P0, A

MOV A, R2

MOV B, #20

MUL AB

LP1:MOV R3, A

LP2:CJNE R2, #0, LP3

SETB LED ;LED 在P10

JZ K_I

LP3:JNB F0, K_I

CLR F0

DJNZ R3, LP2

CPL LED ;LED 在P10

SJMP LP1

K_I:JB KEY, LP2 ;按键在P17

MOV R6, #10

DJNZ R7, $

DJNZ R6, $ - 2

JB KEY, LP2

JNB KEY, $

INC R2

CJNE R2, #6, LP0

SJMP M_LOOP

;--------------------------------------

TAB:

;共阳段码

DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H

DB 080H, 90H, 88H, 83H,0C6H,0A1H, 86H, 8EH

END

#define P_IOA_Data (volatile unsigned int )0x7000

#define P_IOA_Dir (volatile unsigned int )0x7002

#define P_IOA_Attrib (volatile unsigned int )0x7003

unsigned int scan();//检测黑线函数定声明

unsigned int num=0;

void delay();

void init_1()//输入初始化

{

[P_IOA_Dir]=0x00f0;

[P_IOA_Attrib]=0x00f0;

[P_IOA_Data]=0x000f;

}

//void init_2()//输出初始化

//{

//[P_IOA_Dir]=1;

//[P_IOA_Attrib]=1;

//[P_IOA_Data]=0;

//}

void main()

{

while(1)

{

void init_1();

num=scan();

//void init_2();

switch(num)

{

case 1:

{

while(1)

{

[P_IOA_Data]=0x9f;

delay(500);

// if([P_IOA_Data]==1)//传感器返回1,则终止转弯,下同

break;

}

}

case 2:

{

while(1)

{

[P_IOA_Data]=0x9f;

delay(500);

break;

}

}

case 4:

{

while(1)

{

[P_IOA_Data]=0x6f;

delay(500);

break;

}

}

case 5:

{

while(1)

{

[P_IOA_Data]=0x6f;

delay(500);

break;

}

}

case 0:

{

while(1)

{

[P_IOA_Data]=0x5f;

delay(500);

break;

}

}

}

[P_IOA_Data]=0x5f;//直走

delay(500);

}

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

unsigned int scan()

{

if(P_IOA_Data==0xfe)

{

num=1;

return num;

}

if(line_2==0xfd)

{

num=2;

return num;

}

if(line_4==0xfb)

{

num=4;

return num;

}

if(line_5==0xf7)

{

num=5;

return num;

}

return 0;

}

不能,

因为TH0和TLO都是8位的,两个加起来才16位,也就是说最大只能加到65535。

固最多可以达65毫秒。

如果想设置大于定时65毫秒的定时,你可以把它分成几次。比如:把1秒分成20次中断进行。每次中断的时间为50毫秒。

也就是相当在中断函数中加入

if(i==20)//定时1s时间到

{

//标语句

}

这时,就是产生20次中断才做一起 *** 作就相当于1秒做一次 *** 作(或可以认为是1秒一次真正的中断)

单片机的延时程序通过执行指令来达到延时效果,这个时间等于执行的指令需要的时间,而一个指令需要的时间叫做指令周期,这个时间等于若干个机器周期。

扩展资料:

1丶指令周期,是每种运算需要的时间,如加法、逻辑等,是每一步进行这种指令运算需要的时间,是机器周期的整数倍,这种周期不定。

2丶51单片机12M晶振,晶振周期1/12微妙,一个机器周期包含12个晶振周期,所以12M晶振时机器周期=12x(1/12)微妙=1微妙。

3丶1个毫秒延时子程序如下:

void delay1ms(uint ms)

{

uint  i,j;

for(i=0;i<ms;i++)

{

for(j=0;j<110;j++);

}

}

加一 是什么意思? 加1s 还是1ms、us?

用定时器做吧 节省资源

补充 :

当然可以不用定时器做,如楼下几位回答的 都可以 定时器的话 选用定时器设置寄存器(即初始化) 然后设定如1ms一次中断,在中断中 做一个计数器(自己定义一个count) 如果这个加到 1000次就是1s 加到5000次 就是5s 然后清零重新计数并在此时bu++ 就可以了

利用定时器 是节省资源的做法,而且还是最精确的做法,其他方法精度肯定不是完全的5s, 同时可以处理其他问题 如果用延时的话这个时候 中间就什么都不能做了

延时函数 例子:

void delay(unsigned char t)

{

int i=0,m=xxx;

for(i;i<t;i++)

{

//xxx,yyy是一个常量值 跟晶振有关 使得 下面的循环能够达到1s

//当然也可以用for循环

while(m--)

{ n =yyy;

while(n--);

}

}

再main函数调用的时候 delay(5) 就是5s

以上就是关于单片机按键控制LED延时比如按下按键5秒,LED在按下按键时就亮5秒,松开按键再亮5秒。按下按键时间随机。全部的内容,包括:单片机按键控制LED延时比如按下按键5秒,LED在按下按键时就亮5秒,松开按键再亮5秒。按下按键时间随机。、怎样用C8051F单片机的定时器做准确的5MS的延时呢、设计一个由51单片机控制的0到五秒的程序延时程序!再加个数码管显示延时的秒数。可以循环的。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9405747.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存