别见气,还没有怎入门!
ORG 000BH
TIMER0:
PUSH ACC
MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ TIMER,LP
MOV TIMER,#20H
LCALL TIME_INC
LP: POP ACC
RET
你似乎是用50ms中断定时就你的程序而言就有错:DJNZ TIMER,LP;时间未到转子程序返回,没有问题,但是时间到了,你除了重新给timer付值,也应该给出时间到的动作标志:cpl P1.0,等。
timer equ 40h
ORG 0000H
AJMP MAIN
ORG 000BH ;定时器0中断入口地址
LJMP IT_0
ORG 0030H
MAIN:
MOV SP,#70H ;;;堆栈首地址
MOV TMOD,#00H ;;;计时器T0T1工作模式(0)选择
MOV TH0,#70H ;;;T0计时器初值
MOV TL0,#00H
MOV IE,#82H ;;;开放中断
mov timer,#200
loop: 上面是初始化程序,接下来:loop是主程序
。。。。。。
ajmp loop
IT_0: ;定时器中断程序
dec timer
mov a,timer
DJNZ a,LP
cpl p1.0
mov timer,#200
LP: POP ACC
MOV TH0,#70H ;;;T0计时器初值
MOV TL0,#00H
RETI
END
你这里有开定时器吗?
开定时器是在你的主函数或初始化程序中:
MOV TMOD,#01H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB EA ;总中断允许
SETB ET0 ;定时器0中断允许
SETB TR0 ;开定时器
定时中断应该是
ORG 000BH
org 0100h;添加主程序地址
TIMER0:
;*********
MOV TH0,#00H
MOV TL0,#00H
;************添加中断赋值语句
PUSH ACC
MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ TIMER,LP
MOV TIMER,#20H
LCALL TIME_INC
LP: POP ACC
RETi;中断程序应该用reti返回
而且没有主程序
要在后面写一个主函数
main:
MOV TMOD,#00H
MOV TH0,#00H
MOV TL0,#00H
MOV IE,#82H
start:
jmp start
T0、T1中断程序设计的常用
步骤
:
(1)选择T0或T1(通常可随意);
(2)选择T0或T1的工作方式(依据定时长度要求)
;
(3)计算T0、T1的计数初值;
(4)程序设计:
主程序
-设置TMOD、THx、TLx
-开启中断(置位EA,以及ET0或ET1)
-启动T0或T1(置位TR0或TR1)
中断服务
子程序
-重置计数初值(方式2不需要)
-完成预定的功能
-可选:保护/
恢复现场
,屏蔽其它中断等
使用定时器要有一个初值设置,这个初值和你要定时的时间有关系的。。
像我有一个程序 下面的是5ms的定时。。
就这么看我觉得也看不出什么,最好自己找本书,好好看一看。。
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP IT_0
ORG 0030H
MAIN:
MOV SP,#70H ;;;堆栈首地址
MOV TMOD,#00H ;;;计时器T0T1工作模式(0)选择
MOV TH0,#70H ;;;T0计时器初值
MOV TL0,#00H
MOV IE,#82H ;;;开放中断
AJMP $
IT_0:
CPL P1.0
MOV TH0,#70H ;;;T0计时器初值
MOV TL0,#00H
RETI
END