|
配料机控制系统源程序讲解(2)-中断服务程序
前面我们讲过,在这个程序里用到了一个定时器的中断程序,它主要是完成搅拌主机轴端的定时注油,是当整个搅拌站处于工作时,无论控制系统处于那那种工作状态,都要在事先设计好的时间上启动注油泵完成规定时间的注油,以保证轴端有足够的油压。启动注油是随机性的,不是程序在运行到某个状态下才开始的,因此使用中断比较合适。对于初学者可能对中断理解不是很深,其实中断就是当某个中断源启动中断后,不管程序指针现在什么地方,它都会立既跳转到中断源所指定的地址去执行,也就是说中断就是地址指针的跳转,但它所跳到的地址是芯片在设计时就定下的。这就有一个麻烦,如果一旦执行中断程序,那原来的程序运行不就被乱了吗,确实是这样,为了不至这样在程序上必须采取办法,以保证程序在执行完中断程序后能够继续按原来程序执行。这就是所说的保护现场和恢复现场。
保护现场是在中断服务程序的开始地方,要将要使用到的比如累加器,标志位,寄存器,某些内存数据压入堆栈来保存,具体保存哪些,要根据中断服务程序要用到哪些来决定,凡是中断和别的程序共用的最好都保存起来为好。下面就是这段中断服务程序。
T0INT: PUSH ACC ;保护现场开始,累加器ACC压入堆栈 PUSH B ;寄存器B压入堆栈 PUSH PSW;标志位压入堆栈 PUSH DPH;地址高位指针压入堆栈 PUSH DPL;地址低位指针压入堆栈 MOV IE,#00H;中断服务开始 CLR TR0;清中断寄存器 CLR TF0;清中断标志位 INC 40H;以下为完成指定工作的程序,主要是启动注油和时间到停止注油 MOV A,40H CJNE A,#0F9H,RETIT0 INC 41H MOV 40H,#00H MOV A,41H CJNE A,3CH,RETIT0 MOV 40H,#00H MOV 41H,#00H CPL 09H MOV C,09H MOV A,#0FFH MOV ACC.5,C MOV DPTR,#0BFF2H MOVX @DPTR,A JB 09H,RETIT1 MOV 3CH,3AH AJMP RETIT0 RETIT1: MOV 3CH,3BH RETIT0: MOV TH0,#00H MOV TL0,#00H MOV IE,#82H SETB TR0;以下两行是开中断,为新的中断启动 SETB IE0 POP DPL ;地址低位指针弹出堆栈,出栈和入站顺序正好相反 POP DPH;地址高位指针弹出堆栈 POP PSW;标志位弹出堆栈 POP B;寄存器B弹出堆栈 POP ACC;保护现场开始,累加器ACC弹出堆栈 RETI;中断结束返回
|