×
嵌入式 > 嵌入式开发 > 详情

单片机汇编中断程序(定时器中断)

发布时间:2020-09-03 发布时间:
|

 

;首相,介绍一下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

;程序写完了(并不是很难,不过就是配置一下定时器,在中断中写点处理程序罢了

;),



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM入门篇之(一)概念