我是用的单片机是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;
}
此帖出自
小平头技术问答
close_close();//LED2灭
running_close() ;//LED3灭
一周热门 更多>