PIC16F767唤不醒

2020-02-08 09:25发布

求助:程序现在PIC16F877A上试过,可以唤醒,现在写到PIC16F767中,只是改成了内部晶振,其他基本没变,就是唤不醒,求助各位PIC高手是什么原因
程序如下:

//#include <pic1687x.h>
#include <htc.h>

#define uint8 unsigned char
#define uint16 unsigned int

//__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
__CONFIG(WDTDIS & INTIO & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset

#define                OnOff                RB6                                                        //电源开关输入,掉电唤醒
#define                KeyUp                RB5                                                        //+键,掉电唤醒
#define                KeyDown                RB4                                                        //-键,掉电唤醒
#define                KeyOk                RB0                                                        //确定键,掉电唤醒
#define                TestPort        RC4
/*******************************************************************************
* 函 数 名: DelayMS(uint16 delay)
* 函数功能: 毫秒延时        for20MHZ
* 入口参数: delay
* 返    回: 无
*******************************************************************************/

void DelayMS(uint16 delay)
{
    uint16 i;
    for(;delay>0;delay--)
        for(i=0;i<453;i++);
}

/*******************************************************************************
* 函 数 名: main()
* 函数功能: 跑马灯
*******************************************************************************/
void main()
{       
        uint16 i;
        GIE=0;                                                                                         //全局中断禁止,只执行唤醒功能
        OSCCON=0x48;                                                                        //内部 RC 振荡器频率,1M,器件使用系统主时钟OSCCON=0x4a;
       
        //外部中断INT唤醒代码
        TRISB0=1;                                                                                //设置为输入模式
        INTEDG=0;                                                                                //下降沿中断
        //INTF=0;                                                                                        //确保在有效中断发生前中断标志位0
        INT0IF=0;
        //INTE=1;                                                                                        //允许RB0/INT中断响应
        INT0IE=1;
       
        //PORTB 口“电平变化中断”初始化
        TRISB =0xf1;                                                                         //设置相应口的输入输出方式
        RBPU=0;                                                                                        //RB口弱上拉有效
        RBIF=0;                                                                                 //清除B 口电平变化中断标志
        RBIE=1;                                                                                 //B口变位中断允许
        PORTB=PORTB;                                                                         //读B 口的值,以锁存旧值,为变位中断创造条件
       
        //CCP1模块捕捉模式唤醒设置
        TRISC2=1;                                                                                //设置为输入模式
        CCP1CON=0x04;                                                                        //捕捉模式,每一个脉冲下降沿捕捉一次
       
        //CCP2模块捕捉模式唤醒设置
        TRISC1=1;                                                                                //设置为输入模式
        CCP2CON=0x04;                                                                        //捕捉模式,每一个脉冲下降沿捕捉一次
       
        PEIE = 1;                                                                                //开外设中断
       
        TRISC = 0x00;                //设置PORTD为输出
        while(1)
        {
                for(i=0;i<1000;i++)TestPort=!TestPort;
                DelayMS(100);
                //INTF=0;
                INT0IF=0;
                RBIF=0;                                                                                 //清除B 口电平变化中断标志
                //INTE=1;                                                                                        //允许RB0/INT中断响应
                INT0IE=1;
                RBIE=1;                                                                                 //B口变位中断允许
                PORTB=0x00;
                PORTB=PORTB;                                                                         //读B 口的值,以锁存旧值,为变位中断创造条件
                CCP1IF=0;
                CCP1IE=1;
                CCP2IF=0;
                CCP2IE=1;
                SLEEP();                                                                                //单片机开始进入休眠状态
                NOP();
                TRISB0=1;                                                                                //设置为输入模式
                INTEDG=0;                                                                                //下降沿中断
                if(INT0IF)
                {
                        //INTE=0;
                        //INTF=0;
                        INT0IE=0;
                        INT0IF=0;
                        PORTC=0x01;
                }
                if(RBIF)
                {
                        RBIE=0;
                        if(KeyDown==0)
                        {
                                PORTC=0x02;       
                        }
                        else if(KeyUp==0)
                        {
                                PORTC=0x04;
                        }
                        PORTB=PORTB;
                        RBIF=0;                                                                                 //清除B 口电平变化中断标志
                }
                if(CCP1IF)
                {
                        CCP1IE=0;
                        CCP1IF=0;
                        PORTC=0x08;
                }
                if(CCP2IF)
                {
                        CCP2IE=0;
                        CCP2IF=0;
                        PORTC=0x10;
                }
                DelayMS(5000);
        }       
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
LIANFAXU
1楼-- · 2020-02-08 10:51
难道是内部晶振不行?我手头只有PIC16F877A的开发板,没法试验内部晶振
yklstudent
2楼-- · 2020-02-08 12:11
 精彩回答 2  元偷偷看……
wangjiati
3楼-- · 2020-02-08 15:11
没时间仔细看. 刚刚想想一步一步的跑一下看看.  发现 没装编译器. 给他调 {MOD}了一下 各位先给他看看吧..


//#include <pic1687x.h>
#include <htc.h>

#define uint8 unsigned char
#define uint16 unsigned int

//__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位
__CONFIG(WDTDIS & INTIO & PWRTDIS & BORDIS);//设置配置位
//WDTDIS:disable watchdog timer
//LVPDIS:low voltage programming disabled
//HS:high speed crystal/resonator
//PWRTDIS:disable power up timer
//BORDIS:disable brown out reset

#define OnOff RB6 //电源开关输入,掉电唤醒
#define KeyUp RB5 //+键,掉电唤醒
#define KeyDown RB4 //-键,掉电唤醒
#define KeyOk RB0 //确定键,掉电唤醒
#define TestPort RC4
/*******************************************************************************
* 函 数 名: DelayMS(uint16 delay)
* 函数功能: 毫秒延时 for20MHZ
* 入口参数: delay
* 返    回: 无
*******************************************************************************/


void
DelayMS(uint16 delay)
{

    uint16 i;
    for
(;delay>0;delay--)
        for
(i=0;i<453;i++);
}


/*******************************************************************************
* 函 数 名: main()
* 函数功能: 跑马灯
*******************************************************************************/

void
main()
{

    uint16 i;
    GIE=0;  //全局中断禁止,只执行唤醒功能
    OSCCON=0x48; //内部 RC 振荡器频率,1M,器件使用系统主时钟OSCCON=0x4a;

    //外部中断INT唤醒代码
    TRISB0=1; //设置为输入模式
    INTEDG=0; //下降沿中断
    //INTF=0; //确保在有效中断发生前中断标志位0
    INT0IF=0;
    //INTE=1; //允许RB0/INT中断响应
    INT0IE=1;

    //PORTB 口“电平变化中断”初始化
    TRISB =0xf1;  //设置相应口的输入输出方式
    RBPU=0; //RB口弱上拉有效
    RBIF=0;  //清除B 口电平变化中断标志
    RBIE=1;  //B口变位中断允许  
    PORTB=PORTB;  //读B 口的值,以锁存旧值,为变位中断创造条件
   
    //CCP1模块捕捉模式唤醒设置
    TRISC2=1; //设置为输入模式
    CCP1CON=0x04; //捕捉模式,每一个脉冲下降沿捕捉一次

    //CCP2模块捕捉模式唤醒设置
    TRISC1=1; //设置为输入模式
    CCP2CON=0x04; //捕捉模式,每一个脉冲下降沿捕捉一次

    PEIE = 1; //开外设中断

    TRISC = 0x00; //设置PORTD为输出
    while(1)
    {

        for
(i=0;i<1000;i++)TestPort=!TestPort;
            DelayMS(100);
            //INTF=0;
        INT0IF=0;
        RBIF=0;  //清除B 口电平变化中断标志
        //INTE=1; //允许RB0/INT中断响应
        INT0IE=1;
        RBIE=1;  //B口变位中断允许  
        PORTB=0x00;
        PORTB=PORTB;  //读B 口的值,以锁存旧值,为变位中断创造条件
        CCP1IF=0;
        CCP1IE=1;
        CCP2IF=0;
        CCP2IE=1;
        SLEEP(); //单片机开始进入休眠状态                 
        NOP();
        TRISB0=1; //设置为输入模式
        INTEDG=0; //下降沿中断
        if(INT0IF)
        {

            //INTE=0;
            //INTF=0;
            INT0IE=0;
            INT0IF=0;
            PORTC=0x01;
        }

        if
(RBIF)
        {

            RBIE=0;
            if
(KeyDown==0)
            {

                PORTC=0x02;
            }

            else if
(KeyUp==0)
            {

                PORTC=0x04;
            }

            PORTB=PORTB;
            RBIF=0;  //清除B 口电平变化中断标志
        }
        if
(CCP1IF)
        {

            CCP1IE=0;
            CCP1IF=0;
            PORTC=0x08;
        }

        if
(CCP2IF)
        {

            CCP2IE=0;
            CCP2IF=0;
            PORTC=0x10;
        }

        DelayMS(5000<font color="#000000">);
    }
}
szxszx
4楼-- · 2020-02-08 18:05
PIC16F767上电复位默认RB5、4、3、2、1、0配置为A/D端口,需对ADCON1初始化相应端口为数字端口。

(原文件名:未命名.JPG)
LIANFAXU
5楼-- · 2020-02-08 21:40
问题已经解决,原因就是没有对ADCON1进行初始化。非常感谢各位热心的师傅
xuyishark
6楼-- · 2020-02-09 00:58
支持

一周热门 更多>