keil编译无误,把程序烧到单片机上后,不满足else if((P2&0x0D)==9)这个条件也会执行相应语句
#include "C8051F020.h"
/*
P20控制直行,P22控制左行,P23控制右行
*/
void Delay()
{
int i,j;
for(i=1000;i>0;i--)
for(j=1000;j>0;j--)
;
}
void Reset_Sources_Init()
{
WDTCN = 0xDE; //关看门狗
WDTCN = 0xAD;
}
void Timer_Init() //定时器08位重装载
{ //选择系统时钟
CKCON = 0x08;
TCON = 0x10;
TMOD = 0x02;
TL0 = 0x0FA;
TH0 = 0x0FA;
}
void PCA_Init()
{
PCA0CN = 0x40; //使能
PCA0MD = 0x04; //选择系统时钟
PCA0CPM0 = 0x42; //选择8位pwm
PCA0CPH0 = 0x80; //占空比
PCA0CPM1 =0x42; //选择8位pwm
PCA0CPH1 =0x80; //占空比
}
void Port_IO_Init()
{
XBR0 = 0x10; //Cex0, Cex1连到P0.0,P0.1
XBR2 = 0x40; //交叉开关使能
P0MDOUT = 0x03; //P0.0,P0.1推挽输出
P2MDOUT = 0x00;
}
void Oscillator_Init()
{
int i=0;
OSCXCN=0x67;
for(i=0;i<3000;i++);
}
void Init_Device(void)
{
Reset_Sources_Init();
Timer_Init();
PCA_Init();
Port_IO_Init();
Oscillator_Init();
}
void main()
{
P2=0xFD; //P21一直是低电平,没用了,用P20,P22,P23这三个脚 Init_Device(); while(1)
{
if(((P2&0x0D)==12)||((P2&0x0D)==13))
{
PCA0CPH0 =0x80;
PCA0CPH1 =0x80;
P2=0xFD;
// Delay();
}
else if((P2&0x0D)==8)
{
PCA0CPH0 =0x60;
PCA0CPH1 =0x0D0;
P2=0xFD;
Delay();
}
else if((P2&0x0D)==9) //大幅左转
{
PCA0CPH0 =0x0D0;
PCA0CPH1 =0x0D0;
P2=0xFD;
Delay();
}
else if((P2&0x0D)==4)
{
PCA0CPH0 =0x0D0;
PCA0CPH1 =0x60;
P2=0xFD;
Delay();
}
else if((P2&0x0D)==5) //大幅右转
{
PCA0CPH0 =0x0D0;
PCA0CPH1 =0x40;
P2=0xFD;
Delay();
}
else
{
PCA0CPH0 =0x80;
PCA0CPH1 =0x80;
P2=0xFD;
// Delay();
}
}
}
单步调试的时候没发现问题,但是一经烧到单片机后,刚运行时符合预期,但过一小会儿就不符合预期了,后来十分确定的发现是跑到else if((P2&0x0D)==9)里面去了,我就纳闷了,不符合条件这么会进到这条else if语句里去呢?