;辅弼,介绍一下51单片机的守时计数器,51有两个守时计数器,分别为T0,T1,根本相同,
;有一点不同,下面咱们介绍守时计数器T0
;了解8051的timer0中止的程序写法,用中止法发生守时
;上面显现的是proteus仿真图,下面的是源程序
;阐明:(源程序中的终端进口地址很重要(这个是固定的),程序中止时,会在对应中止固定的
;进口地址进入,由于规则的相隔进口间的空进有限,只能用跳转指令跳转,终究用RETI强制回来
;这个程序把一切的中止进口地址都写上了,没有用到的,用RETI直接屏蔽)
;运转结果是使led灯明一下,暗一下。
COUNT EQU9217;关于11.0592的晶振来说,延时10ms
LEDEQUP1.1
ORG0000H
LJMP RESET;开端时跳转转到初始化程序中
ORG0003H;外部中止0
RETI
ORG000BH;守时器/计数器T0进口地址
LJMP INT_TIMER0;跳转到守时器/计数器中止服务程序中去
ORG0013H;外部中止1
RETI
ORG001BH;守时器/计数器T1
RETI
ORG0023H ;串行口中止
RETI
ORG0030H
RESET:
MOVR0,#00H
DJNZ R0,$;刚开端,先进行少数的延时,是各种作业寄存器准备好
CLRLED
MOVTMOD,#00000001B;设置守时器T0作业在方法1(16位)
MOVTH0,#HIGH(65536-COUNT);设置初值(关于怎样核算,许多书上都有)
MOVTL0,#LOW(65536-COUNT)
;MOVTH0,#(65536-COUNT)/256;取高八位数据(这是第二种方法)
;MOVTL0,#255;取底五位(为最大了)
CLRTF0;先把溢出标志位清零
SETB TR0;开端计时
SETB EA;大局中止翻开
SETB ET0;守时器/计数器T0溢出中止翻开
MOVR2,#00H;作为守时器累加器运用
LOOP:SJMP LOOP;在此循环,等候中止
INT_TIMER0:;当TF0=1,跳转到下面的中止服务程序中
INCR2;使R2自增一
CLRTF0;从头置中止标志位为0
MOVTH0,#(65536-COUNT)/256; 从头符初值(由于溢出后变成0了)
MOVTL0,#255
CJNE R2,#5,RETURN;让灯明暗相间50ms
MOVR2, #00H
CPLLED;让灯明暗替换改变
RETURN:
RETI
END
;程序写完了(并不是很难,不过便是装备一下守时器,在中止中写点处理程序算了
;),