打印

求助:快疯了,我的程序出现这样的情况,谢谢!

[复制链接]
1625|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
星星电灯|  楼主 | 2007-6-22 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//-------------------------------------头文件--------------------------------------
#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 熄灭了

应该第一次就可以使其真正熄灭啊?

我的程序是哪里错了啊?

谢谢!

相关帖子

沙发
星星电灯|  楼主 | 2007-6-22 22:47 | 只看该作者

为什么这样改就可以啊?

//----------------------------------开始游戏-------------------------------------------
//功能:完成真正控制过程
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;     
}
//--------------------------------------喂狗中断程序----------------------------------



为什么这样就可以呢?
他们没有什么区别啊?
谢谢!

使用特权

评论回复
板凳
dai_weis| | 2007-6-23 09:02 | 只看该作者

试试原来程序关狗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

74

主题

121

帖子

1

粉丝