中断服务子程序怎么写 使用stc12c5a60s2双串口单片机时串口2的中断服务子程序怎么写呢
- 综合知识
- 关注:1.26W次
摘录一段我写的程序供参考:;------------------相关寄存器定义------------------------AUXR EQU 8EH ;辅助寄存器AUXR1 EQU 0A2H ;辅助寄存器1CLK_DIV EQU 97H ;时钟分频器S2CON EQU 9AH ;串口2控制寄存器S2BUF EQU 9BH ;串口2数据缓冲区BRT EQU 9CH ;波特率寄存器IE2 EQU 0AFH ;中断控制寄存器2;-----------------串行初始化程序-------------------------UART_INIT: ORL PCON,#80H ;使能波特率倍速位SMOD MOV SCON,#50H ;8位数据,可变波特率 MOV S2CON,#50H ;8位数据,可变波特率 MOV BRT,#0FAH ;[email protected] ORL AUXR,#14H ;独立波特率发生器时钟为Fosc,即1T ORL IE2,#01H ;允许串口2中断 ANL AUXR,#03FH ;定时器12时钟为Fosc,即12T ANL AUXR,#0FEH ;串口1选择定时器1为波特率发生器 MOV TMOD,#21H ;设定定时器1为8位自动重装方式,0为16位定时器 MOV TL1,#0FFH ;[email protected] MOV TH1,#0FFH ;设定定时器重装值 MOV SERGET,#0 ;接收RS232 Pointer is 0 MOV SERPUT,#0 ;取值RS232 Pointer is 0 MOV RXGET,#0 ;接收RS485 Pointer is 0 MOV RXPUT,#0 ;取值RS485 Pointer is 0 CLR P4.4 ;485处于接收状态 ORL IPH,#10H ; SETB PS ;串口1中断优先级11为最高 CLR ET1 ;禁止定时器1中断 SETB TR1 ;启动定时器1 CLR BUSY RET;-----------------串行通讯2中断服务程序-------------------------SER2INT: PUSH ACC PUSH PSW MOV A,S2CON JNB ACC.0,SER2INT1 ;S2RI ANL S2CON,#NOT S2RI MOV A,S2BUF MOV B,A MOV R0,#RXRAM MOV A,RXPUT ANL A,#0FH ORL A,R0 MOV R0,A MOV A,B MOV @R0,A LCALL SENDRXDAT INC RXPUT SJMP SERINT2 SER2INT1: MOV A,S2CON JNB ACC.1,SERINT2 ;S2TI ANL S2CON,#NOT S2TI CLR BUSYSERINT2: POP PSW POP ACC RETI;-----------------串行通讯1中断服务程序-------------------------SER1INT: PUSH ACC PUSH PSW PUSH DPL PUSH DPH SETB RS0 CLR RS1 JBC RI,SERTIRI1 ;是接收中断,清除此标志,转接收 CLR TI ;是发送中断,清除此标志,中断返回 SJMP SERENDSERTIRI1: MOV A,SBUF ;接收(读入)数据 MOV B,ASERTIRI2: MOV R0,#SERRAM MOV A,SERPUT ANL A,#1FH ORL A,R0 MOV R0,A MOV A,B MOV @R0,A INC SERPUT MOV DLY03,A SETB SERBITSEREND: POP DPH POP DPL POP PSW POP ACC RETI。
2.中断服务子程序应至少包括哪些内容1、中断请求:中断事件一旦发生或者中断条件一旦构成,中断源提交“申请报告”,与请求CPU暂时放下目前的工作而转为中断源作为专项服务
2、中断屏蔽:虽然中断源提交了“申请报告”,但是,是否得到CPU的响应,还要取决于“申请报告”是否能够通过2道或者3道“关卡”(中断屏蔽)送达CPU(相应的中断屏蔽位等于1,为关卡放行;反之相应的中断屏蔽位等于0,为关卡禁止通行);
3、中断响应:如果一路放行,则CPU响应中断后,将被打断的工作断点记录下来(把断点地址保护到堆栈),挂起“不再受理其他申请报告牌”(清除全局中断标志位GIE=0),跳转到中断服务子程序
4、保护现场:在处理新任务时可能破坏原有的工作现场,所以需要对工作现场和工作环境进行适当保护;
5、调查中断源:检查“申请报告”是由哪个中断源提交的,以便作出有针对性的服务;
6、中断处理:开始对查明的中断源进行有针对性的中断服务;
7、清除标志:在处理完毕相应的任务之后,需要进行撤消登记(清除中断标志),以避免造成重复响应;
8、恢复现场:恢复前面曾经被保护起来的工作现场,以便继续执行被中断的工作;
9、中断返回:将被打断的工作断点找回来(从堆栈中恢复断点地址),并摘下“不再受理其他申请报告牌”(GIE=1),继续执行原先被打断的工作。
3.中断服务子程序和普通子程序有什么区别区别:
1、程序是否提前安排好:中断服务程序是随机的,而普通子程序是预先安排好的。
2、结束程序不同:中断服务子程序以RETI结束,而一般子程序以RET结束。
3、结束动作不同:中断服务子程序RETI除将断点弹回PC动作外,还要清除对应的中断优先标志位,以便新的中断请求能被响应。一般子程序则无此项操作。
扩展资料:
当中央处理器正在处理内部数据时,外界发生了紧急情况,要求CPU暂停当前的工作转去处理这个紧急事件。处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程称为中断。
实现这一功能的部件称为中断系统,申请CPU中断的请求源称为中断源,单片机的中断系统一般允许多个中断源,当多个中断源同时向CPU请求中断时,就存在一个中断优先权的问题。通常根据中断源的优先级别,优先处理最紧急事件的中断请求源,即最先响应级别最高的中断请求。
中断处理过程:
(1)保护被中断进程现场。为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态字PSW和程序计数器PC等的值。
(2)分析中断原因,转去执行相应的中断处理程序。在多个中断请求同时发生时,处理优先级最高的中断源发出的中断请求。
(3)恢复被中断进程的现场,CPU继续执行原来被中断的进程。
参考资料来源:百度百科-中断服务程序
4.中断服务子程序与普通子程序有哪些异同之处一、主体不同
1、中断服务子程序:是一种服务,是通过执行事先编好的某个特定的程序来完成的。
2、普通子程序:是一个大型程序中的某部份代码,由一个或多个语句块组成。
二、功能不同
1、中断服务子程序:外界发生了紧急情况,要求CPU暂停当前的工作转去处理这个紧急事件。处理完毕后,再回到原来被中断的地址,继续原来的工作。
2、普通子程序:负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。
三、特点不同
1、中断服务子程序:为了在中断处理结束后能够使进程准确地返回到中断点,系统必须保存当前处理机程序状态字PSW和程序计数器PC等的值。
2、普通子程序:常被使用在汇编语言层级上。子程序的主体是一个代码区块,当被调用时就会进入运行。
参考资料来源:百度百科-子程序
参考资料来源:百度百科-中断服务程序
5.c语言中中断服务子程序与其他子程序的区别中断是单片机的一个重要功能,中断子程序专为执行中断功能,它是在发生中断后,自动执行的,不需要主程序调用;普通子函数要主程序调用才能执行。
汇编里的区别:
普通子函数用RET返回;中断子程序用RETI返回,RETI返回时要清除中断标志的;
普通子函数调用时直接进入函数入口地址,中断函数在中断发生时先进中断入口
03H、08H、13H、18H、23H后随即写一个跳转指令,再跳转到相应语句。
C语言区别:
普通子函数用的是C语言里的主函数调用子函数的方法,子函数可以有参数,有返回值;中断函数没有参数,没有返回值;
中断函数的写法也不一样,以80c51为例:
void INT0() interrupt 0 using 1
{
}
interrupt 0不是是外部中断0引发的中断,必须写; using 1
表示在中断函数里用第一组寄存器R0-R7.这个可以省略。
6.调用中断服务程序和调用子程序有何分别1. 子程序调用一定是程序员在编写程序时事先安排好的,是可知的,而中断是由中断源根据自身的需要产生的,是不可预见的(用指令INT引起的中断除外)。
2. 子程序调用是用CALL指令来实现的,但没有调用中断的指令,只有发出中断请求的事件(指令INT是发出内部中断信号,而不要理解为调用中断服务程序);
3. 子程序的返回指令是RET,而中断服务程序的返回指令是IRET/IRETD。
4. 在通常情况下,子程序是由应用程序开发者编写的,而中断服务程序是由系统软件设计者编写的。
7.怎样写中断服务程序方法1. 用关键词interrupt和中断矢量编号定义中断函数
这种方式最简单也最直观。缺点是程序的可移植性稍差。范例如下:
void interrupt 17 sci1_Recv_ISR(void){
。.}关键词interrupt告诉编译器此函数为中断服务函数,数字17告诉连接器该中断矢量的偏移位置(以复位矢量偏移为0计)。某一个中断响应对应的矢量入口编号可以在该芯片的DataSheet中查到。
方法2. 用关键词interrupt定义中断函数,中断矢量入口由prm文件指定,仍以上面的中断服务函数为例,这时函数的定义方式为
void interrupt sci1_Recv_ISR(void){
。..}然后在项目对应的prm文件中添加一行矢量位置定义:
VECTOR 17 sci1_Recv_ISR //指定的中断服务矢量入口
方法3. 用#pragma TRAP_PROC定义中断函数,中断矢量入口由prm文件指定。此类型的函数编译器在将C代码编译成汇编指令时会在代码前后增加必要的现场保护和恢复汇编代码,同时函数的最后返回用汇编指令RTI而不是针对普通函数的RTS。例如
- 文章版权属于文章作者所有,转载请注明 https://dongkepu.com/zonghezhishi/5o9ql4.html