用定时器实现程序中的Delay函数

 1     VAR_NUM        EQU    30H    ;定义第一个变量VAR_NUM
 2     VAR_TIMER    EQU    31H      ;定义第二个变量VAR_TIMER,过了20ms的次数
 3 
 4     DAT_74164    bit    P0.6    ;在数码管中显示的位置
 5     CLK_74164    bit    P0.7
 6 
 7     DIG_1        bit    p0.5
 8 
 9     org    0000H        
10     jmp    MAIN
11 
12 ;*******************************************    
13     org    0030H        ;Start program from 0030H        
14 MAIN:
15     ;Initialze I/O
16     mov    P0,#0FFH    
17     mov    P1,#0FFH    
18     mov    P2,#0FFH
19     mov    P3,#0FFH
20 
21     /*Intialize the variable*/
22     mov    VAR_NUM,#00H            ;把两个变量赋初值0
23     mov    VAR_TIMER,#00H
24 
25     /*Initialize T0*/初始化T0
26     mov    TMOD,#01H                    ;#0000:没用 0001B:游有用,定时器方式,工作方式为方式0做16位定时器    
27     mov    TH0,#0B1H              ;20ms,load number,TH0赋值1011 0001,TH0在高位,属于高八位
28     mov    TL0,#0E0H            ;TL0赋值1111 0000,TR0在低位,属于第八位 ~BEE0:45536,从45536开始加加到溢出过了20000微秒20ms
29     setb    TR0                  ;Start T0 ,定时器开始运行
30     
31 DISP_LOOP:    
32     mov    a,VAR_NUM              ;Get the value to display,把变量赋给a
33     mov    dptr,#TABLE  ;查表
34     movc    a,@a+dptr
35     call    sendTo74164            ;Display the numbet
36     clr    DIG_1
37     call    DELAY                ;For about 1s
38 
39     mov    a,VAR_NUM
40     inc    VAR_NUM
41     cjne    a,#09,DISP_LOOP        ;有没有到9,没有到回去+1再回去显示
42 43 jmp $ 44 45 ret 46 ;******************************************* 47 ;Send data of A to chip 74LS164 48 sendTo74164: 49 push 07h 50 push acc 51 52 mov r7,#08           ;send 8 bits ,循环8次 53 SEND164_LOOP: 54 clr CLK_74164           ;clear clock-line for reading data 55 rlc a 56 mov DAT_74164,c           ;move data-bit to data-line 57 setb CLK_74164           ;send data to 74164 58 djnz r7,SEND164_LOOP 59 clr CLK_74164           ;clear clock-line for reading data 60 61 pop acc 62 pop 07h 63 ret                    ;main和send都运行完,程序仍没有溢出:2000个机器周期才溢出 64 ;******************************************* 65 ;Dealy for a interval 66 DELAY:(硬件实现)等着定时起溢出50次,每次20ms,50次则1s
67 68 DELAY_WAIT:                 ;过个20ms变量+1直到过了50次,等着定时器溢出50次每次溢出的时间是20ms 69 jnb TF0,$              ;等着TF0=1即溢出,则过了20ms;B=0的话继续检查 70 ;Reset T0,must be done 71 clr TF0            ;Clear the tag of overflow,TF0清零,进 72 mov TH0,#0B1H          ;20ms,reload number,重新到半桶水 73 mov TL0,#0E0H ;溢出的话置为0,重新到半桶水 74 75 inc VAR_TIMER     ;VAR_TIMER变量+1,说明已经过了一个20ms 76 mov a,VAR_TIMER     ;把VAR_TIMER的值赋给a 77 cjne a,#50,DELAY_WAIT     ;看a有没有到50,不等于50则,等待溢出,直到溢出50次(1s)为止 78 79 mov VAR_TIMER,#00H ;Reset VAR_TIMER给溢出次数赋值0,后面万一再用到 80 81 ret 82 ;**************************************************** 83 TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H 84 ;**************************************************** 85 END

solution:

1 16位定时器用法:0000~1111:65535个机器周期,65535微秒 (X)

  0——65535: 0+1000:10ms 从0开始往上加

  先装一半:从55535开始加到65535(16位)

溢出:65535时候没有溢出刚好满+1:变为0~TF=1

计时器上限:看16位&看一位TF0

2 20ms*50 =1000ms=1s

3 20ms*50次;50ms*20次:

  71行忽略:不等20ms,指令循环50次,没有清零,一上来TF就是1,只有第一次循环的0有20ms,后面的直接套50次,400微秒,人眼看不见

 72,73行忽略:50个20ms变为50个60ms,时间间隔变长

posted on 2022-10-16 18:48  罗小罗佳油  阅读(298)  评论(0编辑  收藏  举报