使用stc12c5a60s2双串口单片机时 串口2的中断服务子程序怎么写呢?

如题所述

摘录一段我写的程序供参考:
;------------------相关寄存器定义------------------------
AUXR EQU 8EH ;辅助寄存器
AUXR1 EQU 0A2H ;辅助寄存器1
CLK_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 BUSY
SERINT2:
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 SEREND
SERTIRI1:
MOV A,SBUF ;接收(读入)数据
MOV B,A
SERTIRI2:
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 SERBIT
SEREND:
POP DPH
POP DPL
POP PSW
POP ACC
RETI追问

大哥 有c语言的吗?

追答

c语言的可以参考这芯片的数据手册,下载地址:www.stcmcu.com

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-01
应该和1方式一样,就是中断向量变为8,1串口为3,
各种寄存器有所改变,但控制方式是一样的。追问

您的意思是
void ser() interrupt 8
{ };

追答

中断就是8号中断,设置好波特率和中断使能等
然后在此函数中进行操作就行了,手册有例子的