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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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 ;57600bps@11.0592MHz
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 ;57600bps@11.0592MHz
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

参考技术A 应该和1方式一样,就是中断向量变为8,1串口为3,
各种寄存器有所改变,但控制方式是一样的。追问

您的意思是
void ser() interrupt 8

追答

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

基于单片机双路温度检测报警系统设计(串口上位机控制)

基于pcf8591 tlc2543的双路温度检测报警系统 带串口上位机控制带仿真 源程序
温度传感器是 LM35
两路测温通道所用的ad芯片分别是pcf8591 和 tlc2543
仿真开始运行后  串口助手发a 启动pcf那路的测量 并显示在6位一体数码管
串口助手发b 启动tlc那路的测量 并显示在6位一体数码管
当tlc那路温度超过100摄氏度 蜂鸣器报警 并且上位机收到error!字符串
pcf那路测温范围0-150摄氏度
tlc那路测温0-120摄氏度 数码管显示到小数点后一位

注意 运行仿真前要把两个lm35的初始温度设置为150摄氏度和30摄氏度 否则会抱错 什么real time simulation failed
上面的lm35初始温度设置为150摄氏度 下面的设置为30摄氏度

  【资源下载】下载地址:点击下载(1628) 百度网盘

#include "tlc2543.h"
#include "uart.h"



#define TIME_PERIOD 300
unsigned char DSY_BUFF_CODE[16] = 0xc0,0xf9,0xa4,0xb0,
					0x99,0x92,0x82,0xf8,
					0x80,0x90,0x88,0x83,
					0xc6,0xa1,0x86,0x8e;
unsigned char txt[] = "Error!";
sbit seg1 = P2^2;
sbit seg2 = P2^3;
sbit seg3 = P2^4;
sbit seg4 = P2^5;
sbit seg5 = P2^6;

sbit bell = P3^7;  //pcf8591那路温度超过100摄氏度 报警
sbit led = P3^6;   //pcf8591那路温度超过100摄氏度 闪灯
void timer_init();
unsigned int read_tmp();

unsigned int temp_pcf8591,temp_tlc2543;
bit flag;

 



void main()

代码省略

 

以上是关于使用stc12c5a60s2双串口单片机时 串口2的中断服务子程序怎么写呢?的主要内容,如果未能解决你的问题,请参考以下文章

STC12C5A60S2 12M 红外发射

stc12c5a60s2 51单片机区别

开源STC12C5A60S2开发板

用STC12C5A60S2单片机做矩阵键盘

stc12c5a60s2的单片机与at89c51单片机有啥区别论文上面要用

烧录STC12C5A60S2时遇到的问题