久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8722|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

開源Proteus仿真全民貪吃蛇 附LPC2124 ARM7程序分析與設(shè)計報告

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:437819 發(fā)表于 2018-12-2 18:48 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我以前做的一個貪吃蛇課程設(shè)計。
此次的ARM7最小系統(tǒng)的課程設(shè)計是基于LPC2124以及LCD-CSTN20GG0906N7CUN6和按鍵電路。采用ISIS7 Professional軟件自行搭建電路。里面帶有實驗報告,里面都是干貨,希望對大家有用。


目錄
1.              課程設(shè)計內(nèi)容
2.              課程設(shè)計目的
3.              背景知識
4.              工具/準(zhǔn)備工作              4
5.              設(shè)計步驟與方法              4
5.1.              步驟1:在Proteus仿真軟件上設(shè)計電路圖              4
5.2.              步驟2:畫蛇              5
5.2.1.              步驟1.1:蛇的產(chǎn)生              5
5.3.              步驟3:食物的產(chǎn)生              6
5.4.              步驟4:蛇的移動              7
5.4.1.              步驟1.1:按鍵的掃描              8
5.5.              步驟5:蛇節(jié)的增長              8
5.5.1.              步驟1.1:判斷蛇是否吃到食物              9
5.5.2.              步驟1.2:速度的增長              10
5.6.              步驟6:游戲是否結(jié)束              10
5.7.              步驟7:LCDHDG12864L-6的顯示              11
5.8.              步驟8:重新開始與暫停按鍵              11
6.              設(shè)計結(jié)果及分析              12
7.              設(shè)計結(jié)論              13
8.              問題及心得體會              13
9.              對本設(shè)計過程及方法、手段的改進(jìn)建議              14
10.             參考文獻(xiàn)              14
11.              課程設(shè)計評價(教師)              14

全民貪吃蛇


1.
     課程設(shè)計內(nèi)容

此次ARM7最小系統(tǒng)的課程設(shè)計是基于LPC2124以及LCD-CSTN20GG0906N7CUN6和按鍵電路。采用ISIS 7 Professional軟件自行搭建電路。本系統(tǒng)的特點是性能高、成本低并且耗能小等特點。

2.     課程設(shè)計目的

此次課程設(shè)計的主要目的是讓我們提高代碼的熟練度,以及發(fā)揮自主創(chuàng)新,將平時上課學(xué)到的理論知識與實驗知識相結(jié)合。讓我們對arm7芯片以及ISIS 7 Professional仿真模擬器更為了解。

  • 熟練掌握向量中斷IRQ的初始化和對中斷的處理過程。
  • 熟練掌握定時器的控制和使用方法。
  • 熟練掌握C語言的使用原理及編程方法。
  • 熟練掌握仿真電路圖的連接方法。
  • 熟練掌握兩個不同的液晶顯示器的顯示控制原理及編程方法。

3.     背景知識
ARM處理器的三大特點是:耗電少功能強(qiáng)、16位/32位雙指令集和合作伙伴眾多。
1、體積小、低功耗、低成本、高性能;
2、支持Thumb(16位)/ARM(32位)雙指令集,能很好的兼容8位/16位器件;
3、大量使用寄存器,指令執(zhí)行速度更快;
4、大多數(shù)數(shù)據(jù)操作都在寄存器中完成;
5、尋址方式靈活簡單,執(zhí)行效率高;
6、指令長度固定。

設(shè)計原理:貪吃蛇游戲是一款經(jīng)典的游戲,既簡單又耐玩。通過控制蛇頭方向吃蛋,使得蛇變長,從而獲取積分。用游戲把子上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,而且蛇的身子會越吃越長,身子越長玩的難度就越大,不能碰墻,不能咬到自己的身體,更不能咬自己的尾巴,等到了一定的分?jǐn)?shù),就能過關(guān),然后繼續(xù)玩下一關(guān)。


4.     工具/準(zhǔn)備工作
  • CodeWarrior project file軟件。
  • ISIS 7 Professional軟件。
  • 了解Proteus仿真軟件和ARM編程軟件的使用方法。
  • 了解ARM7芯片的編程方法。
5.   設(shè)計步驟與方法

5.1.步驟1:在Proteus仿真軟件上設(shè)計電路圖

5.2.步驟2畫蛇

由于采用的是LCD-CSTN20GG0906N7CUN6,首先根據(jù)其數(shù)據(jù)手冊對該LCD進(jìn)行繪畫,先寫入命令對其進(jìn)行寫操作WR_CMD(0xBC);WR_DATA(0); WR_DATA(00);       WR_DATA(00); 然后寫入命令WR_CMD(0x75);意為寫入x軸,后接x軸的具體數(shù)據(jù)以及x軸的最大值。緊接著寫入WR_CMD(0x15);意為寫入y軸,后接y軸的具體數(shù)據(jù)以及y軸的最大值。

void snake_display(int x,int y)

{

              int i,j;      

      WR_CMD(0xBC); WR_DATA(0); WR_DATA(00);  WR_DATA(00);         

     WR_CMD(0x75);   

     WR_DATA(x);    WR_DATA(63);

     WR_CMD(0x15);

     WR_DATA(y);    WR_DATA(95);   

     WR_CMD(0x5c);            

        for(j=0;j<1;j++)  {

                      for(i=0;i<1;i++){

                          WR_DATA(0xf8);//0xff   

                          WR_DATA(0x00); }}

}

5.2.1步驟1.1蛇的產(chǎn)生

首先創(chuàng)建一個蛇的結(jié)構(gòu)體Point,該結(jié)構(gòu)體內(nèi)存儲了蛇的x、y坐標(biāo),以及蛇的長度和蛇的方向,然后通過rand函數(shù)產(chǎn)生隨機(jī)數(shù)存在Snake的x、y中,即蛇的初始位置是隨機(jī)的,然后再通過snake_init()函數(shù)中對蛇進(jìn)行初始化,然后通過循環(huán)在snake_display(int x,int y)函數(shù)中把蛇畫出來。

  1. void snake_init()
  2. {
  3.               int i;
  4.               snake_state();
  5.     Snake.x[0] = rand()%62;
  6.     Snake.y[0] = rand()%95;   
  7.    Snake.x[1] = Snake.x[0]+1;
  8.     Snake.y[1] = Snake.y[0];   
  9.     Snake.x[2] = Snake.x[1] +1;
  10.     Snake.y[2] = Snake.y[0] ;
  11.        Snake.num = 3;   
  12.     for(i=0;i<Snake.num;i++)
  13.                   snake_display(Snake.x[i],Snake.y[i]);
  14.     }
復(fù)制代碼

5.3.步驟3食物的產(chǎn)生

首先創(chuàng)建一個食物的結(jié)構(gòu)體point,在該結(jié)構(gòu)體的基礎(chǔ)上定義一個數(shù)組food_map,通過這個結(jié)構(gòu)體對地圖進(jìn)行修改。該結(jié)構(gòu)體內(nèi)存儲了食物的x、y坐標(biāo),以及食物的長度,然后通過rand函數(shù)產(chǎn)生隨機(jī)數(shù)保存在food_map中,即食物的出現(xiàn)位置是隨機(jī)的,然后再通過food_init()函數(shù)中對食物進(jìn)行初始化,然后通過循環(huán)在food_display(int x,int y)函數(shù)中把食物畫出來(食物的畫法與步驟一中蛇的畫法是一樣的,只不過食物的顏色是黃色,蛇的顏色是紅色,便于確認(rèn))。

當(dāng)蛇吃了一定數(shù)量的食物時,通過調(diào)用食物產(chǎn)生函數(shù),重新產(chǎn)生新的食物,以保證食物的存在性。


  1. void food()
  2. {
  3.               int i;
  4.               if(create_food==1)
  5.               {
  6.                             for(i=food_long;i<food_long+8;i++)
  7.                             {
  8.                                           food_map[i].x=rand()%62;
  9.                                           food_map[i].y=rand()%93;
  10.                             }
  11.                             food_long+=8;
  12.                             create_food=0;
  13.               }
  14. }
  15. void food_map_init()
  16. {
  17.               int i;
  18.               food();
  19.               for(i=0;i<food_long;i++)
  20.                             food_display(food_map[i].x,food_map[i].y);            
  21. }
復(fù)制代碼


5.4.步驟4蛇的移動

若相應(yīng)方向的按鍵被按下,則蛇就會往相應(yīng)的方向移動。首先要把蛇之前走過的痕跡擦掉(擦掉的函數(shù)如同畫蛇,把顏色數(shù)據(jù)改為背景色即可),然后將蛇從最后個節(jié)點向前一個節(jié)點移動,這是蛇的最核心算法。最后通過switch case判斷哪一個按鍵被按下,然后對蛇頭的方向,即Snake.direction進(jìn)行修改。蛇的移動函數(shù)放在中斷中,每次發(fā)生中斷都會重新畫蛇(蛇的移動即把原來的蛇尾巴擦掉,然后根據(jù)新的坐標(biāo)重新畫蛇)。當(dāng)按鍵沒有被按下時,蛇會按照上一次按下按鍵的方向去移動(初始化時默認(rèn)向右)。


  1. void snake_move()
  2. {            
  3.               char i;
  4.               int j;
  5.               if(flag==1)
  6.               {
  7.                             Snake.num++;            
  8.                             flag=0;
  9.               }
  10.                             for(i=0;i<food_long;i++)
  11.                             food_display(food_map[i].x,food_map[i].y);
  12. clear_snake(Snake.x[Snake.num-1],Snake.y[Snake.num-1]);
  13.    for(i = Snake.num - 1; i > 0; i--) // 將蛇從最后個節(jié)點向前一個節(jié)點移動
  14.    {
  15.                             Snake.x[i] = Snake.x[i - 1];
  16.         Snake.y[i] = Snake.y[i - 1];
  17.    }
  18.        snake_state();         
  19.     switch(Snake.direction)
  20.     {                     
  21.         case 1:
  22.              Snake.x[0] -=1 ;
  23.             break;
  24.         case -1:
  25.                                    Snake.x[0] +=1 ;
  26.             break;
  27.         case 2:
  28.             Snake.y[0] -=1 ;
  29.             break;
  30.         case -2:
  31.             Snake.y[0] +=1 ;
  32.             break;
  33.     }
  34.       for(i=0;i<Snake.num;i++)
  35.                   snake_display(Snake.x[i],Snake.y[i]);
  36. }
復(fù)制代碼


5.4.1. 步驟1.1:按鍵的掃描

通過IOxPIN來確定按鍵是否按下,由于按鍵接在P1.20-P1.23,因此是I01PIN。通過讀取各個按鍵的狀態(tài)封裝在snake_state函數(shù)里。如果上鍵按下,Snake.directio則相應(yīng)為上(Snake.direction是蛇的結(jié)構(gòu)體Point里的成員用于確定蛇的方向)。其余方向的設(shè)置同上。

void snake_state()

{

              if(!(IO1PIN&key_w))Snake.direction=1;//上

              else if(!(IO1PIN&key_s))Snake.direction= -1;//下

              else if(!(IO1PIN&key_a))Snake.direction= 2;//左

              else if(!(IO1PIN&key_d))Snake.direction= -2;//右

}


5.5.步驟5:蛇節(jié)的增長

如果蛇吃到了食物,此時的蛇應(yīng)該變長,即Snake.num++,在蛇尾的部分添加一個點即可,新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置。先把這條蛇擦掉,然后重新畫蛇。

if(flag==1)

              {

                            Snake.num++;            

                            flag=0;

              }


5.5.1. 步驟1.1:判斷蛇是否吃到食物

如果蛇頭的x、y坐標(biāo)與food_map中的任一x、y坐標(biāo)均相等,則說明蛇已經(jīng)吃了食物,此時要對食物進(jìn)行擦除(食物的擦除與食物的繪畫是一樣的,只需要把顏色改為跟背景色一樣即可)。


  1. void checkeat()
  2. {
  3.               int i,time;
  4.               for(i=0;i<food_long;i++)
  5.               {              if((Snake.y[0]==food_map[i].y)&&(Snake.x[0]==food_map[i].x)||(Snake.y[Snake.num-1]==food_map[i].y)&&(Snake.x[Snake.num-1]==food_map[i].x))
  6.                             {            
  7.                                                         flag=1;            
  8.                                                         NUMBER++;//
  9.                                                         if(NUMBER>9)NUMBER=0;
  10.                                                         print_score();//
  11.                                                         eat++;
  12.                                                         if(eat%4==0)create_food=1;
  13.                                                         if(eat%1==0)
  14.                                                         {
  15.                                                                       LEVEL++;
  16.                                                                       speed-=50;
  17.                                                                       if(LEVEL>9)LEVEL=0;
  18.                                                                       print_level();
  19.                                                         }                                         
  20.                                                         clear_food(food_map[i].x,food_map[i].y);
  21.                                                         food_map[i].x=NULL;
  22.                                                         food_map[i].y=NULL;
  23.                                                         break;                           
  24.                             }
  25.               }
  26. }
復(fù)制代碼


5.5.2. 步驟1.2:速度的增長

當(dāng)蛇吃到一定數(shù)量的食物時,游戲的等級會增加,此時蛇的速度就會變快,通過改變定時器的定時時長可以實現(xiàn),即改變T0TR,首先設(shè)定一個speed變量值,當(dāng)游戲中的LEVEL++時,speed的值減小,此時定時器的定時時長會縮短,會,從而導(dǎo)致蛇的移動掃描變快,因而實現(xiàn)了蛇的速度的變化。

void speed_change()

{

              T0PR = speed;

}



5.6.步驟6:游戲是否結(jié)束

如果蛇跑出了LCD所能表示的范圍,即蛇頭小于0或者大于63,蛇尾小于0或者大于95,則視為死亡,游戲結(jié)束,顯示結(jié)束圖片。如果需要繼續(xù)游戲則按下重新開始按鈕。

如果蛇頭撞上了身體的任意環(huán)節(jié)(通過循環(huán)來一節(jié)節(jié)地進(jìn)行判斷),則視為死亡,游戲結(jié)束,顯示結(jié)束圖片。如果需要繼續(xù)游戲則按下重新開始按鈕。

反之,游戲繼續(xù)。

如果最終的等級大于9級,則游戲勝利,顯示勝利圖片。如果需要繼續(xù)游戲則按下重新開始按鈕。


  1. void snake_life()
  2. {
  3.               int i;
  4.               if(Snake.x[0] < 0 || Snake.x[0] > 63 || Snake.y[0] < 0 || Snake.y[0] >95)               die=1;
  5.               for(i=3;i<Snake.num;i++)
  6.                 {
  7.      if(Snake.x[i]==Snake.x[0]&&Snake.y[i]==Snake.y[0])
  8.      {
  9.                    die=1;
  10.                    break;
  11.     }  
  12.   }
  13. }
復(fù)制代碼


5.7.步驟7:LCDHDG12864L-6的顯示

該LCD用來顯示游戲的名稱、制作人、等級以及分?jǐn)?shù)。根據(jù)該LCD的數(shù)據(jù)手冊首先寫入的是y的值,然后寫入x的值,來確定所寫的字的位置,先寫字的上半部分,然后重新寫入y的值,x的值不變,再寫字的下半部分。

每次蛇吃到食物時,分?jǐn)?shù)就會增加。分?jǐn)?shù)的字模放在一個數(shù)組里,通過下標(biāo)調(diào)用顯示。當(dāng)蛇吃到了一定數(shù)量的食物之后,等級就會隨之增加,等級的字模也是放在一個數(shù)據(jù)里,通過下標(biāo)調(diào)用顯示。

void print_level()

{

              int j;

   WR_CMD1(0xb0+4);

   WR_CMD1(0x10);

   WR_CMD1(0x00+51);

  for(j=0;j<8;j++)

  {

   WR_DATA1(number[LEVEL][0][j]);

  }

              WR_CMD1(0xb0+5);

              WR_CMD1(0x10);

              WR_CMD1(0x00+51);

  for(j=0;j<8;j++)

  {

   WR_DATA1(number[LEVEL][1][j]);

  }            

}


5.8.步驟8:重新開始與暫停按鍵

設(shè)置兩個按鍵用于重新開始游戲以及暫停游戲。

重新開始游戲時,先把顯示蛇的LCD的屏幕清屏。把成績與等級初始化為0,然后對游戲的所有參數(shù)重新進(jìn)行初始化。

暫停按鈕的實現(xiàn)十分簡單,只需要把蛇的移動方向設(shè)為空即可。此時,蛇不會再移動。若要繼續(xù)游戲,則按任意方向鍵繼續(xù)。

void button()

{

              if(!(IO1PIN&restart))

              {

                            LCD_clear();

                            die=0;

                            LEVEL=0;

                            NUMBER=0;

                            flag=0;

                            eat=0;

                            speed=1000;

                            Snake.direction=NULL;

                            food_map_init();

                            create_food=0;

                            score_init();

                            print_score();

                            print_level();

                            snake_init();

                            food_map_init();              

              }

              if(!(IO1PIN&stop))

              {

                            Snake.direction=NULL;

              }

}

6.     設(shè)計結(jié)果及分析

設(shè)計結(jié)果:蛇的出現(xiàn)位置與食物的出現(xiàn)位置都是隨機(jī)的。當(dāng)按下相對應(yīng)的按鍵時,蛇會往那個方向走,當(dāng)蛇吃到食物時,分?jǐn)?shù)會增加。當(dāng)蛇吃到一定數(shù)量的食物時,等級和速度也會隨之增加,當(dāng)食物少于一定數(shù)量時,會出現(xiàn)新的食物。當(dāng)?shù)燃夁_(dá)到9時,游戲結(jié)束,玩家勝出,播放勝利圖片。如果蛇吃到自身,或者撞到墻,則游戲結(jié)束,玩家失敗,播放失敗圖片。

設(shè)計分析:這個程序的關(guān)鍵是表示蛇的圖形以及蛇的移動。用一個小矩形表示蛇的一節(jié)身體,身體每長一節(jié),增加一個矩形塊。如果不按任何鍵,蛇自行在當(dāng)前方向上前移,當(dāng)游戲者按了有效的方向鍵后,蛇頭朝著指定的方向移動,一步移動一節(jié)身體,所以當(dāng)按了有效的方向鍵后,先確定蛇頭的位置,然后蛇身體隨著蛇頭移動,圖形的實現(xiàn)是從蛇頭的新位置開始畫出蛇,這時原來蛇的位置和新蛇的位置差一個單位,所以看起來蛇會多一節(jié)身體,所以將蛇的最后一節(jié)用背景色覆蓋。食物的出現(xiàn)和消失也是畫矩形塊和覆蓋矩形塊。


7.     設(shè)計結(jié)論

經(jīng)過奮戰(zhàn)我的課程設(shè)計終于完成了。在沒有做課程設(shè)計以前覺得課程設(shè)計只是對嵌入式最小系統(tǒng)這門課程所學(xué)知識的單純總結(jié),但是通過這次做課程設(shè)計發(fā)現(xiàn)自己的看法有點太片面。課程設(shè)計不僅是對前面所學(xué)知識的一種檢驗,而且也是對自己能力的一種提高。通過這次課程設(shè)計使我明白了自己原來知識還比較欠缺。自己要學(xué)習(xí)的東西還太多,以前老是覺得自己什么東西都會,什么東西都懂,有點眼高手低。通過這次課程設(shè)計,我才明白學(xué)習(xí)是一個長期積累的過程,在以后的工作、生活中都應(yīng)該不斷的學(xué)習(xí),提高自己的知識和綜合素質(zhì)。

8.   問題及心得體會

通過這次的課程設(shè)計讓我學(xué)到了許多編程知識,提高運用C語言解決實際問題的能力,鞏固了C語言的語法規(guī)則、掌握和理解,還提高了自學(xué)以及查閱資料的能力。我發(fā)現(xiàn)只有理論知識是不夠的,僅僅運用課上所學(xué)無法編實際問題,實際執(zhí)行過程與預(yù)想不一致,經(jīng)常會出現(xiàn)bug。還因為在仿真軟件中用錯了一個LCD顯示器,導(dǎo)致程序卡在那里好幾天,當(dāng)時用的是12864-6,一直卡在蛇的顯示,非常考驗我的邏輯與耐心。后來一怒之下?lián)Q了一個實驗中講過的LCD顯示器。必須把所學(xué)的理論知識和自身的實踐相結(jié)合,在編程中我學(xué)到了許多編程知識,還學(xué)會了如何去看器件的數(shù)據(jù)手冊,在實際編程中,我遇到許多困難,例如:蛇的頭部與食物的檢測問題,蛇的移動與顯示問題,蛇的轉(zhuǎn)向問題,食物的隨機(jī)生成問題等等,我通過在網(wǎng)上搜集資料與自己的分析。最后,終于完成了這個游戲。

9.     對本設(shè)計過程及方法、手段的改進(jìn)建議

在食物的設(shè)計的方面,可以放上帶道具的食物,使蛇吃完后具有保護(hù),穿墻等特種功能,而且難度逐漸變難。還有設(shè)計一些障礙物,當(dāng)蛇撞到障礙物時死亡。



全部資料51hei下載地址:

Snake.zip (281.7 KB, 下載次數(shù): 122)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2018-12-3 02:04 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

板凳
ID:350993 發(fā)表于 2019-4-23 19:52 來自手機(jī) | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報

地板
ID:776149 發(fā)表于 2020-6-11 22:39 | 只看該作者
nice,nice,最近剛好在自學(xué)armplc2124,收獲到了
回復(fù)

使用道具 舉報

5#
ID:768748 發(fā)表于 2020-6-17 20:29 | 只看該作者
挺好的,謝謝大佬
回復(fù)

使用道具 舉報

6#
ID:86450 發(fā)表于 2020-11-2 16:48 | 只看該作者
nice,nice,最近剛好在自學(xué)armplc2124,收獲到了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 九九九视频 | 激情av| 亚洲成av| 婷婷在线视频 | 91精品久久久久久久久 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 国产精品久久久久久久久免费高清 | 国产成人99久久亚洲综合精品 | 人人叉 | 亚洲乱码国产乱码精品精的特点 | 真人毛片| 视频一区二区三区在线观看 | 午夜在线视频 | 中文字幕在线免费 | 亚洲精品国产第一综合99久久 | 91看片网 | 淫片一级国产 | 午夜欧美一区二区三区在线播放 | 有码在线| 欧美日韩综合视频 | 97精品国产97久久久久久免费 | av免费网站在线 | 国产色爽| 一区二区视频在线 | 日韩毛片网 | 色播av | 国产精品福利在线 | 狠狠干天天干 | 欧洲一级毛片 | 中文字幕亚洲区一区二 | 不卡一二三区 | 日韩亚洲一区二区 | 欧美一级视频免费看 | 91九色porny首页最多播放 | 中文字幕视频免费 | 97久久久 | 久久伊人亚洲 | 久久国产精品网站 | 丁香婷婷综合激情五月色 | 亚洲精品乱码久久久久久9色 | 国产精品久久久99 |