
不知你们老师是怎么想的,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语言的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)