
那么我令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
其它 *** 作
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)