內(nèi)含完整程序和元件清單等資料
Altium Designer畫的電路原理圖如下:(51hei附件中可下載工程文件)
無標題.png (443.73 KB, 下載次數(shù): 104)
下載附件
貪吃蛇PCB
2019-2-3 21:16 上傳
0.png (40.66 KB, 下載次數(shù): 97)
下載附件
2019-2-4 03:13 上傳
貪吃蛇元件清單
序號 元件 數(shù)量 備注
1 STC89C52 1
2 IC座 4 40腳1個,16腳2個,20腳1個
3 按鍵 5
4 自鎖開關 1
5 晶振 1 12MHz
6 瓷片電容 5 33pF 2個,104電容3個
7 電解電容 2 10uF/25V需 1個,100uF/50V需1個
8 排阻 1 10K-9P(可用單個電阻代替,需8個)
9 電阻 9 100歐8個,10K需1個
10 八位數(shù)碼管 1 (可用四位,需2個)
11 74HC245 1
12 74HC595 1
13 74LS138譯碼器 1
14 8*8點陣 1
15 萬能板 1 18*30CM
16 排針 4P
17 CH340下載器 1 USB接口
單片機源程序如下:
- /**************************************************************************************
- * 貪吃蛇參考程序 *
- 實現(xiàn)現(xiàn)象:下載程序后數(shù)碼管無顯示,按下獨立按鍵實現(xiàn)對應的功能
- K1 : 向上
- K2 : 向下
- K3 : 向左
- K4 : 向右
- 注: 初始點陣顯示貪吃蛇(三個連續(xù)的點表示)在左上角向右移動,按下按鍵K1控制貪吃蛇向上移動;
- 按下K2控制貪吃蛇向下移動;按下K3控制貪吃蛇向左移動;按下K4控制貪吃蛇向右移動。吃到食物后
- 等待2s會再次出現(xiàn)食物;食物出現(xiàn)后8S內(nèi)必須吃到食物,否則游戲結(jié)束,同時數(shù)碼管顯示得分。食物
- 出現(xiàn)后2s內(nèi)吃到食物得6分、4s秒內(nèi)吃到食物得4分、6s內(nèi)吃到食物得2分、8s內(nèi)吃到食物得1分。每吃
- 到一個食物貪吃蛇的速度會加快一次,加到一定的程度并且分數(shù)小于100時會恢復初始速度、分數(shù)大于
- 等與100小于200時速度恢復為初始速度的5/3倍、分數(shù)大于400時速度幾乎不恢復!
- 部分端口未更改,端口配置需與實際電路相對應
- 本程序僅供參考,未經(jīng)作者允許不可用于商業(yè)用途!
- 所使用開發(fā)板為普中科技單片機CH6800-ES V2.0開發(fā)板
- 作者: 魏 賽 東
- *
- ***************************************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #define io0 P0
- #define io2 P1
- typedef unsigned int u1;
- typedef unsigned char u2;
- sbit ser=P2^4; //輸入端
- sbit rclk=P2^5; //保存所有輸出數(shù)據(jù)
- sbit srclk=P2^6; //移位
- sbit k1=P3^1;
- sbit k2=P3^0;
- sbit k3=P3^2;
- sbit k4=P3^3;
- sbit LSC=P3^4;
- sbit LSB=P3^5;
- sbit LSA=P3^6;
- int k[3]={0,0,0},l[3]={0,1,2},m[2]={0,0},n[2]={1,2},j1=0;
- u1 code smg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- u2 act=4,a=0,time1=50;
- u1 a1,a2,scor=0;
- static u1 s30;
- static u1 ms2000;
- u2 code liexuan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //用code不能重新賦值
- u2 heng[8][8]= {
- {0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0},
- {0,0,0,0,0,0,0,0}
- };
- void delay(u1 i)
- {
- while(i--);
- }
- void Timer0Init()
- {
- TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
- TH0=0Xe0; //給定時器賦初值,定時8ms
- TL0=0Xc0;
- ET0=0;//關閉定時器0中斷允許
- EA=1;//打開總中斷
- TR0=1;//打開定時器
- }
- void Timer1Init()
- {
- TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
- TH1=0XFC; //給定時器賦初值,定時1ms
- TL1=0X18;
- ET1=1;//打開定時器1中斷允許
- EA=1;//打開總中斷
- TR1=1;//打開定時器
- }
- void ank1() //橫選
- {
- static u2 ank1_flag;
- if(k1)
- ank1_flag = 1;
- if(!k1 && ank1_flag)
- {
- delay(1000);
- if(!k1)
- {
- act=1;
- ank1_flag = 0;
- }
- }
- }
- void ank2() //列選
- {
- static u2 ank2_flag;
- if(k2)
- ank2_flag = 1;
- if(!k2 && ank2_flag)
- {
- delay(1000);
- if(!k2)
- {
- act=2;
- ank2_flag = 0;
- }
- }
- }
- void ank3()
- {
- static u2 ank3_flag;
- if(k3)
- ank3_flag = 1;
- if(!k3 && ank3_flag)
- {
- delay(1000);
- if(!k3)
- {
- act=3;
- ank3_flag = 0;
- }
- }
- }
- void ank4() //點陣亮滅
- {
- static u2 ank4_flag;
- if(k4)
- ank4_flag = 1;
- if(!k4 && ank4_flag)
- {
- delay(1000);
- if(!k4)
- {
- act=4;
- ank4_flag = 0;
- }
- }
- }
- void fanzhuan()
- {
- heng[l[0]][k[0]]=~heng[l[0]][k[0]];
- heng[l[1]][k[1]]=~heng[l[1]][k[1]];
- heng[l[2]][k[2]]=~heng[l[2]][k[2]];
- }
- void yidong(u2 x)
- {
- switch(x)
- {
- case 1: k[2]--;
- if(k[2]==-1)
- k[2]=7;break;
- case 2: k[2]++;
- if(k[2]==8)
- k[2]=0;break;
- case 3: l[2]--;
- if(l[2]==-1)
- l[2]=7;break;
- case 4: l[2]++;
- if(l[2]==8)
- l[2]=0;break;
- }
- }
- void dianzhen()
- {
- u2 i,j,time;
- fanzhuan();
- for(time=0;time<time1;time++)
- {
- ank1();ank2();ank3();ank4();
- for(i=0;i<8;i++)
- {
- srclk=0;
- rclk=0;
- for(j=0;j<8;j++)
- {
- ser=heng[i][j];
- srclk=1;
- delay(2);
- srclk=0;
- }
- rclk=1;
- delay(2);
- rclk=0;
- io0=liexuan[i];
- delay(100);
- io0=0xff;
- }
- }
- fanzhuan();
-
- yidong(act);
- k[1]=m[1];l[1]=n[1];
- k[0]=m[0];l[0]=n[0];
- m[1]=k[2];n[1]=l[2];
- m[0]=k[1];n[0]=l[1];
- if(k[2]==a1&&l[2]==a2&&j1)
- {
- ET0=0;
- heng[a2][a1]=~heng[a2][a1];
- ET1=1;
- if(s30<250)
- scor+=6;
- else if(s30<500)
- scor+=4;
- else if(s30<750)
- scor+=2;
- else
- scor++;
- s30=0;
- TH0=0xe0;
- TL0=0xc0;
- if(time1>2)
- time1-=5;
- if(time1<5&&scor<100)
- time1=50;
- else if(time1<5&&scor<200)
- time1=30;
- else if(time1<5&&scor>400)
- time1=2;
- j1=0;
- }
- }
- void main()
- {
- Timer1Init();
- Timer0Init();
- while(1)
- {
- dianzhen();
- }
- }
- void Timer1() interrupt 3
- {
- TH1=0XFC; //給定時器賦初值,定時1ms
- TL1=0X18;
- ms2000++;
- a+=(l[2]+k[1]);
- if((a%10)>7)
- a+=2;
- if((a/10%10)>7)
- a+=20;
- if(a>2000)
- {
- a=l[1]+k[2];
- if(a%10>7)
- a-=2;
- }
- if(ms2000==2000)
- {
- ms2000=0;
- a1=a%10;
- a2=a/10%10;
- if(a1==k[0]||a1==k[1]||a1==k[2])
- if(k[2]<5)
- a1+=2;
- else
- a1-=2;
- if(a2==l[0]||a2==l[1]||a2==l[2])
- if(l[2]<5)
- a2+=2;
- else
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
貪吃蛇小游戲.zip
(51.52 KB, 下載次數(shù): 66)
2019-2-3 21:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|