用定时器实现程序中的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,时间间隔变长