pic16f877a系列单片机串口接收中断屏蔽后,若外部有串口数据不断的发入,单片机会溢出出错吗!
发布网友
发布时间:2022-05-05 06:51
我来回答
共2个回答
热心网友
时间:2023-10-13 21:08
各种通讯界面, 都会有溢出出错问题. 硬件设计上, 会提供Register状态判断, 以及错误处理控制bit, 如内部串口模块的reset. 实际如何处置, 需要详阅datasheet.
溢出出错是否要处理, 依据需求而定, 如果你根本不需要串口(屏蔽), 不去处理溢出出错也没关系. 如果还需要使用串口, 应该要注意如何将单片机的串口模块, 从恢复错误状态中恢复.
在基本的设计逻辑上, 会建议系统的规划, 应避免去屏蔽任何一个你需要的中断源. 当然, 如果你很清楚自己在做什麼, 有特殊考量, 也不是不可以的.
ps. 部分单片机的内部模块, 具备各自独立的电源控制, 如不需要, 也可以考虑关闭其电源. 在电池系统中, 这部分会比较注意. (模块没有电源, 有没有持续输入就无差别, 启动时同reset)
热心网友
时间:2023-10-13 21:08
_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();
}
}
}