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

关于PIC16F877A的RB端口电平变化中断用不了问题

[复制链接]
3838|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abadboy|  楼主 | 2013-11-17 10:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 abadboy 于 2013-11-17 11:54 编辑

各位老师:我现在用C语言想实现睡眠状态下,用RB0下降沿中断和RB端口的RB3-RB0电平变化中断唤醒,控制LED指示。
今天早早起来弄了一上午,RB0下降沿中断可以唤醒MCU,但RB3-RB0端口电平变化中断始终无法唤醒MCU,查不出问题所在。
请帮忙解答,谢谢!

//***********************************************************************************/
#include<pic.h>              //包含单片机内部资源预定义
__CONFIG(0x3F32);        //(芯片配置字(关闭看门狗)
#define LED_PWR RD1        //将LED_BUSY宏定义为RD1端口,输出“0”灯亮

//**************************调用串口和RB中断函数*****************
void interrupt USART_PIR(void)        
{
//**************************串口中断*****************
    if(RCIE&&RCIF) //RCIE=1接收中断允许,RCIF=1接收中断判断是否为串口接收中断
    {
        TXREG=RCREG;   //把接收到的数据发送回去
        //while (!TRMT);//TRMT为发送移位寄存器状态位,1=空,0=满(数据未发完)
        TX_UartInt();
    }
//**************************RB0外部中断*****************
    else if(INTF)     //判断是否为RB0外部中断,注意if前需要加else
        {
        INTF = 0; //INTF为RB0外部中断标志位,"1"表示外部中断有发生(必须软件清零)
        }
//**************************RB电平变化中断*****************
    else if(RBIF)     //判断是否为RB电平变化中断
        {
        RBIF = 0; //RBIF为RB电平变化中断标志位,"1"表示外部中断有发生(必须软件清零)
        }
}


//**************************调用系统初始化设置*****************
void init ()        //
{
  //**********配制输入端口***********************
  TRISB = 0x0f; //0000_1111,配制RB0-RB3为输入
  //**********配制输出端口***********************
  TRISD1 = 0;   //      配制RD1为输出,控制LED灯亮
  //**********配制串口设置***********************
  SPBRG=25;          //4M晶振SPBRG值为25对应设置的波特率为9600BPS
  TXSTA=0X24;          //使能串口发送,选择高速波特率
  RCSTA=0X90;          //使能串口工作,连续接收
  RCIE=0X1;             //使能接收中断
  GIE=0X0;              //关闭全局中断,默认0关闭全局中断
  PEIE=0X1;             //开启外部中断,默认0关闭外部中断
  INTE=1;       //RB0/INT0外部中断允许位,“1”允许RB0/INT0外部中断,默认关闭
  RBIE=1; //使能RB端口电平变化中断
  OPTION=0X00;  //选项寄存器,关闭WDT
  //bit7-bit4由各PB口上拉控制位使能+RB0下降沿中断+TIMER0选择内部时钟周期+TIMER0低到高跳变递增
  //选项寄存器bit3-bit0由预分频器分配给WDT(1)+二分这一分频(001)
}

/* 主程序*/
main ()
{
init ();   /*初始化*/
LED_PWR = 0; delay1ms(500); LED_PWR = 1;delay1ms(10);
        while(1)
         {
        SLEEP();   /*单片机开始进入休眠状态*/
        if (INTF)
        {
        TX_RB0Int();INTF = 0;   //串口打印中断标识RB0中断
        }
        else if (RBIF)
        {
        TX_RBChange();RBIF = 0;    //串口打印中断标识RB电平变化中断
        }
        LED_PWR = 0; delay1ms(200); LED_PWR = 1;delay1ms(200);  //LED工作闪烁指示
        LED_PWR = 0; delay1ms(200); LED_PWR = 1;delay1ms(200);
        LED_PWR = 0; delay1ms(200); LED_PWR = 1;delay1ms(200);
         }
}


沙发
abadboy|  楼主 | 2013-11-17 12:39 | 只看该作者
我刚看一下PIC单片机入门与实战.张明峰提到只有RB7-RB4才有电平中断功能,有份英文规格书没有仔细看

使用特权

评论回复
板凳
NE5532| | 2013-11-19 19:05 | 只看该作者
还有中断里要读一次B口,再清中断标志,这个注意事项自己在数据手册里找,不要看中文,害死人。

使用特权

评论回复
地板
abadboy|  楼主 | 2013-11-25 22:24 | 只看该作者
哦,好!

使用特权

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

本版积分规则

6

主题

15

帖子

0

粉丝