欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2854|回復: 1
打印 上一主題 下一主題
收起左側

單片機制作的GAMEBOX_Keil5_v1.1源碼與原理圖(射擊,賽車,貪食蛇)

[復制鏈接]
跳轉到指定樓層
樓主
ID:407334 發(fā)表于 2018-10-10 08:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機制作的gamebox,包含射擊游戲,賽車游戲,貪食蛇等,有l(wèi)ed顯示,2個8*8點陣 電路原理圖如下:


元件清單:


可以到./src/config.h文件自由配置引腳




單片機源程序如下(有詳細的代碼注釋):
  1. #include "config.h"

  2. #define ASPEED 28         //按加速鍵后的速度
  3. uint8 ucar=1;                //你的車,1靠右,2靠左

  4. static void keyscan()
  5. {
  6.         static bit r = 0;
  7.         int8 k = Get_Kvuale(30);
  8.         if(KEY_OK==0) {
  9.                 speeds = ASPEED;
  10.                 if(!sound_cnt_time | r) Sound_Tone(sound_ON,6,255);
  11.                 r=0;
  12.         }
  13.         else{        //隨著分數(shù)的增加, 游戲速度逐漸加快
  14.                 speeds = 200 - scores/10;
  15.                 if(!sound_cnt_time | !r) Sound_Tone(sound_ON,1,255);
  16.                 r=1;
  17.         }
  18.         if(k==K_LEFT)        ucar=1;
  19.         if(k==K_RIGHT)        ucar=2;
  20. }
  21. void RAC_Game()
  22. {        
  23.         int8 xcar[4][2]={0};        //[2] 0:左/右/無;        1:車的Y軸位置
  24.         uint8 code carport[3][4]={{0,0,0,0},{0x50,0x20,0x70,0x20},{0x0a,0x04,0x0e,0x04}};
  25.         uint8 code track[5]={0x81,0x81,0x81,0x00,0x00};
  26.         uint8 carid=0,lastid=0,stp=0;
  27.         uint8 p,i;
  28.         Glife=1;
  29.         speeds = 200;
  30.         scores = 0;
  31.         for(i=0;i<4;i++){
  32.                 xcar[i][1]=i*5;//其它賽車之間間隔控制,重要部分!
  33.                 xcar[i][0]=0;
  34.         }        
  35.         /******************初始化完成,開始游戲***********************/
  36.         while(Glife){        
  37. //                分層掃描,將畫面兩邊的賽道和賽車分為兩次掃描,使跑道跟賽車產(chǎn)生畫面對比度
  38. //                uint8 xtmp[16];
  39. //                for(p=0;p<16;p++)//刷新跑道
  40. //                        DispRAM[p]=track[(p+stp)%5];//動態(tài)跑道算法
  41. //                for(p=0;p<16;p++){
  42. //                        xtmp[p]=0x00;
  43. //                        for(i=0;i<4;i++)        //刷新其他賽車
  44. //                                if((0<=(p-xcar[i][1])) && (p-xcar[i][1])<4)        
  45. //                                        xtmp[p] = carport[xcar[i][0]][p-(xcar[i][1])];
  46. //                        if(p<4)
  47. //                                if(xtmp[p] & carport[ucar][p])//判斷你的賽車是否與其它賽車碰撞
  48. //                                        Glife=0;
  49. //                                else
  50. //                                        xtmp[p] |= carport[ucar][p];
  51. //                }
  52.                
  53.                 //同步掃描
  54.                 for(p=0;p<16;p++)//刷新跑道
  55.                 {
  56.                         DispRAM[p]=0x00;
  57.                         DispRAM[p]=track[(p+stp)%5];//動態(tài)跑道算法
  58.                         
  59.                         for(i=0;i<4;i++)//刷新其他賽車
  60.                                 if((0<=(p-xcar[i][1])) && (p-xcar[i][1])<4)        
  61.                                         DispRAM[p] |= carport[xcar[i][0]][p-(xcar[i][1])];
  62.                         if(p<4)
  63.                         {
  64.                                 if(DispRAM[p] & carport[ucar][p])//判斷你的賽車是否與其它賽車碰撞
  65.                                         Glife=0;
  66.                                 else        DispRAM[p] |= carport[ucar][p];
  67.                         }
  68.                 }
  69.                 if(tms > speeds)//游戲速度節(jié)拍
  70.                 {        
  71.                         stp++;
  72.                         if(stp==5) stp=0;//跑道動態(tài)算法標記位
  73.                         for(i=0;i<4;i++)
  74.                         {
  75.                                 xcar[i][1]--;        //其他車跟隨跑道下移
  76.                                 if(xcar[i][1]== -4){
  77.                                         xcar[i][1]=15;
  78.                                         if(lastid>0)        //游戲規(guī)則,如果上次產(chǎn)生的不是空車位,則這一次產(chǎn)生一個空車位
  79.                                                 carid=0;
  80.                                         else
  81.                                                 carid=rand()%3;//隨機產(chǎn)生一輛車
  82.                                         lastid = carid;
  83.                                         xcar[i][0]=carid;
  84.                                         scores ++;
  85.                                 }
  86.                         }        
  87.                         tms=0;
  88.                 }
  89.                 keyscan();
  90.                 MatxDisp(DispRAM,duty);
  91.                 SMG_Display(scores,duty);
  92.         }
  93.         TR2_OFF;
  94. }
復制代碼

  1. /*
  2.         2014-1-26 00:00:00        :完成貪吃蛇游戲模型
  3.         2014-3-8 23:27:05        :增加游戲會隨著吃的食物的增加而加快游戲速度
  4.         2014-3-15 20:06:15        :進行實體硬件測剩,運行良好,但貪吃蛇結構設置太耗RAM,將進行優(yōu)化。
  5. */
  6. #include "config.h"

  7. #define NORSPEED 360
  8. #define ASPEED 100
  9. #define WIDTH  8        //游戲屏幕寬度
  10. #define LENGTH 16        //游戲屏幕長度

  11. static struct Food
  12. {
  13.     uint8 x;//食物的橫坐標
  14.     uint8 y;//食物的縱坐標
  15. }food;

  16. struct Snake snake;

  17. enum direc{up, down, left, right};//蛇的運動方向

  18. static void Snake_Init();                //初始化游戲
  19. static void Snake_Disp();        //游戲顯示
  20. static void Snake_Run();                //蛇向前走一步
  21. static void Create_Food();                //隨機生成食物

  22. static void Create_Food()
  23. {
  24.         uint8 i;
  25.         food.x = rand() % WIDTH;        //范圍1-16;
  26.         food.y = rand() % LENGTH;        //獲得隨機數(shù)種子;//用計數(shù)器作為隨機數(shù)發(fā)生器
  27.         for(i=1;i<(snake.node);i++)//檢測產(chǎn)生的食物是否與蛇本身重疊
  28.         {
  29.                 if((food.x==snake.x[i])&&(food.y==snake.y[i]))
  30.                         Create_Food();        //重疊則重新成生
  31.         }
  32. }

  33. static void Snake_Init()
  34. {        
  35.         uint8 c;        
  36.         for(c=0;c < MAX_SNAKE;c++)//清除內(nèi)存數(shù)據(jù)
  37.         {
  38.                 snake.x[c]=-1;
  39.                 snake.y[c]=-1;
  40.         }
  41.         snake.life = 1;                                //賦予蛇生命
  42.         snake.node = 3;                        //默認長度3節(jié)
  43.         snake.direc = up;//初始方向
  44.         snake.x[0]=4;
  45.         snake.y[0]=5;
  46.         snake.x[1]=4;
  47.         snake.y[1]=4;
  48.         snake.x[2]=4;
  49.         snake.y[2]=3;
  50.         speeds = NORSPEED;         //游戲速度
  51.         tms = 0;
  52.         scores = 0;
  53.         Create_Food();                //生成第一個食物
  54. }

  55. static void Snake_Run()        //蛇爬行算法
  56. {        
  57.         uint8 i;
  58.         for(i=(snake.node-1);i>0;i--)                //蛇頭作為前進引導,長江后浪推前浪
  59.         {
  60.                 snake.y[i]=snake.y[i-1];
  61.                 snake.x[i]=snake.x[i-1];
  62.         }
  63.         switch (snake.direc)        //根據(jù)蛇的方向標前進
  64.         {
  65.                 case up:         snake.y[0]+=1;        break;
  66.                 case down:        snake.y[0]-=1;        break;
  67.                 case left:        snake.x[0]-=1;        break;
  68.                 case right:        snake.x[0]+=1;        break;
  69.         }
  70. }

  71. static void Snake_Disp()        //游戲畫面顯示
  72. {
  73.         uint8 p = 16;
  74. //        for(p=0;p<snake.node;p++)//繪制蛇圖像
  75. //        {               
  76. //                delayus(500-duty);
  77. //                DisPoint(snake.x[p],snake.y[p]);
  78. //                delayus(duty/5);
  79. //                cdata = 0xff;
  80. //        }
  81. //        DisPoint(food.x,food.y);//繪制食物圖像
  82. //        delayus(duty);
  83. //        cdata = 0xff;
  84. //        
  85. //        for(i=0;i<16;i++)
  86. //        {
  87. //                DispRAM[i] = 0;
  88. //        }
  89.         while(p--) DispRAM[p]=0;        //清除緩存        
  90.         for(p=0;p<snake.node;p++)        //寫入新緩存
  91.         {        
  92.                 DispRAM[snake.y[p]] |= 0x80 >> (snake.x[p]);
  93.         }
  94. //        DispRAM[food.y] |= 0x80 >> (food.x);
  95.         
  96.         MatxDisp(DispRAM,duty);
  97.         DisPoint(7-food.x,food.y);
  98.         delayus(duty);
  99. }

  100. void Snake_Game()        //游戲過程
  101. {
  102.         Snake_Init();                //初始化游戲
  103.         Play_Music(sound_canon);
  104.         while(snake.life)        //有生命,便可玩
  105.         {
  106.                 uint8 i;
  107.                 switch(keypad)//直接讀取鍵值,貪吃蛇不需要消抖
  108.                 {
  109.                         case K_UP:        if((snake.direc==left)||(snake.direc==right))        snake.direc=up;
  110.                                 //按下UP鍵時,只有蛇在水平方向時才能改變
  111.                                 break;
  112.                         case K_DOWN:if((snake.direc==left)||(snake.direc==right))        snake.direc=down;
  113.                                 //按下DOWN鍵時,只有蛇在水平方向時才能改變
  114.                                 break;
  115.                         case K_LEFT:if((snake.direc==up)||(snake.direc==down))                snake.direc=left;
  116.                                 //按下left鍵時,只有蛇在垂直方向時才能改變
  117.                                 break;
  118.                         case K_RIGHT:if((snake.direc==up)||(snake.direc==down))                snake.direc=right;
  119.                                 //按下right鍵時,只有蛇在垂直方向時才能改變
  120.                                 break;
  121.                         default :
  122.                                 break;
  123.                 }
  124.                
  125.                 if(KEY_OK==0) speeds = ASPEED;//加速鍵
  126.                 else speeds = NORSPEED;
  127.                 keypad = K_NULL;
  128.                
  129.                 if(tms > speeds)        //半秒前進一格
  130.                 {
  131.                         tms=0;
  132.                         Snake_Run();        //無聊散步
  133.                 }
  134.                 if((snake.x[0]==food.x) && (snake.y[0]==food.y))//是否吃到食物
  135.                 {
  136.                         Sound_Tone(sound_ON,4,5);
  137. //                        getfood=1;//直接在此增加蛇長度會在下一個顯示掃描產(chǎn)生一個原有數(shù)據(jù)留影,故通過加長
  138.                         snake.node++;
  139. //                        game_speed-=10;        //每吃一個食物增加10點速度
  140.                         Create_Food();        //產(chǎn)生新食物
  141.                 }
  142.                 if((snake.x[0]>WIDTH-1)||(snake.x[0]<0)||(snake.y[0]>LENGTH-1)||(snake.y[0]<0))//是否碰壁
  143.                 {
  144.                         snake.life=0;        //蛇碰到墻壁死亡
  145.                 }
  146.                 for(i=3;i<snake.node;i++)//從蛇的第四節(jié)開始判斷是否撞到自己了,因為蛇頭不可能撞到二三四節(jié)
  147.                 {
  148.                         if((snake.x[i]==snake.x[0])&&(snake.y[i]==snake.y[0]))//是否自殘
  149.                                 snake.life=0;        //蛇頭碰到自身死亡
  150.                 }
  151.                 Snake_Disp();        //顯示游戲圖像
  152.                 scores = snake.node-3;
  153.                 SMG_Display(scores,duty);
  154.         }
  155.         scores = snake.node-3;
  156.         TR2_OFF;
  157. }
復制代碼
  1. /*
  2. //作者:鄭梓濱        Jaupin@126.com
  3. //日期:2014年10月27日14:04:35   
  4. //功能:復古掌上俄羅斯方塊游戲機源代碼,包括游戲GUI,俄羅斯方塊、貪吃蛇、經(jīng)典賽車游戲、射擊障礙物游戲
  5. v1.0:
  6.         2014-7-26 00:00:00        :完成有俄羅斯方塊游戲基本模型;
  7.         2014-7-28 02:12:03        :將原先臨時使用的延時鍵盤掃描改為外部中斷狀態(tài)位檢測鍵;
  8.         2014-7-28 20:40:37        :完成俄羅斯方塊分數(shù)計數(shù)及分數(shù)顯示功能;
  9.         2014-8-1 01:01:54        :將較早之前完成貪吃蛇游戲代碼合并植入;
  10.         2014-8-2 17:04:25        :整理之前的臨時源碼,使工程文件規(guī)范化;
  11.         2014-8-3 23:50:49        :構建游戲選擇畫面基本模型,完成畫面平移效果;
  12.         2014-8-5 00:50:04        :改進LED點陣底層驅(qū)動,用軟件PWM調(diào)節(jié)畫面亮度;
  13.         2014-8-7 00:53:35        :完成賽車游戲,用PWM分層掃描畫面,形成游戲畫面對比度;
  14.         2014-8-8 02:16:44        :完成賽車游戲選擇預覽畫面,并將三個游戲合并在一起;
  15.         2014-8-12 01:47:07        :將逐行掃描改為逐點掃描,使顯示亮度均勻;增加亮度調(diào)節(jié)功能;
  16.         2014-9-9 00:32:40        :修改及優(yōu)化若干細節(jié);
  17. v1.1:
  18.         2014-9-18 0:57:23        :重新布局電路,修改原先不合理的地方,為制作PCB板作準備;
  19.         2014-9-19 22:02:36        :加入游戲音效,并且可以通過軟件方式開關聲音;
  20.         2014-9-21 14:59:39        :增加三位mini數(shù)碼管,實時顯示游戲分數(shù),數(shù)碼管共用點陣并行數(shù)據(jù)口;
  21.         ~~~~~~~~~~~忘記備注
  22.         2014-10-20 21:30:15        :加入射擊游戲,將GUI模塊化,簡化流程
  23. */

  24. #include "config.h"
  25. volatile uint8 data keypad = K_NULL;        //鍵盤狀態(tài)
  26. volatile uint8 data keycont = 0;                //鍵盤檢測消抖定時器
  27. volatile uint16 data tms = 0;                        //1ms T0定時器
  28. bit key_state = 0;                                                //按鍵狀態(tài)

  29. uint16 data speeds = 0;                //游戲速度
  30. uint16 data scores = 0;                //游戲計分
  31. bit Glife = 1;                                //游戲生命
  32. bit sound_ON = 1;                        //音效開關
  33. uint8 data duty = 80;                //PWM,默認亮度
  34. uint8 data DispRAM[16]={0};
  35. uint8 code bitman[8]={1,2,4,8,16,32,64,128};//用于數(shù)字序號定位0~7bit位

  36. uint8 code num[10][5]=                //陽碼
  37. {
  38.         {0x7,0x5,0x5,0x5,0x7},
  39.         {0x2,0x6,0x2,0x2,0x7},
  40.         {0x7,0x1,0x7,0x4,0x7},
  41.         {0x7,0x1,0x7,0x1,0x7},
  42.         {0x5,0x5,0x7,0x1,0x1},
  43.         {0x7,0x4,0x7,0x1,0x7},
  44.         {0x7,0x4,0x7,0x5,0x7},
  45.         {0x7,0x1,0x1,0x1,0x1},
  46.         {0x7,0x5,0x7,0x5,0x7},
  47.         {0x7,0x5,0x7,0x1,0x7}
  48. };

  49. /*********************PORT_INIT********************/
  50. void Port_Init()
  51. {
  52.         P0M0 = 0Xff;
  53.         P0M1 = 0X00;
  54.         P1M0 = 0Xff;
  55.         P1M1 = 0X00;
  56.         P2M0 = 0Xff;
  57.         P2M1 = 0X00;
  58.         P3M0 = 0X00;
  59.         P3M1 = 0X00;
  60.         P4M0 = 0Xff;
  61.         P4M1 = 0X00;
  62.         P5M0 = 0Xff;
  63.         P5M1 = 0X00;
  64. }

  65. void Init_Timer()
  66. {
  67. /******************定時器0中斷設置**********************/
  68.         AUXR |= 0x80;                   //定時器0為1T模式
  69.     TMOD = 0x00;                    //設置定時器為模式0(16位自動重裝載)
  70.     TL0 = T1MS;                     //初始化計時值
  71.     TH0 = T1MS >> 8;
  72.     TR0 = 1;                        //定時器0開始計時
  73.     ET0 = 1;                        //使能定時器0中斷
  74.         
  75. /*****************外部中斷設置*************************/        
  76.         IT0 = 1;                    //設置INT0下降沿觸發(fā)
  77.     EX0 = 1;                    //使能外部中斷INT0
  78.         IT1 = 1;                    //設置INT1下降沿觸發(fā)
  79.     EX1 = 1;                    //使能外部中斷INT1
  80.         INT_CLKO |= 0x70;           //使能INT2,INT3,INT4(EX4 = 1,EX3 = 1,EX2 = 1
  81.         
  82.         EA = 1;        
  83. }

  84. void Array_CLR(uint8 *p)
  85. {
  86.         uint8 i=0;
  87.         while(i!=16)
  88.         {
  89.                 p[i] = 0x00;
  90.                 i++;
  91.         }
  92. }

  93. void ShowScore(uint score)
  94. {
  95.         uint8 i;
  96.         uint8 qx,bx,sx,gx;
  97.         qx = score /1000;
  98.         bx = score %1000 /100;
  99.         sx = score %100/10;
  100.         gx = score %10;

  101.         Array_CLR(DispRAM);

  102.         for(i=0;i<5;i++)
  103.                 DispRAM[8-i] = (num[sx][i]<<4) | (num[gx][i]);
  104.         
  105.         for(i=0;i<5;i++)
  106.                 DispRAM[14-i] = (num[qx][i]<<5) | (num[bx][i]<<1);
  107.                                 
  108. //        MatxDisp(DispRAM,duty);
  109. }

  110. void main()
  111. {
  112.         Port_Init();
  113.         Sound_Init();
  114.         Init_Timer();
  115.         Sound_Tone(1,14,5);//滴
  116.         
  117.         srand(TL0);               
  118.         delayms(100);
  119.         Play_Music(sound_game_start);
  120.         Flash_Screen_Clear();
  121.         while(1)
  122.         {
  123.                 tms = 0;
  124.                 keypad = K_NULL;//清除按鍵狀態(tài)
  125.                 switch (GUI_Main())        //進入用戶游戲選擇界面,返回選擇的游戲
  126.                 {
  127.                         case 1:        Tetris_Game();        break;
  128.                         case 2:        Snake_Game();        break;
  129.                         case 3:        RAC_Game();                break;
  130.                         case 4:        Shot_Game();        break;
  131.                 }
  132.                 Play_Music(sound_game_over);
  133.                 Flash_Screen_Clear();
  134.                 ShowScore(scores);        //將分數(shù)載入顯存
  135.                 delayms(300);
  136.                
  137.                 keypad = K_NULL;
  138.                 while(keypad != K_UP)        //在沒按下OK鍵時保持分數(shù)顯示
  139.                 {
  140.                         MatxDisp(DispRAM,duty);
  141.                         SMG_Display(scores,duty);
  142.                 }
  143.         }        
  144. }

  145. /* Timer0 interrupt routine */
  146. void T0_Timer_1ms_int() interrupt 1 using 1
  147. {
  148.         if(tms<0xfffe)        tms++;        //防止溢出
  149.         if(key_state){ if(!--keycont) key_state=0;}

  150.         if(PIN_TR2)//TR2如果打開,則開始播放音效
  151.         {
  152.                 if(!sound_cnt_time--)
  153.                 {
  154.                         TR2_OFF;
  155.                         beep = 1;
  156.                         if(music_p[s_p][1])
  157.                         {
  158.                                 Sound_Tone(sound_ON,music_p[s_p][0],music_p[s_p][1]);
  159.                                 s_p++; //自動裝載下一個音符,實現(xiàn)音效與游戲“同時”運行
  160.                         }
  161.                 }
  162.         }
  163.         if(KEY_DOWN==0 & KEY_UP==0)        IAP_CONTR=0x60;//軟件復位下載程序
  164. }

  165. void T2_Timer_Sound_freq() interrupt 12           //中斷入口
  166. {
  167.      beep = ~beep; //蜂鳴器頻率震動
  168. }

  169. uint8 Get_Kvuale(uint8 key_delay)//鍵值消抖處理,參數(shù)為靈敏度調(diào)節(jié)
  170. {
  171.         uint8 kvuale = K_NULL;        //返回的初始值為空值
  172.         if(keypad != K_NULL)        //當鍵值不為NULL時,說明有按鍵按下
  173.         {        
  174.                 if(!key_state)                //當按鍵狀態(tài)位state為0時說明是第一次觸發(fā)有效,為1時為重復觸發(fā)
  175.                 {
  176.                         key_state=1;        //置1,防止重復觸發(fā)
  177.                         kvuale = keypad;//獲得讀取鍵值
  178.                         keycont = key_delay;//載入消抖時間
  179.                 }
  180.                 keypad = K_NULL;        //清楚鍵值
  181.         }
  182.         return kvuale;
  183. }
  184. /*********外部中斷按鍵區(qū)**********/
  185. void exint0() interrupt 0       //INT0
  186. {
  187.         keypad = 0;
  188. }
  189. void exint1() interrupt 2       //INT1
  190. {
  191.         keypad = 1;        
  192. }
  193. void exint2() interrupt 10      //INT2
  194. {
  195.         keypad = 2;
  196. }
  197. ……………………

  198. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


所有資料51hei提供下載:
GAMEBOX_CODE_Keil5_v1.1.zip (291.3 KB, 下載次數(shù): 19)


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

使用道具 舉報

沙發(fā)
ID:577675 發(fā)表于 2019-7-4 10:46 | 只看該作者
啊啊啊啊啊,好糾結啊,學校要求做一個這個
回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表