打印
[PIC®/AVR®/dsPIC®产品]

关于PIC16F877A单片机接收中断的问题

[复制链接]
1758|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mrnapkin|  楼主 | 2015-2-3 19:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用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();
                                }
                          
    }
}
沙发
yklstudent| | 2015-2-3 21:14 | 只看该作者
多看看别人的中断程序怎么写的,才会有进步

使用特权

评论回复
板凳
pcbkey| | 2015-2-4 11:21 | 只看该作者
我只是菜鸟,学习,学习,再学习!
我的所有回复,都建立在个人浅薄的知识上,如有错误,实属正常。

使用特权

评论回复
地板
sevenjul| | 2015-2-6 10:58 | 只看该作者
初始化为什么要放在死循环里????
中断中为什么要用死延时????
楼主,程序结构,,,哎!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝