89C51单片机定时计数器中断

  • 格式:doc
  • 大小:66.50 KB
  • 文档页数:37

89C51单片机定时/计数器中断 一、汇编语言 编写51单片机定时/计数中断响应程序 ORG 0000H LJMP MAIN ORG 000Bh LJMP ZD0 ORG 0040H MAIN: MOV TH0,#0d8h MOV TL0,#0e8h MOV A,#0FEh SETB EA SETB ET0 SETB TR0 SJMP $ ZD0: MOV P2,A MOV TH0,#0d8h MOV TL0,#0f0h inc r3 CJNE r3,#99D,ddd mov r3,#00h inc r4 CJNE r4,#9D,ddd mov r4,#00h RL A DDD:reti end

二、C语言编写51单片机定时/计数中断响应程序 #include"reg51.h" int ms,i,k,n,m,temp=0x01; void delay(ms) { while(ms--) for(i=0;i<120;i++); } void main() { TMOD=0x01; EA=1; ET0=1; TR0=1; while(1); } void timer0() interrupt 1 { TH0=(65536-10000-6)/256; TL0=(65536-10000-6)%256; k++; if(k==100) { k=0; m++; } if(m==8)m=0; P2=temp<给P2,不改变temp的值。 //如果改成temp=temp< }

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

定时器中断c语言解析interrupt x using y

interrupt 表示中断优先级,using表示所用工作寄存器组。 interrupt x using y 跟在interrupt 后面的x 值是中断号,就是说这个函数对应第几个中断端口,一般在51中,x对应的中断如下:

0 外部中断0 1 定时器0 2 外部中断1 3 定时器1 4 串行中断 其它的根据相应的单片机有自己的含义,实际上c在编译的时候就是把你这个函数的入口地址放到这个对应中断的跳转地址

using y 这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个 r0 -- r7寄存器,如果你的中断函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈,返回时也不会弹出来 节省代码和时间

外部中断INT0 void intsvr0(void) interrupt 0 using 1 定时/计数器T0 void timer0(void) interrupt 1 using 1 外部中断INT1 void intsvr1(void) interrupt 2 using 1 定时/计数器T1 void timer1(void) interrupt 3 using 1 串口中断 void serial0(void) interrupt4 using 1 一,中断的概念 中断:当计算机执行正常程序时,系统中出现某些急需处理的异常情况和特殊请求.

中断的执行:当CPU正在执行某一程序时,若有中断响应,则CPU转而执行中断服务程序,当中断服务程序执行完毕后,CPU自动返回原来的程序继续执行.

中断服务程序的语句写法与函数的写法完全相同,所以,中断服务程序也是函数,只在函数头部有不同(后续).

中断服务程序的执行与函数的执行不同:函数的执行是有固定位置的,是通过函数的调用来完成的;而中断服务程序的执行是不固定位置的,只要有中断响应,在一定条件下都会去响应中断,即执行中断服务程序. 二,中断源 中断源:任何引起计算机中断的事件,一般一台机器允许有许多个中断源.

8051系列单片机至少有5个可能的中断(8052有6个,其它系列成员最多可达15个).下面以5个中断源为例.

8051单片机的五个中断源是: 外部中断请求0,由INT0(P3.2)输入; 外部中断请求1,由INT1(P3.3)输入; 片内定时器/计数器0溢出中断请求; 片内定时器/计数器1溢出中断请求; 片内串行口发送/接收中断请求. 三,与中断有关的寄存器 1,定时/计数器控制寄存器TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 D7 D6 D5 D4 D3 D2 D1 D0 . IT0,IT1:外部中断0,1触发方式选择位,由软件设置; 1→下降沿触发方式,INT0/INT1管脚上高到低的负跳变可引起中断; 0→电平触发方式, INT0/INT1管脚上低电平可引起中断. . IE0,IE1:外部中断0,1请求标志位; 当外部中断0,l依据触发方式满足条件,产生中断请求时由硬件置位 (IE0/IE1=1);当CPU响应中断时由硬件清除(IE0/IE1= 0).

. TR0,TR1: 启动定时/计数器0,1. . TF0,TF1:定时器/计数器0,1(T/C0,T/C1)溢出中断请求标志; 当T/C0,1计数溢出时由硬件置位(TF0/TF1=l); 当CPU响应中断由硬件清除(TFO/TF1=0). 三,与中断有关的寄存器 2,串行口控制寄存器SCON TI RI D7 D6 D5 D4 D3 D2 D1 D0 . RI:串行口接收中断请求标志位; 当串行口接收完一帧数据后请求中断,由硬件置位(RI=1) RI必须由软件清"0". . TI:串行口发送中断请求标志位. 当串行口发送完一帧数据后请求中断,由硬件置位(TI=1) TI必须由软件清"0". 三,与中断有关的寄存器 3,中断允许寄存器IE EA ET2 ES ET1 EX1 ET0 EX0 D7 D6 D5 D4 D3 D2 D1 D0 . EX0,EX1:外部中断0,1的中断允许位; l→外部中断0,1开中断;0→外部中断0,1关中断. . ET0,ET1:定时器/计数器0,1(T/C0,T/C1)溢出中断允许位; 1→T/C0,T/Cl开中断;0→T/C0,T/Cl关中断. . ES:串行口中断允许位; 1→串行口开中断;0→串行口关中断. . ET2:定时器/计数器2(T/C2)溢出中断允许位; 1→T/C2开中断;0→T/C2关中断. . EA:CPU开/关中断控制位. 1→CPU开中断.0→CPU关中断. 8051复位时,IE被清"0",此时CPU关中断,各中断源的中断也都屏蔽 三,与中断有关的寄存器 4,中断优先级寄存器IP PS PT1 PX1 PT0 PX0 D7 D6 D5 D4 D3 D2 D1 D0 . PX0,PX1:外部中断0,1中断优先级控制位; 1→高优先级;0→低优先级. . PT0,PT1:定时器/计数器0,1中断优先级控制位; 1→高优先级;0→低优先级. . PS:串行口中断优先级控制位; 1→高优先级;0→低优先级. 8051复位时,IP被清"0",5个中断源都在同一优先级,其内部优先级的顺序从高到低为: 外部中断0(IE0)

定时器/计数器0(TF0) 外部中断1(IE1) 定时器/计数器1(TF1) 串行口中断(RI+TI) 四,中断响应 8051的CPU在每个机器周期采样各中断源的中断请求标志位,如果没有下述阻止条件,将在下一个机器周期响应被激活了的最高级中断请求:

1.CPU正在处理同级或更高级的中断; 2.现行机器周期不是所执行指令的最后一个机器周期; 3.正在执行的是RETI或是访问IE或IP的指令. CPU在中断响应后完成如下的操作: 1.硬件清除相应的中断请求标志; 2.执行一条硬件子程序,保护断点,并转向中断服务程序人口 3.结束中断时执行RETI指令,恢复断点,返回主程序. 8051的CPU在响应中断请求时,由硬件自动形成转向与该中断源对应的服务程序入口地址,这种方法为硬件向量中断法.

五,中断服务程序的入口地址 编号 中断源 人口地址 0 外部中断0 0003H 1 定时器/计数器0 000BH 2 外部中断1 0013H 3 定时器/计数器1 001BH 4 串行口中断 0023H 各中断服务程序入口地址仅间隔8个字节,编译器在这些地址放入无条件转移指令跳转到服务程序的实际地址.

六,中断服务程序的语法规则 中断服务程序的语法规则如下: 函数的返回值 函数名([参数]) interrupt n [using m] { 函数体; } 对中断程序而言,函数的返回值和参数一般为void.