DELAY20MS: MOV R7,#04H ;1us NOP ;1us LOOP: MOV R6,#0F8H ;1us DJNZ R6,$ ;F8H * 2us=248x2us=496us DJNZ R7,LOOP ;2us RET ;2us ;总延时时间:t=1us+1us+(1us+496us+2us)*4+2us=20000us=20ms
DELAY: MOV R6,Y (注:Y=#A0H以及下面的X=#3DH可根据已知求解。)
DELAY1: MOV R7,X
DJNZ R7,$
DJNZ R6,DELAY1
RET
延时时间t=(2*X+3)Y*TM (机器周期TM=12/振荡频率)
12M晶振 51单片机
(一)51C 循环
#include reg51.h
void delay_ms(unsigned int ms) // 延时子程序
{
unsigned int a,b;
for(a=ms;a0;a--)
for(b=123;b0;b--);
}
void main ()
{
while(1)
{
delay_ms(20); //20ms延时,数字即为多少毫秒
//这里写自己的程序
}
}
(二)51C中断
#include reg51.h
#define uchar unsigned char
void InitTimer0(void)
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = 0x0B1;
TL0 = 0x0E0; //20ms中断一次
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
InitTimer0();
//这里写入自己的程序
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0B1;
TL0 = 0x0E0;
time++;
}
(三)51汇编循环
D20MS:
MOV R7,#100
MOV R6,#100
DJNZ R6,$
DJNZ R7,$-4
RET
(四)51汇编中断
ORG 0000H
LJMP START
ORG 000BH
LJMP T0INT
START:
MOV SP,#60H
LCALL T0INIT
LOOP:
;这里写自己的程序
LJMP LOOP
T0INIT:
MOV TMOD,#01H
MOV TH0,#0B1H
MOV TL0,#0E0H
SETB EA
SETB ET0
SETB TR0
RET
T0INT: 20MS中断子程序
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#0B1H
MOV TL0,#0E0H
;这里写自己的程序
POP ACC
POP DPL
POP DPH
RETI
END
12MHz
是什么嘛?晶振?频率?
时间和频率是怎么换算的呢注意频率和时间并不是一个概念哦?
T
=
1/f
1Hz
等同于
1s
12MHz
等同于
1/12
us;
设一个变量T
=
0;
每1/12us变化一次,(比如T++);
那么,20s中有多少个
1/12us,则T就需要自动加多少次;
当最后加完最后一个
1/12us的时候,延时计时变量就该溢出了嘛(清零了)
则用个for循环实现我的思路:
unsigned
long
long
T
=
0;
for(T
=
0;T
(20s/(1/12us);T++))
{}
//处理代码
//计时变量恢复成0
T
=
0;
//如果你要进行第二轮处理的话。否则就没必要了
说明:for()循环里面的值不可以这么写哈,你得自己计算了;另外,也可以用while()结构;
当然楼上有人介绍用定时器,定时器还是考验了时间和频率之间的隐射关系。呵呵~~
单片机20秒延时开关程序的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:单片机20秒延时开关程序