我用PIC16F877A单片机和SIM900A通讯模块写的接收中断的程序,想知道为什么接收中断程序只能进去一次,每一次进入接收中断程序,用灯的闪亮进行表示。
#include <pic.h> //调用PIC16F87XA单片机的头文件
//根据选项,配置字应该如下所示:
__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();
}
}
}
|