51单片机的定时器设计。 汇编语言

51单片机的定时器设计。 汇编语言,第1张

不知你们老师是怎么想的,R7不事先赋值会造成程序启动状态不定,有可能延迟反应。MOV R7,#14不能准确定时1秒。也许是MOV R7,#14H,你贪污了"H"。

假定是14H这种种情况:

T0_INT: MOV TL0, #58H;T0定时时间50毫秒

MOV TH0, #9EH

DJNZ R7, NEXT;没到1秒,退出中断,这里是退出,没有循环

CPL P17;到了1秒,改换输出状态

MOV R7 #14;准备下1秒延时参数

NEXT : RETI ;中断返回

将计数值按二进制数在P1口驱动发光二极管显示出来,到15秒后,计数值清零再从0开始计。

--这些发光二极管,是低电平发光,还是高电平发光?

下面的程序,适合于低电平发光:

ORG 0000H

LJMP START

ORG 000BH

DEC A

MOV P1, A

RETI

ORG 0030H

START:

MOV TMOD, #16H

MOV TH0, #255

MOV TL0, #255

SETB TR0

SETB TR1

MOV IE, #82H

LOOP:

MOV A, #255

MOV P1, A

MOV R2, #240

WAIT:

MOV TH1, #HIGH(65536-62500)

MOV TL1, #LOW(65536-62500)

JNB TF1, $

CLR TF1

DJNZ R2, WAIT

SJMP LOOP

END

如果是高电平发光,可以使用下面的程序:

ORG 0000H

LJMP START

ORG 000BH

INC A

MOV P1, A

RETI

ORG 0030H

START:

MOV TMOD, #16H

MOV TH0, #255

MOV TL0, #255

SETB TR0

SETB TR1

MOV IE, #82H

LOOP:

CLR A

MOV P1, A

MOV R2, #240

WAIT:

MOV TH1, #HIGH(65536-62500)

MOV TL1, #LOW(65536-62500)

JNB TF1, $

CLR TF1

DJNZ R2, WAIT

SJMP LOOP

END

下列程序,已经经过实验,可以满足题目要求

ORG 0000H

SJMP MAIN

ORG 000BH

SJMP T0_INT

MAIN:

MOV TMOD, #01H ;T0定时方式1

MOV TH0, #(65536-50000) / 256 ;定时50ms@12MHz

MOV TL0, #(65536-50000) MOD 256 ;

SETB TR0 ;启动T0

MOV IE, #82H ;开中断

;第一秒钟L0,L2亮,第二秒钟L1,L3亮,第三秒L4,L6亮,第四秒钟L5,L7亮,

;第五秒L0,L2,L4,L6亮,第六秒钟,L1,L3,L5,L7亮,第七秒钟八个二极管全亮,第八秒钟全灭

MOV 30H, #11111010B

MOV 31H, #11110101B

MOV 32H, #10101111B

MOV 33H, #01011111B

MOV 34H, #10101010B

MOV 35H, #01010101B

MOV 36H, #00000000B

MOV 37H, #11111111B

MOV R0, #30H

MOV R7, #20

M_LOOP:

SJMP M_LOOP ;无限循环

T0_INT:

MOV TL0, #(65536-50000) MOD 256 ;

MOV TH0, #(65536-50000) / 256 ;定时50ms@12MHz

DJNZ R7, T0_END

MOV R7, #20

MOV P1, @R0

INC R0

CJNE R0, #38H, T0_END

MOV R0, #30H

T0_END:

RETI

END ;完

解:选用定时计数器T1工作与定时方式2,定时250us(fosc=12MHz)机器周期为

1us:定时器初值TC=6

所以:TH1=6,TL1=6

ORG

00H

LJMP

START

ORG

1BH

LJMP

INT_T1

ORG

0100H

START:MOV

TMOD,#20H

MOV

TH1,#6H

MOV

TL1,#6H

SETB

ET1

SETB

EA

MOV

R7,#200

MOV

R6,#200

SETB

TR1

SJMP

$

INT_T0:DJNZ

R7,T0_END

MOV

R7,#200

DJNZ

R6,T0_END

MOV

R6,#200

CPL

P10

;P10每秒变化一次

T0_END:RETI

DELAY:MOV R3,#14H ; 循环20次 汇编语言定时器赋初方法

MOV TMOD,#10H ; 定时器1工作于模式1(16位定时器)

MOV TH1, #HIGH NOT 50000 ; 赋初值,50毫秒溢出一次

MOV TL1,#LOW NOT 50000 ; 晶振 12 MHz 为 50000 uS

SETB TR1 ; 启动定时器1

LP1: JBC TF1,LP2 ; 溢出位为1,则清0后转移到LP2

SJMP LP1 ; 否则等待TF1置1

LP2 :MOV TH1, #HIGH NOT 50000 ; 重新赋初值 这样比较 直观

MOV TL1, #LOW NOT 50000 ; 1 就是 1 uS ,1毫秒=1000 uS

DJNZ R3,LP1 ;20次循环完成则退出,否则转LP1

RET

查询方式,同样可以做到多任务“并行”的,只是查询的方法要得当,

不要等到这个任务执行完了,才去查询下个任务是否应该执行,

当然各任务优先级别不同的时候例外。

看看下列程序,是否有帮助

ORG 0000H

MOV 50H,#9

MOV 51H,#20

MOV TMOD,#11H

MOV TH1,#3CH

MOV TL1,#0B0H

MOV TH0,#3CH

MOV TL0,#0B0H

SETB TR0

SETB TR1

MOV R1,#0FEH

MOV R2,#0FEH

L1:

JBC TF1,L2

JBC TF0,L3

AJMP L1

L2:

MOV TH1,#3CH

MOV TL1,#0B0H

DJNZ 50H,L1

MOV 50H,#9

MOV A,R1

RL A

MOV P2,A

MOV R1,A

AJMP L1

L3:

MOV TH0,#3CH

MOV TL0,#0B0H

DJNZ 51H, L1

MOV 51H, #20

MOV A,R2

RR A

MOV P0,A

MOV R2,A

AJMP L1

END

上述程序,已经用PROTEUS仿真实验成功,两个任务,基本上是互不干扰。

SECOND EQU 30H

COUNT EQU 31H

ORG 00H

LJMP START

ORG 0BH ;定时器0中断入口

LJMP INT_T0

START: MOV SECOND,#00H

MOV COUNT,#00H

MOV DPTR,#TABLE ;段码表首地址

MOV P0,#3FH ;数码管显示初始化

MOV P2,#3FH

MOV TMOD,#01H ;设置定时器0工作方式

MOV TH0,#(65536-50000)/256 ;定时50毫秒

MOV TL0,#(65536-50000) MOD 256

SETB TR0 ;启动定时/计数器0

MOV IE,#82H ;开中断

LJMP $ ;等待中断

INT_T0: MOV TH0,#(65536-50000)/256 ;定时50毫秒

MOV TL0,#(65536-50000) MOD 256

INC COUNT ;计数值加1

MOV A,COUNT

CJNE A,#20,I2 ;是否计够1秒

MOV COUNT,#00H

INC SECOND

MOV A,SECOND

CJNE A,#60,I1 ;是否计够60秒

MOV SECOND,#00H

I1: MOV A,SECOND

MOV B,#10

DIV AB ;分离计数值十位和个位

MOVC A,@A+DPTR

MOV P0,A

MOV A,B

MOVC A,@A+DPTR

MOV P2,A ;显示计数值

I2: RETI ;中断返回

TABLE: DB 3FH,06H,5BH,4FH,66H

DB 6DH,7DH,07H,7FH,6FH

END

以上就是关于51单片机的定时器设计。 汇编语言全部的内容,包括:51单片机的定时器设计。 汇编语言、急!51单片机定时计数器实验编程(汇编语言)、单片机定时器中断实验 程序(汇编语言)不要c语言的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9715402.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存