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()结构;
当然楼上有人介绍用定时器,定时器还是考验了时间和频率之间的隐射关系。呵呵~~
ORG 0000H
JMP MAIN
ORG 000BH
TIMER0: ;50毫秒@12.000MHz
MOV TL0,#0B0H ; 重装定时初值
MOV TH0,#03CH
DJNZ R5, TT0
MOV R5, # 20 ; 50 x 20 = 1000 mS
SETB 30H ; 1 秒标志
TT0: RETI
MAIN: MOV TMOD,#01H ; 设置定时器模式
MOV TL0,#0B0H ; 设置定时初值
MOV TH0,#03CH
MOV IE, #82H ; 开T0 中断
SETB TR0 ; 定时器0开始计时
MOV R5, #20
MOV R6, #20
MIN1: JB 30H, $ ; 1 秒
CLR 30H
DJNZ R6, MIN1 ; 1 x 20 = 20 秒
MOV R6, #20
- - - ; 这里为 20 秒处理程序
CPL P1.0 ; 如 LED 20 秒 亮,20 秒 灭
JMP MIN1
END
单片机如果想有确延时的话,就用定时/计数器来实现,具体实法可以查资料,在这里一句两句也说不清。
如果不需要精确延时的话, 有一个小软件叫“单片机小精灵”可以帮你编写,你输入晶振,延时时间,就可以帮你编好了,自己编,不好编,因为涉及到时钟周期,指令占几个周期等等问题,用那个小软件很容易就实现了。
用unsigned char或char型
一条do{}while(--i);反汇编是DJNZ 一次2us(中断时无法计算)