微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手求助:单片机程序出现问题如何解决

新手求助:单片机程序出现问题如何解决

时间:10-02 整理:3721RD 点击:
原程序如下:
#include <reg51.h>
#include <stdlib.h>
#define uchar unsigned char
#define TRUE 1
#define FALSE 0
//#define MAX_LENGTH 33  /* max length of snake nodess */
//#define GAME_SPEED 100   /* game speed */
#define UP 1
#define DOWN 2
#define LEFT 3
#define RIGHT 4
#define qian 5
#define hou 6
sbit KEY_UP=P2^3;    /*定义按键*/
sbit KEY_DOWN=P2^1;
sbit KEY_LEFT=P2^6;
sbit KEY_RIGHT=P2^2;
sbit KEY_qian=P2^4;
sbit KEY_hou=P2^5;
sbit START=P2^7;
unsigned char zong[8]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};  //点阵    P0=zong[k]就能让k位为高
unsigned char green[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char red[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
struct Point {       //点阵**1-1
uchar x,y,z;
};
struct Snake {
struct Point nodes[50];
uchar len;
uchar dir;
uchar live;
} snake;
struct Food {
struct Point pos;   //**1-1
uchar exist;
} food;
int lastx,lasty,lastz,keyCode,keyCode2,sp=10,l;
void init(void);    //初始化
void gamePlay(void);
void drawWall(void);
void createFood(void);
void drawFood(void);
void drawSnake(void);
uchar touchWall(void);      //碰到墙
uchar touchSelf(void);      //碰到自己
void gameOver(void);    //游戏结束
void moveSnake(void);       //移动蛇
int oppositeDirection(int keyCode);   //键盘输入方向
int foodEat(void);       //吃食物
void expandSnake(void);      //
void select(void);
uchar getKey(void);
//主函数
void delay_50us(unsigned char t)   //延迟函数
{
unsigned char j;
for(;t>0;t--)
  for(j=19;j>0;j--);
}
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--)
   ;
}
void main() {
init();
l=1;
while(l)
{
    gamePlay();
}
gameOver();
}
//随机产生食物
void createFood() {
int i;
label:
    food.pos.x=((int)rand()%8);
    food.pos.y=((int)rand()%8);
    food.pos.z=((int)rand()%8);
        
for(i=0;i<=snake.len-1;i++){
   if(snake.nodes.x==food.pos.x&&snake.nodes.y==food.pos.y&&snake.nodes.z==food.pos.z)
  goto label;
}
}
uchar getKey()     //键盘输入 消抖
{
if(!KEY_UP)
{
  delay_50us(2);
  if(!KEY_UP)
  {
   return UP;
  }  
}
if(!KEY_DOWN)
{
  delay_50us(2);
  if(!KEY_DOWN)
  {
   return DOWN;
  }  
}
if(!KEY_LEFT)
{
  delay_50us(2);
  if(!KEY_LEFT)
  {
   return LEFT;
  }  
}
if(!KEY_RIGHT)
{
  delay_50us(2);
  if(!KEY_RIGHT)
  {
   return RIGHT;
  }  
}
if(!KEY_qian)
{
  delay_50us(2);
  if(!KEY_qian)
  {
   return qian;
  }  
}
if(!KEY_hou)
{
  delay_50us(2);
  if(!KEY_qian)
  {
   return qian;
  }  
}
return snake.dir;//什么都没按
}
//检测方向与按键输入是否冲突
int oppositeDirection(int keyCode) {
    if(keyCode==UP&&snake.dir==DOWN){
      return 1;
      }
    else if(keyCode==DOWN&&snake.dir==UP) {
      return 1;
      }
    else if(keyCode==LEFT&&snake.dir==RIGHT){
      return 1;
      }
    else if(keyCode==RIGHT&&snake.dir==LEFT){
      return 1;
      }
    else if(keyCode==qian&&snake.dir==hou){
      return 1;
      }
    else if(keyCode==hou&&snake.dir==qian) {
      return 1;
      }
    else
      return 0;
}
//食物是否可以吃到
int foodEat() {
    if(snake.nodes[0].x==food.pos.x&&snake.nodes[0].y==food.pos.y&&snake.nodes[0].z==food.pos.z)
       return 1;
    else
       return 0;
}
void moveSnake() {    //移动蛇
    int k;
   
    lastx=snake.nodes[snake.len-1].x;
    lasty=snake.nodes[snake.len-1].y;
    lasty=snake.nodes[snake.len-1].z;

    for(k=snake.len-2;k>=0;k--)
    {
  snake.nodes[k+1].x=snake.nodes[k].x;
  snake.nodes[k+1].y=snake.nodes[k].y;
  snake.nodes[k+1].y=snake.nodes[k].z;
    }
if(snake.dir==UP)
       snake.nodes[0].y-=1;
    else if(snake.dir==DOWN)
       snake.nodes[0].y+=1;
    else if(snake.dir==LEFT)
       snake.nodes[0].x-=1;
    else if(snake.dir==RIGHT)
       snake.nodes[0].x+=1;
    else if(snake.dir==hou)
       snake.nodes[0].z-=1;
    else if(snake.dir==qian)
       snake.nodes[0].z+=1;
    else
;
}
uchar touchSelf() {    //判定是否碰到自身
    uchar i;
    for (i=3;i<snake.len-1;i++)
    {
       if(snake.nodes[0].x==snake.nodes.x&&snake.nodes[0].y==snake.nodes.y&&snake.nodes[0].y==snake.nodes.z)
       return TRUE;
    }
    return FALSE;
}
uchar touchWall() {    //判断是否碰到墙
    uchar x1=snake.nodes[0].x;
    uchar y1=snake.nodes[0].y;
    uchar z1=snake.nodes[0].z;
    if(x1<0||x1>7||y1<0||y1>7||z1<0||z1>7)
       return TRUE;
    else
       return FALSE;
}
void gamePlay() {
int d;
uchar keyCode;
while(START);  //等待按开始键
while(TRUE) {  
  if (touchWall() || touchSelf()) {
   gameOver();    //跳到游戏结束子函数
   return;
  }
  if (!food.exist) createFood();
  food.exist=1;
  for(d=0;d<(sp*36);d++)
  {
   drawFood();
   drawSnake();
  }
  keyCode = getKey();
      lastx=snake.nodes[snake.len-1].x;
     lasty=snake.nodes[snake.len-1].y;
     lastz=snake.nodes[snake.len-1].z;
  if (!oppositeDirection(keyCode))
  {
   snake.dir = keyCode;
  }  
  moveSnake();
  if (foodEat()) {
   food.exist = FALSE;
   expandSnake();
  }
}
}
void init() {           //初始化
    snake.nodes[0].x=1;
    snake.nodes[0].y=1;
    snake.nodes[0].z=1;
    snake.nodes[1].x=1;
    snake.nodes[1].y=2;
    snake.nodes[1].z=1;
    snake.len=2;
    snake.live=1;
    snake.dir=UP;
    food.exist=0;
    srand(5);     /*sui ji shu fa sheng qi随机数发生器*/
}
void drawFood() {          //?
P0=zong[food.pos.x];
P1=green[food.pos.y];
P3=green[food.pos.z];
delay(2);
P0=0;
P1=0xff;
}
void gameOver() {       //?
    while(1)
   {
    P3=0xff;
    P0=0xff;
  P1=0x0;
   }
}
void expandSnake() {        //?增长蛇
    if(keyCode==UP){
      lastx-=1;
      }
    else if(keyCode==DOWN) {
      lastx+=1;
      }
    else if(keyCode==LEFT){
      lasty-=1;
      }
    else if(keyCode==RIGHT){
      lasty+=1;
      }
    else if(keyCode==qian){
      lastz-=1;
      }
    else if(keyCode==hou){
      lastz+=1;
      }
    else
     {}
      snake.nodes[snake.len].x=lastx;
      snake.nodes[snake.len].y=lasty;
      snake.len++;
}
编译错误如下:



求大神指导:还有这个程序是否能够运行;
跪求;

配置选择大容量模式

你知不知道51可用的RAM是很有限的,你倒好,定义了这么个变量
struct Snake {
struct Point nodes[50];
uchar len;
uchar dir;
uchar live;
} snake;
单单是snake变量,就占用了应该是至少50 *4 + 1 + 1 + 1 = 203字,想知道确切结果,就sizeof(变量)看看。然后你还有其他变量的定义,你想想占用了多少字节,回去翻下51书本,看看51可用的RAM有多大,你都超出了,编译当然报错了……

非常感谢 我知道了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top