延时1秒 单片机 汇编语言

延时1秒 单片机 汇编语言,第1张

定时器T0来完成

那么我令T0的溢出时间为200us

那么T0的初值为56

1(s)=200*250*2(us)

下面是程序

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP CTC0

ORG 100H

MIAN:

MOV SP,#5FH

MOV R7,#250软件计数第一级

MOV R6,#2软件计数第二级

MOV TL0,#56送初值

MOV TH0,#56

ANL TOMD,#0F0HTOMD高4位不变,T1工作方式

ORL TMOD,#02H定义T0工作方式

SETB ET0

SETB TR0

SJMP $

CTC0:

PUSH PSW保护PSW

DJNZ R7, EXIT软件计数

MOV R7,#250 重装初值,下同

DJNZ R6,EXIT

MOV R6,#2

EXIT:

POP PSW

RETI

unsigned char rSecondCount//秒计时数

unsigned char rMinuteCount//分计时数

sbit IsOneSecondReach

sbit Pulse_Sec=P1^0

sbit Pulse_Min=P1^1

main()

{

rSecondCount=0

rMinuteCount=0

TH1=0x3C

TL1=0xAF//定时器50ms产生一次中断 (FFFF-3CAF)us

MOD = 0x10//定时器1工作于模式1,(用工作于模式2也可以,而且更 简便)

TR1=1//使能定时器1

ET1=1//开中断

EA=1//开全局中断

while(1)

{

if (IsOneSecondReach)

{

IsOneSecondReach = 0

//do something,如果一秒延时标志为1,则清除此标志,等待下次1秒,在此处

//执行需要执行的程序

}

}

}

/* 定时器50ms产生一次中断 */

void Timer(void) interrupt 3

{

/* 重新载入T1参数 */

TH1=0x3C

TL1=0xAF

/* 一秒累加 */

rSecondCount++//秒计时+1

if (rSecondCount==20) //1sec到,50ms*20

{

IsOneSecondReach = 1

}

}

//

脉冲宽度为50ms,如果有其他要求的话,修改T1参数和“秒分”的参数凑下就行了.

用定时器1的工作方式2实现延时1s 不好,方式2最大只能定时256us,中断太频繁了.

主程序中:

uint a=0

TMOD=0X20

TH1=256-200//定时200us

TL1=256-200

ET1=1

EA=1

TR1=1

中断程序里:

a++

if(a ==5000)

{

a=0

其它 *** 作

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11160216.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存