pic16f877a系列单片机串口接收中断屏蔽后,若外部有串口数据不断的发入,单片机会溢出出错吗!

如题所述

各种通讯界面, 都会有溢出出错问题. 硬件设计上, 会提供Register状态判断, 以及错误处理控制bit, 如内部串口模块的reset. 实际如何处置, 需要详阅datasheet.
溢出出错是否要处理, 依据需求而定, 如果你根本不需要串口(屏蔽), 不去处理溢出出错也没关系. 如果还需要使用串口, 应该要注意如何将单片机的串口模块, 从恢复错误状态中恢复.
在基本的设计逻辑上, 会建议系统的规划, 应避免去屏蔽任何一个你需要的中断源. 当然, 如果你很清楚自己在做什麼, 有特殊考量, 也不是不可以的.
ps. 部分单片机的内部模块, 具备各自独立的电源控制, 如不需要, 也可以考虑关闭其电源. 在电池系统中, 这部分会比较注意. (模块没有电源, 有没有持续输入就无差别, 启动时同reset)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-06-02
_CONFIG(HS&WDTDIS&LVPDIS);

bank1 unsigned char b[20]; //数据缓存区,用于存放手机号
unsigned char sflag;

void delay_sms(unsigned char n) //延时程序
{
unsigned int d=1000;
for(;n>0;n--)
{
d=1000;
do{;}while(--d);
}
}
void delay(unsigned int n)
{
unsigned int j;
char k;
for(j=0;j<n;j++)
for(k=2;k>0;k--) NOP();
}
void delay_int(unsigned int n)
{
unsigned int j;
char k;
for(j=0;j<n;j++)
for(k=246;k>0;k--)NOP();
}

void USART_RC_init() //接收SIM900A的手机号初始设置
{
SPBRG=25; //高速模式 波特率9600 4M晶振
TXSTA=0X24;
RCSTA=0X90;
RC6=0X0; //RC6为输出端口TX
RC7=0X1; //RC7为输入端口RX
RCIE=1; //串行接收中断使能
PEIE=1; //外设中断允许,TMR2属于外设中断范围

GIE=1; //开全局中断
}

void interrupt ISR(void) //PIC单片机的所有中断都是这一个入口
{
//***此处用户自行添加定时器中断处理程序***

if(RCIF&&RCIE)
{
unsigned char i=0;
while(i<20)
{
b[i++]=RCREG; //读接收数据,实际上会自动将RCIF清0
delay(51);
}

//RCIF=0;该语句起不到跳出中断的作用

//去掉a的判断条件后,RCIF才能自动清零,否则不断循环,中断出不去

RC1=1;
delay_int(500);
RC1=0;
sflag=1;
//RCIE=0;//跳出判断语句RCIF&&RCIE,注释掉该句话后,灯不再闪两下

}
RC2=1;
delay_int(500);
RC2=0;
}

void main(void) //主函数,单片机开机后就是从这个函数开始运行
{
TRISC=0B11111000; //初始化RC0的输出
RC0=0;
RC1=0;
RC2=0;
USART_RC_init(); //接收SIM900A的手机号初始设置

while(1) //死循环,单片机初始化后,将一直运行这个死循环
{

if(sflag==1)
{
RC0=1;
delay_int(500);
RC0=0;
sflag=0;
//RCIF=0;
//RCIE=1;
USART_RC_init();
}

}
}