用过PIC的大哥们帮下忙,看下这个程序问题,单片机位PIC16F684,进不去中断。。。。

2020-02-09 09:23发布

#include<htc.h>
__CONFIG(INTIO);
//系统初始化 端口输入输出,定时器等
void init()
{
//关闭中断
GIE=0;
T0IE=0;
//输入端口配置
TRISA2=1; //ON
TRISA5=1;//OFF
TRISC0=1;//AUTO
TRISC1=1;//2H
TRISC2=1;//4H
TRISC3=1;//6H
TRISC4=1;//8H
TRISA4=1;//感光
//输出端口配置
TRISC5=0;//CONTROL 继电器输出;
CMCON0=7;
ANSEL=0x00;
//配置TIMER0;
OPTION=0xc7;//T0位定时器模式,启用预分频器1:256;
TMR0=0;
//开启定时器 开启中断;
T0IE=1;
PEIE=1;
GIE=1;
}
//T0中断服务程序
int tick_count=0;
int light_detect_count=0;
unsigned int delay_countl=0;
unsigned int delay_counth=0;
unsigned char func=0x3; //当前扫描时刻的功能输入 最后两位无效
unsigned char func_pre=0x03;//前一个扫描时刻的功能输入
bit light_status;//光状态
bit light_status_pre;//光的前一状态
bit light_change=0;//光变化标志
bit auto_flag=0;//自动开关标志

int onlight_delay=0;
bit delay_flag=0;

void interrupt tc_int()
{        RC5=1;
        if (T0IE && T0IF) //T0中断处理
        {       
                T0IF=0;
                //处理旋钮
                tick_count++;
                if(tick_count==15) //约为1s
                {
                       
                        tick_count=0;
                        func=RA2<<7 | RA5<<6 | RC0<<5 | RC1<<4 | RC2<<3 | RC3<<2 | RC4<<1;
                        if(func^func_pre)//当前功能变化
                        {
                                switch(func)
                                {
                                        case 0b01111111 :    light_detect_count=0;auto_flag=0;RC5=1; break;//
                                        case 0b10111111 :    light_detect_count=0;auto_flag=0;RC5=0;break;//
                                        case 0b11011111 :    auto_flag=1;delay_flag=0;break;//
                                        case 0b11101111 :    auto_flag=1;delay_flag=1;onlight_delay=2;delay_countl=0;delay_counth=0;break;//
                                        case 0b11110111 :    auto_flag=1;delay_flag=1;onlight_delay=4;delay_countl=0;delay_counth=0;break;//
                                        case 0b11111011 :    auto_flag=1;delay_flag=1;onlight_delay=6;delay_countl=0;delay_counth=0;break;//
                                        case 0b11111101 :    auto_flag=1;delay_flag=1;onlight_delay=8;delay_countl=0;delay_counth=0;break;//
                                        default : break;
                                }
                        }//if(func^func_pre)
                        func_pre=func;
                }//if(tick_count==15)

                //处理光传感器
                if(auto_flag==1)
                {
                        light_detect_count++;
                        if(light_detect_count==70) //约为15s
                        {
                                light_detect_count=0;
                                light_status=RA5;
                                if(light_status^light_status_pre)//光发生变化 即当前光状态不等于前15S的光状态
                                {
                                        light_change=1;                       
                                }
                                else
                                {
                                        if(light_change==1)//延迟15s后确定光状态产生变化
                                        {
                                                light_change=0;
                                                if(light_status==0)//当前环境黑暗 应打开电源
                                                {
                                                        RC5=1;       
                                                        delay_countl=0;
                                                        delay_counth=0;
                                                }
                                                else//当前环境明亮 应切断电源
                                                {
                                                        RC5=0;       
                                                }
                                        }//if(light_change==1)
                                }//else//if(light_status^light_status_pre)
                        }//if(light_detect_count==225) //约为15s
                        if(delay_flag==1&&light_status==0)//接通延时
                        {
                                delay_countl ++;
                                if(delay_countl==39062)//39062 是10s
                                {
                                        delay_countl=0;
                                        delay_counth++;
                                        if(delay_counth==360*onlight_delay)//定时时间到
                                        {
                                                delay_counth=0;
                                                RC5=0;//关闭电源
                                        }
                                }       
                        }       
                }//if(auto_flag==1)

        }//if (T0IE && T0IF)        
}


int main()
{
init() ;
func_pre=10111111;//要读取当前的环境 包括旋钮和光
RC5=0;
light_status_pre=0;       
while(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
millwood0
2020-02-10 08:19
"__CONFIG(INTIO); "

make sure that you set the right configuration bits - read the datasheet and header file for sure.

As configured, your WDT is on.

I typically use

__CONFIG(MCLRDIS & BORDIS & WDTDIS & PWRTEN & INTIO);

again, read the @#%@#%@ datasheet.

一周热门 更多>