
还有一个疑问
如果按下,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到五秒的程序延时程序!再加个数码管显示延时的秒数。可以循环的。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)