用单片机汇编语言编写一秒的定时 用定时器T0 方式2 急...16
发布网友
发布时间:2023-11-13 09:20
我来回答
共5个回答
热心网友
时间:2024-04-05 20:57
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位定时方式,这样误差会更小一点。
**********我爱梅梅头
热心网友
时间:2024-04-05 20:54
定时器T0延时1s的是吧,你邮箱是多少我给你传一个
热心网友
时间:2024-04-05 20:56
DEL1: DJNZ R5,DELAY
DJNZ R6,DELAY
该成
DEL1: DJNZ R5,DEL1
DJNZ R6, DEL1
热心网友
时间:2024-04-05 20:53
#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亮灭一次
}
}
热心网友
时间:2024-04-05 20:51
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。