格物往事

定时器实例 (1秒报警,200hz输出 200-250变化输出)

定时1秒报警

程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1

次,以达到定时报警的目的。实际应用例如:定时报警器。

程序实例(DIN1.ASM):

ORG 0000H

AJMP MAIN

ORG 000BH

AJMP DIN0 ;定时器0入口

MAIN:

TFLA G EQU 34H ;时间秒标志,判是否到50个

0.2秒,即50*0.2=1秒

MOV TMOD,#00000001B;定时器0工作于方式1

MOV TL0,#0AFH

MOV TH0,#3CH ;设定时时间为0.05秒,定时

20次则一秒

SETB EA ;开总中断

SETB ET0 ;开定时器0中断允许

SETB TR0 ;开定时0运行

SETB P1.0

LOOP: AJMP LOOP

DIN0:

;是否到一秒////////////////////////////////////////

INCC: INC TFLAG

MOV A,TFLAG

CJNE A,#20,RE

MOV TFLAG,#00H

CPL P1.0

;//////////////////////////////////////////////////

RE:

MOV TL0,#0AFH

MOV TH0,#3CH ;设定时时间为0.05秒,定时

20次则一秒

RETI

END

5.2 频率输出公式

介绍:f=1/t

s51 使用12M晶振,一个周期是1微秒使用定时器1

工作于方式0,最大值为65535,

以产生200HZ的频率为例:

200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

平或低电平的时间为2500 微秒。这样,定时值应设为

65535-2500=63035,将它转换为十六进制则为:F63B。

具体程序请看f200.asm

频率递增:

200HZ:63035:F63B

250HZ:63535:F82F

300HZ:63868:F97C

5.3 200HZ频率输出

程序介绍:利用定时器定时,在P1.0 口产生200HZ

的频率输出。实际应用例如:传感器前级推动。

程序实例(F200.ASM):

ORG 0000H

AJMP MAIN

ORG 001BH

AJMP DIN0

MAIN:

CLR P1.0 ;产生一个低电平,实际上

是从p1.0口产生频率

MOV TMOD,#00010000B ;定时器1工作于方式0

MOV TH1,#0F6H

MOV TL1,#3BH ;频率产生的时间,详细请

见频率公式

SETB EA ;开总中断

SETB TR1 ;开定时器1运行

SETB ET1 ;开定时器1允许

LOOP: AJMP LOOP ;无限循环

DIN0: CPL P1.0 ;产生一个高电平,

下次来就是低电平(因为取反),一个高电平和一个低电平

形成一个周期

MOV TH1,#0F6H

MOV TL1,#3BH ;重置频率产生时间

RETI ;返回

END

5.4 200——250HZ变化频率输出

程序介绍:利用定时器定时时间的变化,由P1.0 口

产生200——250HZ变化的频率。实际应用例如:传感器

前级推动、频率发生器。

程序实例(F250.ASM):

ORG 0000H

AJMP MAIN

ORG 001BH

AJMP DIN1

MAIN:

;定义频率200和300//////////////////////////////////

F2H EQU 30H

F2L EQU 31H

F3H EQU 32H

F3L EQU 33H

;//////////////////////////////////////////////////

;定义频率保持初值//////////////////////////////////

MOV R1,#50

MOV R2,#02H

;//////////////////////////////////////////////////

;频率赋初值////////////////////////////////////////

MOV F2H,#0F6H

MOV F2L,#3BH

MOV F3H,#0F8H

MOV F3L,#2FH

;//////////////////////////////////////////////////

CLR P1.0 ;在P1.0口产生一个低

电平,一个脉冲是由一个高电平和一个低电平组成的

MOV TMOD,#00010000B ;定时器工作于方式1

MOV TH1,F2H

MOV TL1,F2L ;200HZ输出

SETB EA ;开总中断

SETB TR1 ;开定时器1运行

SETB ET1 ;开定时器1允许

LOOP: AJMP LOOP

DIN1:

CPL P1.0 ;取反P1.0口,实际

是为了不断的将p1.0的电平关系转换,即产生了频率

;频率保持时间//////////////////////////////////////

DJNZ R1,RE

MOV R1,#50

DJNZ R2,RE

MOV R2,#02H

;//////////////////////////////////////////////////

MOV A,F2H

CJNE A,F3H,XIA ;频率高位到300HZ

的高位了吗?

AJMP JIA ;频率高位没到

300HZ的高位值,直接将低位值加1

XIA: INC F2L

MOV A,F2L

CJNE A,#00H,RE

INC F2H

MOV A,F2H

CJNE A,F3H,RE

;/////////////////////////////////////////////

;频率高位加到300HZ的高位值了,低位加一,到300HZ的低

位值了吗,没到出去,到了关定时器

JIA:

INC F2L ;到了将200HZ频率的低位加1

MOV A,F2L

CJNE A,#F3L,RE

CLR TR1

;/////////////////////////////////////////////

RE:

MOV TH1,F2H

MOV TL1,F2L

RETI

END

退出移动版