用单片机汇编语言编写一秒的定时 用定时器T0 方式2 急求!!

这是我自己写的可以仿真时延时不对 请帮忙看看 并改一下 或者另写一个 谢谢
MOV TMOD,#02H
MOV TL0,#06H
MOV TH0,#06H
MOV R5,#400
MOV R6,#10

DELAY: SETB TR0
JBC TF0,DEL1
SJMP DELAY
DEL1: DJNZ R5,DELAY
DJNZ R6,DELAY
RET

TIME1S EQU 30H
TIME50ms EQU 31H

ORG 0000H ;程序入口
AJMP main

ORG 000BH ;TO中断入口
AJMP INT_T0

ORG 100H
main: MOV TIME1S,#0
MOV TIME50ms,#0
MOV TMOD ,#02H ;写控制字,将T0设为方式2( 8位自动重装)
MOV TH0, #06H ;THO和TL0的计算为:2的16次方-(晶振*定时时间 /12)
MOV TL0, #06H ;TC =0FFH-06H= 6H =6===》延时时间为(2^8-TC)*12/16 =250us 定时时间为250us
SETB TR0 ;启动T0
SETB ET0 ;允许T0中断
SETB EA ;开放CPU中断

LOOP: NOP

AJMP LOOP

INT_T0:PUSH PSW
PUSH ACC
INC TIME50ms
MOV A,TIME50mS
CJNE A,#200,INT_01 ;200次为TIME1S加1,此处时间为200*250us=50ms
MOV TIME50ms,#0
INC TIME1s
MOV A,TIME1S
CJNE A,#20,INT_01 ;此处再做20次即为1S
2020
MOV TIME1S,#0
;;;;;;;;;;;此处你可以编你要的程序,我在这里将P3。1脚取反,每秒变一次电平
CPL P3.1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

INT_01:POP ACC
POP PSW
RETI

END

注:以上设计为12M晶振,仿真通过。此方法并未达到精确的定时,因为8位定时器,要做好多4000次才完成1秒的定时。它的时间会延长了一点点,每一秒种有0。01秒的误差左右,要看你用的是什么单片机。若要精确定时建议用16位定时方式,这样误差会更小一点。

**********我爱梅梅头
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-05-05
#include
#define
uchar
unsigned
char
sbit
led=p1^0;
uchar
time;
void
inittimer0(void)
{
tmod
=
0x01;
//定时器0,工作方式1
th0
=
0x3c;
tl0
=
0xb0;
//50ms中断一次
ea
=
1;
et0
=
1;
tr0
=
1;
}
void
main(void)
{
inittimer0();
while(1);
//
分号,表示在此一直循环执行,等待中断。相当于汇编的
ajmp
$
}
void
timer0interrupt(void)
interrupt
1
{
th0
=
0x3c;
tl0
=
0xb0;
time++;
if(time==20)
//中断20次,1s
{
time=0;
led=!led;
//p1.0上的led1s亮灭一次
}
}
第2个回答  2010-07-19
MOV TMOD,#02H
MOV TL0,#06H
MOV TH0,#06H
MOV R5,#40
MOV R6,#100
SETB TR0
DELAY: SETB TR0
JBC TF0,DEL1
SJMP DELAY
DEL1: DJNZ R5,DELAY
DJNZ R6,DELAY
RET
是51单片机吧!R5是八位的,最大255,你给的是400。
第3个回答  2012-05-08
DEL1: DJNZ R5,DELAY
DJNZ R6,DELAY
该成
DEL1: DJNZ R5,DEL1
DJNZ R6, DEL1
第4个回答  2010-07-19
定时器T0延时1s的是吧,你邮箱是多少我给你传一个
相似回答