楼上的,这两句只是为了测试用的,系统保存STATUS在这之前。
反复试验,删程序,删到最后只有几句了,还是不行。程序运行不到几秒钟就进入主程序中的这一句:PORTA=0X55;//asm("nop");
我全贴出大家看看
主程序:
main.c
#include "MAIN.H"
#include "INIT.H"
bit bMs_20;
bit bRB_Ok; //RB口0-3变化中断
unsigned char cRead_Portb; //RB口读取值
//下面3个变量只是为了测试用,分别在TMR0 TMR1(现在关闭了)和RB口中断中+1,为了看看经过多少次中断后出错,结果发现没有什么规律。
unsigned int ERR_TMR0=0;
unsigned char ERR_TMR1=0;
unsigned char ERR_RB=0;
unsigned char ERR_T;
//void Led_Refresh(unsigned char cType,unsigned int iNum);
//*****************************************************************************
void main(void)
{
unsigned char cTemp;
initial();
ei();
while(1)
{
ERR_T=1; //ERR_T这个变量在别的函数中根本没用
if(ERR_T>=3)
{
PORTA=0X55;//asm("nop"); //错误的进入这里
ERR_T=2;
}
ERR_T=0;
if(bMs_20)
{
bMs_20=0;
}
}
}
中断程序:
#include "MAIN.H"
//0-9,nul,H,L
const unsigned char Tab_Code[14]=
{
0X48,0X7E,0X8C,0X1C,0X3A,0X19,0X09,0X7C,0X08,0X18,0XFF,0X61,0X3D,0x43
};
void interrupt zint(void)
{
static unsigned char cHang;
static unsigned char cFlash_Time;
di();
if(T0IF&T0IE)
{
T0IF=0;
TMR0=0X0;
if(ERR_TMR0<65535)
ERR_TMR0++;
}
else if((RBIF&RBIE))
{
bRB_Ok=1;
cRead_Portb=(~PORTB)&0X0F;
RBIF=0;
//RBIE=0;
if(ERR_RB<255)
ERR_RB++;
}
ei();
}
初始化程序:
#include "MAIN.H"
void initial(void)
{
OPTION=0X08; //bit.7=0 PORTB弱上拉使能
//BIT.6=0 RB.INT引脚下降沿触发
//BIT.5=0(T0CS) TMR0内部时钟
//BIT.4=0(T0SE) TMR0计数脉冲信号边沿选择
//BIT.3(PSA)=0 预分频器用于TMR0
//BIT.2-BIT.0 预分频器比例1:4
// WDTCON=0x0C;
//OSCCON=0X70; //8M晶体设置
/*==================================================*/
/*输出输入端口设置*/
/*AD管脚关闭*/
ANSEL=0x0; //
ANSELH=0;
TRISA=0X08; //数码管段控
PORTA=0XFF;
// RB0-2为电机转速信号输入,RB3为脚踏开关,RB4为停止信号输出,高停止
// RB5为数码管位控,RB6 RB7为调试,RB6还输出蜂鸣器
TRISB=0X0F;
PORTB=0X1F; //RB6 RB7 --ICD
WPUB=0X0F; //RB0-RB3 按键输入弱上拉使能
//========================================================
//RB口变化中断
//========================================================
IOCB=0X0F;
RBIF=0;
RBIE=1;
//RC0、1、3 为数码管位控兼按键扫描输出,
//RC2-PWM,RC4-7按键输入
TRISC=0XF4;//
PORTC=0XF4;
//***************************************************************
//1ms定时,用于计算转速
//***************************************************************
TMR0=0;
T0IF=0;
T0IE=1;
//定时扫描,5Ms定时,利用TIME1
//***************************************************************
T1CON=0X01; //定时模式 预分频1:1
TMR1H=0XEC;
TMR1L=0X78;
TMR1IF=0; //清标识位
// TMR1IE=1; //中断使能
//==========================================
PEIE=1; //外围中断使能
}
|