//-------------------------------------头文件-------------------------------------- #include <reg52.h> #include <absacc.h> #include <intrins.h> //-------------------------------------头文件--------------------------------------
//----------------------------看门狗----------------------------------- sbit Watch_Dog = P3^4; //----------------------------看门狗-----------------------------------
sbit U2_select = P1^0; //U2 被选择 sbit U3_select = P1^1; //U3 被选择 sbit Game_Gate_8 =P0^7; //第 8 关 sbit Tou_Coin = P0^0; //接收外部信号
//--------------------------------------定义数据地址------------------------------ #define uchar8 unsigned char uchar8 xdata DainJ_control _at_ 0xf7ff ; //用来控制 LED //--------------------------------------定义数据地址------------------------------
int WDogZdJs; //喂狗中断计数 int RunGame; //正在控制中的标志置 1 int StartGameFlag ; //开始控制标志置 1 int Game_Gate_Over;
//---------------------------------延时----------------------------------------- //功能:延时 void Delaytimes(int i, int j) //延时 { int k,m; for (k = 0; k < i; k++) { for (m = 0; m < j; m++) { ; } } } //---------------------------------延时-----------------------------------------
//----------------------------------开始游戏------------------------------------------- //功能:完成真正控制过程 void StartGame() //开始控制 { Delaytimes(400,400); //大约延时 1 m DainJ_control = 0xf7; //电机上转 while(1) //进入控制循环,在这里面检测标志 { if (Game_Gate_Over) //说明精灵已经碰上障碍了 { //DainJ_control = 0xff; break; } }//进入控制循环,在这里面检测标志 } //----------------------------------开始游戏-------------------------------------------
//--------------------------------------喂狗中断程序---------------------------------- void timer0(void) interrupt 1 //喂狗中断程序 { TH0 = 0xdc; //预置计数初值,每 25 ms 中断一次 TL0 = 0x00; WDogZdJs ++; if ( WDogZdJs >= 4 ) { Watch_Dog =! Watch_Dog; //不断喂狗 WDogZdJs = 0; } U2_select = 0; if (Tou_Coin == 0) { U2_select = 1; RunGame = 1; //正在控制中的标志置 1 StartGameFlag = 1; //开始控制标志置 1 } U2_select = 1; U3_select = 0; if (Game_Gate_8==0) { U3_select = 1; DainJ_control = 0xff; //熄灭一个 LED Game_Gate_Over = 1; } U3_select = 1; } //--------------------------------------喂狗中断程序----------------------------------
//-------------------------------------主程序----------------------------------------- void main() { Delaytimes(200,200); //大约延时 50 ms Watch_Dog =! Watch_Dog; //不断喂狗 P0 = 0xff; P1 = 0xff; P2 = 0xff; P3 = 0xff; TMOD = 0x01; //T/C0 工作在定时期器 1 TH0 = 0xdc; //预置计数初值,每 25 ms 中断一次 TL0 = 0x00; EA = 1; //CPU 开中断 ET0 = 1; //T/C0 开中断 TR0 = 1; Delaytimes(200,200); ////大约延时 50 ms RunGame = 0; //正在控制中的标志置 0 StartGameFlag = 0; //DainJ_control = 0xf7; //点亮 一个 LED while(1) // { if ((RunGame==1) && (StartGameFlag==1)) //开始控制 { StartGameFlag= 0; RunGame = 0; StartGame(); } } } //-------------------------------------主程序---------------------------------------
我首先 使 Tou_Coin 为低 ,使进入 StartGame() 此时 LED 点亮了。
然后我使 Game_Gate_8 为低,想熄灭 LED ,退出控制循环
现在出现的现象是: LED 熄灭了一下,然后又亮了,
然后再使 Game_Gate_8 为低 ,则把 LED 熄灭了
应该第一次就可以使其真正熄灭啊?
我的程序是哪里错了啊?
谢谢!
|