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

供稿:hz-xin.com     日期:2025-01-13
怎样用单片机定时器T0的方式2实现P0口LED灯亮一秒灭一秒?汇编语言,谢谢!

#include
unsigned char timer;
//系统时钟: 12Mhz
//高电平点亮.
void delay(unsigned int delaytime)
{ timer = delaytime;
while(timer!=0)
{}
}
void main()
{
unsigned light=1;
TMOD = 0X11; //timer1 mode 1,timer0 mode 1
PCON = 0x00; //SMOD = 0

TH0=(0xffff-10000)/256;
TL0=(0xffff-10000)%256;

TR0=1;
ET0=1;
EA =1;


while(1)
{P1=light;
delay(1000);//延时1秒.
light <<=1;
if(light ==0)
light =1;


}

}

void T0_service(void) interrupt 1 using 1
{//1毫秒中断1次.
TH0=(0xffff-1000)/256;
TL0=(0xffff-1000)%256;
if(timer>0)timer--;
}

ORG 0000H SJMP START ORG 0013H CPL P1.2 MOV TH1, #0D8H MOV TL1, #0F0H RETISTART: MOV TMOD, #10H MOV TH1, #0D8H MOV TL1, #0F0H SETB TR1 MOV IE, #84H SJMP $END

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位定时方式,这样误差会更小一点。

**********我爱梅梅头

#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亮灭一次
}
}

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。

DEL1: DJNZ R5,DELAY
DJNZ R6,DELAY
该成
DEL1: DJNZ R5,DEL1
DJNZ R6, DEL1

定时器T0延时1s的是吧,你邮箱是多少我给你传一个

单片机。用汇编语言编程。 设计一软件延时1s的子程序。设晶振频率为12M...
delay1000ms:(HT46R65的单片机)(注意不要开启中断允许位)mov a,10000111b (设置频率和记数方式)(上升记数还是下降记数)mov tmr0c,a (tmr0c 计数器的控制寄存器)mov a,low(65536-31250)mov TMR0L,a (计数器的赋予初始值的低位寄存器)mov a,high(65536-31250)mov TMR0h,a...

51单片机用汇编语言设计1S延时子程序,晶振为12MHz。 (麻烦附上详细计算...
如果单纯延时,可以用实验的办法,在keilc51里面仿真 void Delay1S(char n){ char i,j;n=n*4;for(;n;n--){ for(i=6;i;i++){ for(j=7;j;j++) \/\/ 一个循环约为1mS ;} } } 看编译后的汇编:C:0x0805 7D01 MOV R5,#0x06;j=1,1时钟 C:0x0807 0D INC ...

汇编程序 单片机我想用T0定时器定时1s,用T1计数器来计算1s时间内的方波...
CNTH EQU 30H CNTL EQU 31H ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#51H MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)MOV TH1,#0 MOV TL1,#0 SETB TR0 SETB TR1 SETB ET0 SETB EA MOV R2,#20 SJMP T0ISR:CLR TR0 MOV TH0,#HIGH(...

用C语言编写秒表的程序(单片机控制的时钟设计)
这个程序可以实现秒的计时,按键控制开始、暂停、清零功能,更多功能自己在看清程序的基础上进行改进。include <reg51.H> sbit P3_5 =P3^5;unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00};unsigned char ...

找一个单片机汇编语言编写的延时1ms的子程序
这个小程序确实非常简单。其核心在于通过循环来实现特定时间的延迟。具体来看,TIME1MS子程序首先将寄存器R6赋值为2,然后进入一个循环。在循环内部,R7被赋值为248,接着通过DJNZ指令实现对R7的循环递减。当R7递减为0时,程序将跳出循环,继续执行后续代码。紧接着,再次利用DJNZ指令对R6进行操作,使得整个...

MCS-51单片机,汇编语言编程对继电器控制,使其每秒取反变化,具体要求如...
include<reg51.h> define uchar unsigned char uchar times;void t0isr() interrupt 1 { TH0=(65536-46080)\/256;TL0=(65536-46080)%256;times++;} main(){ TMOD=0x01;\/\/还是模式1较好,模式2是8为定时,不够用的。TH0=(65536-46080)\/256;TL0=(65536-46080)%256;times=0;TR0=1;ET0=1...

单片机定时器中断实验 程序(汇编语言)不要c语言的
下列程序,已经经过实验,可以满足题目要求.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 ;...

利用单片机内部定时器T0以中断方式计时,实现每一秒钟使P2.0的输出状态...
include<reg52.h>\/\/包含52系列头文件 define th0 0x3c define tl0 0xb0 \/\/50ms at 12MHz Fosc define T1sAt50msCount 20 \/\/1s计数值 sbit WaveOut1=P2^0;\/\/定义 方波1输出 端口 void Timer0() interrupt 1\/\/定时器T0 中断 函数 { static uchar t50ms=0;TL0=tl0;TH0=th0;if(++...

找一个单片机汇编语言编写的延时1ms的子程序
多简单的小程序呀:TIME1MS:MOV R6, #2 TIME1:;延时498uS MOV R7, #248 DJNZ R7, $ ;R7的为0时,程序向下运行,否则继续减 ;DJNZ R6, TIME1 ;加上此命令后,每个小周期时间为500uS ;运行两周为1MS,再加上最前面的MOV R6那条指令,就是1.002MS RET 此程序实现的是1.002MS的定时,当然...

51单片机定时器的汇编语言程序编程,
这么简单的要求,不用大动干戈。看看下面的程序,是不是最简单:ORG 0000H SETB TR0 ;启动T0 MOV R2, #250 ;定时计数初值 LOOP:MOV TH0, #(8192 - 8000) \/ 32 ;定时8ms MOV TL0, #(8192 - 8000) MOD 32 JNB TF0, $ ;等待8ms CLR TF0 DJNZ R2, ...