用过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);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
surf_131
1楼-- · 2020-02-09 13:41
 精彩回答 2  元偷偷看……
251566208
2楼-- · 2020-02-09 19:26
回复【楼主位】DSP_2812
-----------------------------------------------------------------------

问题解决了吗?如果没有可以加QQ:251566208,从事PIC技术支持8年之久
DSP_2812
3楼-- · 2020-02-09 23:24
回复【1楼】surf_131
在中断处理程序里面添加led闪烁标志,看是否没有进入中断。若没进入,则是tmr0设置有问题,应仔细查手册。若是进入中断没有实现逻辑功能,则要对整个中断处理程序的流程进行分析,将led标志放进各个分支来检查。特别是自己设立的计数的变量,看看系统停止运行时数值有否变化。
若是长时间计时,最好硬件上采用ds1302之类实时时钟。计时准,可靠性也高。
-----------------------------------------------------------------------

加了LED,没有进入中断,检查了好长时间都没解决
surf_131
4楼-- · 2020-02-10 04:12
将中断处理后面的所有内容都处理成为“注释”,即用/*  ....... */分隔所有语句。

在debug模式下随意打开和停止程序,用watch查看tmr0,看看数值有没有变化,即定时器是否在走。

在主程序里面设置条件分支语句,if (T0IF==1) LED^=1;
这样能够发现T0IF是否置位。

有了这些前置的措施,再来看中断处理程序能否进入,将LED标志放进中断处理程序。一般情况下,这个中断会进入的。然后再逐步将各个键读入打开,开一部分测一部分。
millwood0
5楼-- · 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.
DSP_2812
6楼-- · 2020-02-10 12:34
 精彩回答 2  元偷偷看……

一周热门 更多>