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

標題: 單片機貪吃蛇小游戲制作 原理圖+程序+元件清單 [打印本頁]

作者: 釋你    時間: 2019-2-3 21:27
標題: 單片機貪吃蛇小游戲制作 原理圖+程序+元件清單
內含完整程序和元件清單等資料            

Altium Designer畫的電路原理圖如下:(51hei附件中可下載工程文件)



貪吃蛇元件清單
序號    元件    數量    備注
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    八位數碼管    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接口

單片機源程序如下:
  1. /**************************************************************************************
  2. *                                              貪吃蛇參考程序                                                                                        *
  3. 實現現象:下載程序后數碼管無顯示,按下獨立按鍵實現對應的功能
  4.                         K1        :        向上
  5.                         K2        :        向下
  6.                         K3        :        向左
  7.                         K4        :        向右

  8. 注:       初始點陣顯示貪吃蛇(三個連續的點表示)在左上角向右移動,按下按鍵K1控制貪吃蛇向上移動;
  9.        按下K2控制貪吃蛇向下移動;按下K3控制貪吃蛇向左移動;按下K4控制貪吃蛇向右移動。吃到食物后
  10.        等待2s會再次出現食物;食物出現后8S內必須吃到食物,否則游戲結束,同時數碼管顯示得分。食物
  11.        出現后2s內吃到食物得6分、4s秒內吃到食物得4分、6s內吃到食物得2分、8s內吃到食物得1分。每吃
  12.        到一個食物貪吃蛇的速度會加快一次,加到一定的程度并且分數小于100時會恢復初始速度、分數大于
  13.        等與100小于200時速度恢復為初始速度的5/3倍、分數大于400時速度幾乎不恢復!


  14.        部分端口未更改,端口配置需與實際電路相對應
  15.        本程序僅供參考,未經作者允許不可用于商業用途!

  16.         所使用開發板為普中科技單片機CH6800-ES V2.0開發板

  17. 作者:        魏        賽        東
  18. *                                                                                                                                                                  
  19. ***************************************************************************************/

  20. #include <reg52.h>
  21. #include <intrins.h>
  22. #define io0 P0
  23. #define io2 P1

  24. typedef unsigned int u1;
  25. typedef unsigned char u2;

  26. sbit ser=P2^4;                                                                                                        //輸入端
  27. sbit rclk=P2^5;                                                                                                        //保存所有輸出數據
  28. sbit srclk=P2^6;                                                                                                  //移位
  29. sbit k1=P3^1;
  30. sbit k2=P3^0;
  31. sbit k3=P3^2;
  32. sbit k4=P3^3;
  33. sbit LSC=P3^4;
  34. sbit LSB=P3^5;
  35. sbit LSA=P3^6;                                                                                            

  36. int k[3]={0,0,0},l[3]={0,1,2},m[2]={0,0},n[2]={1,2},j1=0;
  37. u1 code smg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  38. u2 act=4,a=0,time1=50;
  39. u1 a1,a2,scor=0;
  40. static u1 s30;
  41. static u1 ms2000;
  42. u2 code liexuan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};        //用code不能重新賦值
  43. u2 heng[8][8]=  {
  44.                                 {0,0,0,0,0,0,0,0},
  45.                                 {0,0,0,0,0,0,0,0},
  46.                                 {0,0,0,0,0,0,0,0},
  47.                                 {0,0,0,0,0,0,0,0},
  48.                                 {0,0,0,0,0,0,0,0},
  49.                                 {0,0,0,0,0,0,0,0},
  50.                                 {0,0,0,0,0,0,0,0},
  51.                                 {0,0,0,0,0,0,0,0}
  52.                                 };                                               

  53. void delay(u1 i)
  54. {
  55.         while(i--);                                                                          
  56. }

  57. void Timer0Init()
  58. {
  59.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

  60.         TH0=0Xe0;        //給定時器賦初值,定時8ms
  61.         TL0=0Xc0;       
  62.         ET0=0;//關閉定時器0中斷允許
  63.         EA=1;//打開總中斷
  64.         TR0=1;//打開定時器                       
  65. }

  66. void Timer1Init()
  67. {
  68.         TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。

  69.         TH1=0XFC;        //給定時器賦初值,定時1ms
  70.         TL1=0X18;       
  71.         ET1=1;//打開定時器1中斷允許
  72.         EA=1;//打開總中斷
  73.         TR1=1;//打開定時器                       
  74. }

  75. void ank1()                                                                                         //橫選
  76. {
  77.         static u2 ank1_flag;
  78.         if(k1)
  79.                 ank1_flag = 1;                                                                                                  
  80.         if(!k1 && ank1_flag)
  81.         {
  82.                 delay(1000);
  83.                 if(!k1)
  84.                 {
  85.                         act=1;
  86.                         ank1_flag = 0;                                               
  87.                 }
  88.         }
  89. }

  90. void ank2()                                                                                         //列選
  91. {
  92.         static u2 ank2_flag;
  93.         if(k2)
  94.                 ank2_flag = 1;                                                                                                  
  95.         if(!k2 && ank2_flag)
  96.         {
  97.                 delay(1000);
  98.                 if(!k2)
  99.                 {
  100.                         act=2;
  101.                         ank2_flag = 0;
  102.                 }
  103.         }
  104. }

  105. void ank3()
  106. {
  107.         static u2 ank3_flag;
  108.         if(k3)
  109.                 ank3_flag = 1;                                                                                                  
  110.         if(!k3 && ank3_flag)
  111.         {
  112.                 delay(1000);
  113.                 if(!k3)
  114.                 {
  115.                         act=3;
  116.                         ank3_flag = 0;
  117.                 }
  118.         }
  119. }

  120. void ank4()                                                                                           //點陣亮滅
  121. {       
  122.         static u2 ank4_flag;
  123.         if(k4)
  124.                 ank4_flag = 1;                                                                                                  
  125.         if(!k4 && ank4_flag)
  126.         {
  127.                 delay(1000);
  128.                 if(!k4)
  129.                 {
  130.                         act=4;
  131.                         ank4_flag = 0;
  132.                 }
  133.         }
  134. }

  135. void fanzhuan()
  136. {
  137.         heng[l[0]][k[0]]=~heng[l[0]][k[0]];
  138.         heng[l[1]][k[1]]=~heng[l[1]][k[1]];
  139.         heng[l[2]][k[2]]=~heng[l[2]][k[2]];
  140. }

  141. void yidong(u2 x)
  142. {
  143.         switch(x)
  144.         {
  145.                 case 1: k[2]--;
  146.                                 if(k[2]==-1)
  147.                                         k[2]=7;break;
  148.                 case 2:        k[2]++;
  149.                                 if(k[2]==8)
  150.                                         k[2]=0;break;
  151.                 case 3:        l[2]--;
  152.                                 if(l[2]==-1)
  153.                                         l[2]=7;break;
  154.                 case 4:        l[2]++;
  155.                                 if(l[2]==8)
  156.                                         l[2]=0;break;
  157.         }
  158. }

  159. void dianzhen()
  160. {
  161.         u2 i,j,time;
  162.         fanzhuan();
  163.         for(time=0;time<time1;time++)
  164.         {
  165.                 ank1();ank2();ank3();ank4();
  166.                 for(i=0;i<8;i++)
  167.                 {
  168.                         srclk=0;
  169.                         rclk=0;
  170.                         for(j=0;j<8;j++)
  171.                         {
  172.                                 ser=heng[i][j];
  173.                                 srclk=1;
  174.                                 delay(2);
  175.                                 srclk=0;       
  176.                         }
  177.                         rclk=1;
  178.                         delay(2);
  179.                         rclk=0;
  180.                         io0=liexuan[i];
  181.                         delay(100);
  182.                         io0=0xff;
  183.                 }
  184.         }
  185.         fanzhuan();
  186.          
  187.         yidong(act);
  188.         k[1]=m[1];l[1]=n[1];
  189.         k[0]=m[0];l[0]=n[0];
  190.         m[1]=k[2];n[1]=l[2];
  191.         m[0]=k[1];n[0]=l[1];
  192.         if(k[2]==a1&&l[2]==a2&&j1)
  193.         {
  194.                 ET0=0;
  195.                 heng[a2][a1]=~heng[a2][a1];
  196.                 ET1=1;
  197.                 if(s30<250)
  198.                         scor+=6;
  199.                 else if(s30<500)
  200.                         scor+=4;
  201.                 else if(s30<750)
  202.                         scor+=2;
  203.                 else
  204.                         scor++;
  205.                 s30=0;
  206.                 TH0=0xe0;
  207.                 TL0=0xc0;
  208.                 if(time1>2)
  209.                         time1-=5;
  210.                 if(time1<5&&scor<100)
  211.                         time1=50;
  212.                 else if(time1<5&&scor<200)
  213.                         time1=30;
  214.                 else if(time1<5&&scor>400)
  215.                         time1=2;
  216.                 j1=0;
  217.         }
  218. }

  219. void main()
  220. {
  221.         Timer1Init();
  222.         Timer0Init();
  223.         while(1)
  224.         {
  225.                 dianzhen();       
  226.         }
  227. }

  228. void Timer1() interrupt 3
  229. {
  230.         TH1=0XFC;        //給定時器賦初值,定時1ms
  231.         TL1=0X18;
  232.         ms2000++;
  233.         a+=(l[2]+k[1]);
  234.         if((a%10)>7)
  235.                 a+=2;
  236.         if((a/10%10)>7)
  237.                 a+=20;
  238.         if(a>2000)
  239.         {
  240.                 a=l[1]+k[2];
  241.                 if(a%10>7)
  242.                         a-=2;
  243.         }
  244.         if(ms2000==2000)
  245.         {
  246.                 ms2000=0;
  247.                 a1=a%10;
  248.                 a2=a/10%10;
  249.                 if(a1==k[0]||a1==k[1]||a1==k[2])
  250.                         if(k[2]<5)
  251.                                 a1+=2;
  252.                         else
  253.                                 a1-=2;
  254.                 if(a2==l[0]||a2==l[1]||a2==l[2])
  255.                         if(l[2]<5)
  256.                                 a2+=2;
  257.                         else
  258. ……………………

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

所有資料51hei提供下載:
貪吃蛇小游戲.zip (51.52 KB, 下載次數: 66)


作者: 單片機_大神    時間: 2019-3-14 22:17
非常謝謝樓主分享
作者: 745623472    時間: 2019-4-14 13:54
學到了
作者: 阿偉死了    時間: 2019-4-22 19:56
樓主能不能分享一下實物圖呀
作者: 風光好    時間: 2019-5-29 10:06
在普中開發板上試了之后為什么不行呢
作者: 風光好    時間: 2019-6-11 22:14
普中的這個開發板實現不了啊
作者: 小滄月兒    時間: 2019-12-10 12:30
這個有問題  大家都不要下載   我下載了  原理圖都有問題


作者: wangyingrui888    時間: 2019-12-16 23:04
非常感謝樓主分享




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩欧美亚洲 | 97色综合| 欧美日韩亚洲系列 | 欧美性猛交一区二区三区精品 | 在线成人 | www.黄色在线观看 | 亚洲欧美高清 | 国产精品视频观看 | 高清av一区 | 精品日韩一区 | 欧美成人不卡 | 亚洲精彩视频 | 国产精品美女一区二区三区 | 久久久做| 91免费电影 | 精品国产乱码久久久久久丨区2区 | 欧美二区在线 | 亚洲一区二区在线免费观看 | 91精品国产综合久久小仙女图片 | 成人av免费 | 欧美日韩精品一区二区三区四区 | 在线视频亚洲 | 色视频网站 | 国产精品免费一区二区三区 | 国产精品一区二区三区久久久 | 99久久久国产精品 | 亚洲一区二区免费看 | 精品国产乱码久久久久久老虎 | 国产精品久久久久一区二区三区 | 日韩欧美三级电影在线观看 | 日本成人区 | www国产成人免费观看视频,深夜成人网 | 国产精品久久久久久一级毛片 | 嫩草懂你的影院入口 | 伊人久久综合 | 久久久久久久久久久久久久av | 日本五月婷婷 | 亚洲精品一级 | 欧美一区二区久久 | 日一区二区三区 | 狠狠色综合欧美激情 |