关于串口中断接收影响主循环的问题

2019-03-25 19:17发布

我是用的单片机是PIC18F46K80,编译环境是MPLAB C18 V3.41,MPLAB IDE V8.92。
我是用串口助手给单片机发信息,每次发送7个字节,每隔20ms或者100ms或者200ms,串口接收使用数组存储。
我的主循环里我使用switch(与串口接收的数据无关),异常出现了,主循环里不受switch控制,case里随便进。
有没有人遇到过这种情况,请给指点一下!!部分代码如下:
#include<p18f46k80.h>
#include<include.h>
#include<init_pic.h>

#pragma  config FOSC=HS1   
#pragma  config XINST=OFF
#pragma  config WDTEN=OFF
#pragma  config MCLRE=OFF
#pragma  config SOSCSEL=DIG
#pragma  config IESO=ON
#pragma  config BORV = 1
#pragma config  PLLCFG = ON

#pragma config  STVREN = OFF, BBSIZ = BB1K

#pragma config  CP0  = OFF,  CP1  = OFF,  CP2  =  OFF,  CP3  =  OFF //  CONFIG5L
#pragma config  CPB  = OFF,  CPD  = OFF //  CONFIG5H
#pragma config  WRT0  = OFF, WRT1 = OFF,  WRT2  =  OFF, WRT3  =  OFF //  CONFIG6L
#pragma config  WRTB  = OFF, WRTC = OFF,  WRTD  =  OFF //  CONFIG6H
#pragma config  EBTR0  =  OFF,  EBTR1 =  OFF,  EBTR2  =  OFF,  EBTR3  =  OFF //  CONFIG7L
#pragma config  EBTRB  =  OFF //  CONFIG7H

volatile uchar rec1_data=0,rec1_state=0,rec1_count=0,rec1_alarm=0,rec1_finish=0;
volatile uchar rec2_data=0,rec2_state=0,rec2_count=0,rec2_alarm=0,rec2_finish=0;
volatile uchar rec1_table[8]={0};                                         //串口1数组
volatile uchar rec1_table1[7]={0};                                         //串口1数组
volatile uchar rec1_table2[7]={0};                                         //串口1数组
volatile uchar rec1_table3[7]={0};                                         //串口1数组
volatile uchar rec2_table[7]={0};                                         //串口2数组

volatile uchar key_value=0,key_flag=0,key_long_flag=0,key_backup=0,key_count=0;
volatile uchar hall_state_flag=0,hall_run_flag=0;

void PIC18F_HIGH_ISR(void);                  //高级中断函数
void PIC18F_LOW_ISR(void);                   //低级中断函数


void main(void)
{
        Crystal_vibration();
        IO_init();
        delay_ms(10);
        delay_ms(50);
        usart1_init();
        usart2_init();
        time0_init();
        SEI();
        while(1)
        {
                switch(13)
                {
                        case 1:        open_open();
                                        close_close();
                                        running_close() ;
                                        key_value=0;
                                        break;
                        case 2:        open_close();
                                        close_open();
                                        running_close() ;
                                        key_value=0;
                                        break;
                        case 3:        open_close();
                                        close_close();
                                        running_open() ;
                                        key_value=0;
                                        break;
                        case 4:        open_open();
                                        close_open();
                                        running_close() ;
                                        key_value=0;
                                        break;
                        case 5:        open_open();
                                        close_close();
                                        running_open() ;
                                        key_value=0;
                                        break;
                        case 6:        open_close();
                                        close_open();
                                        running_open() ;
                                        key_value=0;
                                        break;
                        case 7:        open_open();
                                        close_open();
                                        running_open() ;
                                        key_value=0;
                                        break;
                        case 8:
                                        break;
                        case 9:
                                        break;
                        default:        break;
                }
        }
}
/************************************/
/*          中断函数                 */
/*************************************/
#pragma code high_vector_section=0x08  
void high_vector(void)
{
        _asm goto
        PIC18F_HIGH_ISR
        _endasm
}
#pragma code

#pragma code low_vector_section=0x18
void low_vector (void)
{
        _asm goto
        PIC18F_LOW_ISR
        _endasm
}
#pragma code

//---中断高优先级---//
#pragma interrupt PIC18F_HIGH_ISR
void PIC18F_HIGH_ISR()
{
        INTCONbits.GIEH=0;
/************************************************************************************************************************************************************************/
        if(1==PIR1bits.RC1IF)
        {
                PIR1bits.RC1IF=0;
         rec1_data=RCREG1;
                if(0==rec1_state)
            {
                   //rec1_finish=0;
               if(rec1_data==0xA1)
                  {
                         rec1_count=0;
                         rec1_state=1;
                         rec1_alarm=0;
                         rec1_table[rec1_count]=rec1_data;
                  }
                  else if(rec1_data==0xA2)
                  {
                         rec1_count=0;
                         rec1_state=2;
                         rec1_alarm=0;
                         rec1_table1[rec1_count]=rec1_data;
                  }
                  else if(rec1_data==0xA3)
                  {         
                         rec1_count=0;
                         rec1_state=3;
                         rec1_alarm=0;
                         rec1_table2[rec1_count]=rec1_data;
                  }
                  else if(rec1_data==0xA4)
                  {         
                     rec1_count=0;
                     rec1_state=4;
                     rec1_alarm=0;
              rec1_table3[rec1_count]=rec1_data;
                  }
                  else         
                  {
                     rec1_data=0;
                     rec1_alarm=1;
              rec1_table[0]=0;
                  }
                }
                else if(1==rec1_state)
                {
                        rec1_count++;
                        rec1_table[rec1_count]=rec1_data;
                        if(rec1_count==6)       
                        {
                                rec1_state=0;
                                rec1_count=0;
                                rec1_finish=1;
                        }
         }
                else if(2==rec1_state)
                {
                        rec1_count++;
                        rec1_table1[rec1_count]=rec1_data;
                        if(rec1_count==2)       
                        {
                                rec1_state=0;
                                rec1_count=0;
                                rec1_finish=1;
                        }
         }
                else if(3==rec1_state)
                {
                        rec1_count++;
                        rec1_table2[rec1_count]=rec1_data;
                        if(rec1_count==4)       
                        {
                                rec1_state=0;
                                rec1_count=0;
                                rec1_finish=1;
                        }
         }
         else if(4==rec1_state)
                {
                        rec1_count++;
                        rec1_table3[rec1_count]=rec1_data;
                        if(rec1_count==4)       
                        {
                                rec1_state=0;
                                rec1_count=0;
                                rec1_finish=1;
                        }
         }
                else
                {
                        rec1_alarm=1;
                        rec1_count=0;
                        rec1_state=0;
         }
        }
/*********************************************************************************************************************************************************************/
        if(1==PIR3bits.RC2IF)
        {
                PIR3bits.RC2IF=0;
                rec2_data=RCREG2;       
        }
/**********************************************************************************************************************************************************************/
        INTCONbits.GIEH=1;
}
//---中断低优先级---//
#pragma interrupt PIC18F_LOW_ISR
void PIC18F_LOW_ISR (void)
{
        INTCONbits.GIEL=0;
        if(1==INTCONbits.TMR0IF)
        {
             INTCONbits.TMR0IF=0;//清标志位

                TMR0H=37888/256;
                TMR0L=37888%256;//定时8ms 43417 定时10ms 37888 定时5ms 51712
        }          
        INTCONbits.GIEL=1;
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
shuidi_wangdan
1楼-- · 2019-03-26 01:48
open_open();//LED1亮
close_close();//LED2灭
running_close() ;//LED3
cdf777
2楼-- · 2019-03-26 04:35
switch(13)      这个括号里面应该是个变量吧

一周热门 更多>