6ceae980bfcfc4d0ddd3ef5ee4cbce3.jpg (137.64 KB, 下載次數: 35)
下載附件
2020-11-1 12:32 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #include<stdlib.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit SER=P2^4;
- sbit up=P2^2; //上
- sbit down=P2^1; //下
- sbit lt=P2^3; //左
- sbit rt=P2^0; //右
- u8 code Hc595_Coordx[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- u8 code Hc595_Coordy[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
- u8 foodx;
- u8 foody;
- u8 snake_x[20]={0};
- u8 snake_y[20]={0};
- u8 length;
- u8 direction;
- void initSnake();
- void delay(u16 i);
- void Hc595SendByte(u8 dat);
- void move();
- void Keypros();
- void creatFood();
- void snake_Grow(void);
- void drawsnake();
- void initSnake()
- {
- snake_x[0]=0;
- snake_y[0]=0;
- length=1;
- direction=2;
- }
- void delay(u16 i)
- {
- while(i--);
- }
- void move()
- {
- u8 len = length- 1;
- for(len; len > 0; len--)
- {
- snake_x[len] = snake_x[len - 1];
- snake_y[len] = snake_y[len - 1]; //一直到蛇頭
- }
- switch(direction)
- {
- case 1:
- snake_y[0]--;
- break;
- case 2:
- snake_y[0]++; //再利用蛇頭轉變方向
- break;
- case 3:
- snake_x[0]--;
- break;
- case 4:
- snake_x[0]++;
- break;
- default:
- break;
- }
- }
- //貪吃蛇的上下左右行動控制
- void Keypros()
- {
- if(up==0)
- {
- delay(1000); //消抖處理
- if(up==0)
- {
- if(direction==3|direction==4)
- direction=1; //在地址1內寫入數據num
- }
- while(!up);
- }
- if(down==0)
- {
- delay(1000); //消抖處理
- if(down==0)
- { if(direction==3|direction==4)
- direction=2;
- }
- while(!down);
- }
- if(lt==0)
- {
- delay(100); //消抖處理
- if(lt==0)
- {
- if(direction==1|direction==2)
- direction=3;
- }
- while(!lt);
- }
- if(rt==0)
- {
- delay(1000); //消抖處理
- if(rt==0)
- {
- if(direction==1|direction==2)
- direction=4;
- }
- while(!rt);
- }
- }
- void creatFood() //隨機創造食物
- {
- u8 i;
- foodx=rand()%8;
- foody=rand()%8;
- for(i=0; i<length; i++)
- {
- if((foodx==snake_x[i])&&(foody==snake_y[i])) //如果食物與蛇的身體重疊,要重新創建
- {
- creatFood();
- }
- }
- }
- void snake_Grow(void)
- {
- if(snake_x[0] == foodx && snake_y[0] == foody)
- {
- creatFood();
- snake_x[length] = snake_x[length - 1];
- snake_y[length] = snake_y[length - 1];
- length++;
- }
- }
- void drawsnake() //點亮蛇和食物
- {
- u8 i;
- for(i=0;i<length;i++)
- {
- P1=Hc595_Coordy[snake_y[i]];
- P0=Hc595_Coordx[snake_x[i]];
- delay(20);
- P0=0xff;
- P1=Hc595_Coordy[foody];
- P0=Hc595_Coordx[foodx];
- delay(20);
- P0=0xff;
- }
- }
- void JudgeDeath(void)
- {
- u8 i;
- // 判斷蛇撞墻死亡
- if((snake_x[0]>7)||(snake_y[0]>7))
- {
- Hc595SendByte(0x00);
- while(1);
- }
- // 判斷蛇撞到自己身體死亡
- for(i=4; i<length; i++)
- {
- if((snake_x[0]==snake_x[i])&&(snake_y[0]==snake_y[i]))
- {
- P0=0xFF;
- while(1);
- }
- }
- }
- void Timer0Init()
- {
- TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
- TH0=0XD8; //給定時器賦初值,定時10ms
- TL0=0XF0;
- ET0=1;//打開定時器0中斷允許
- EA=1;//打開總中斷
- TR0=1;//打開定時器
- }
- void main()
- {
- Timer0Init();
- initSnake();
- while(1)
- {
- drawsnake();
- JudgeDeath();
- snake_Grow();
- Keypros();
- }
- }
- void Timer0() interrupt 1
- {
- static u16 i;
- TH0=0XD8; //給定時器賦初值,定時10ms
- TL0=0XF0;
- i++;
- if(i==50)
- {
- i=0;
- move();
- }
- }
復制代碼
|