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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4308|回復: 6
收起左側

單片機俄羅斯方塊源程序和proteus仿真工程文件 帶視頻

[復制鏈接]
ID:137190 發表于 2016-9-25 16:07 | 顯示全部樓層 |閱讀模式
視頻教程:


這個51單片機俄羅斯方塊的資料很全,原理圖 仿真 教程 視頻都有.
0.png 0.png 0.png 0.png

單片機做的俄羅斯方塊所有資料下載:
俄羅斯方塊.rar (5.38 MB, 下載次數: 53)


  1. /*****************************************************************************************
  2. 名稱:《基于8052單片機和8X16點陣屏俄羅斯方塊游戲板》
  3. 時間:05月23日17時
  4. 單位:武漢理工大學信息學院電子1003班
  5. 作者:顏
  6. *****************************************************************************************/
  7. #include<reg52.h>
  8. #include<stdlib.h>
  9. #include<math.h>
  10. #define uchar unsigned char
  11. sbit slock=P2^7;                                        //譯碼器輸出使能端
  12. sbit upkey=P2^3;                                        //“旋轉圖形/向上”按鍵
  13. sbit leftkey=P2^1;                                        //“左移/向左”按鍵
  14. sbit rightkey=P2^2;                                        //“右移/向右”按鍵
  15. sbit downkey=P2^0;                                        //“快速下移/向下”按鍵
  16. sbit duan=P2^5;                                                //數碼管段選信號所用鎖存器的鎖存允許端
  17. sbit wei=P2^6;                                                //數碼管位選信號所用鎖存器的鎖存允許端
  18. sbit startsuspendkey=P2^4;                        //“開始/暫停/繼續”多功能切換按鍵
  19. /***********************************圖形編碼機制介紹**************************************
  20. 1.由于俄羅斯方塊圖形的寬度和高度最多只有四位,所以要以4X4為基本單元。
  21. 2.硬件采用16行掃描、8位送顯示信號
  22. 3.各個圖形的寬度不一致,所以要人為給圖形設定居中位置。
  23.   若圖形寬度為偶數可直接將其居中,若為奇數則靠左居中。
  24. 4.由于圖形需要旋轉,所以由基本的圖形會衍生出另外3種圖形。
  25. 5.因此每個圖形應該給定4個8位的二進制碼,并放入一個二維數組里。
  26. 6.經典俄羅斯方塊游戲里有19種不同形狀的方塊,包括旋轉得到的。
  27. 7.數組的第一個下標為該圖形的編號
  28. *****************************************************************************************/
  29. uchar code allshape[19][4]={0x00,0x00,0x18,0x18,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x3c,
  30.                                                         0x00,0x08,0x18,0x10,0x00,0x00,0x30,0x18,0x00,0x10,0x18,0x08,
  31.                                                         0x00,0x00,0x18,0x30,0x00,0x08,0x08,0x18,0x00,0x00,0x38,0x08,
  32.                                                         0x00,0x18,0x10,0x10,0x00,0x00,0x20,0x38,0x00,0x10,0x10,0x18,
  33.                                                         0x00,0x00,0x08,0x38,0x00,0x18,0x08,0x08,0x00,0x00,0x38,0x20,
  34.                                                         0x00,0x00,0x10,0x38,0x00,0x08,0x18,0x08,0x00,0x00,0x38,0x10,
  35.                                                         0x00,0x10,0x18,0x10};
  36. /****************************************************************************************/
  37. uchar code number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};        //數碼管數形顯示編碼
  38. uchar code weima[4]={0x01,0x02,0x04,0x08};                                                                        //位選信號編碼,方便寫循環使用
  39. char shapewidth[19]={2,1,4,2,3,2,3,2,3,2,3,2,3,2,3,3,2,3,2};                                //各個圖形的寬度屬性,用于判斷左移和右移的步格數上限
  40. char shaperotate[19]={0,2,1,4,3,6,5,8,9,10,7,12,13,14,11,16,17,18,15};                //旋轉圖形時,用于改變圖形的編號以實現圖形的切換
  41. uchar staticdata[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff};                        //用于存儲方塊降落后固定顯示的圖形信息
  42. uchar rate[5]={0,1,3,6,10};                                                                                                        //規定一次性消掉的行數的分數獎勵機制


  43. /****************************************全局變量聲明************************************/
  44. char y;                                        //方塊位置屬性:底部下落的高度,y=0時:剛剛出現,y=15時:下落到屏幕最底部
  45. char shapenum;                        //方塊形狀屬性:從0到18
  46. int left;                                 //方塊位置屬性:方塊偏離居中位置的格數,不同的方塊left值的上限不同
  47. int mark;                                //玩家分數變量
  48. int speed;                                //方塊下落速度變量
  49. int initialspeed;                //方塊下落的初始速度
  50. int systemspeed;                //系統下落速度,此值會隨著玩家分數的增加而減小,相應的下落速度會增大
  51. int fastspeed;                        //當用戶按下down鍵時,方塊下落速度為此值
  52. int k;                                        //一個全局循環變量,“幀數”變量
  53. int startcontrol=1;                //開始畫面狀態指示變量,為1時說明程序進入開機歡迎界面
  54. int suspendcontrol=0;        //游戲暫停與游戲繼續畫面狀態指示變量,為1說明處在暫停界面,為0說明處在繼續畫面
  55. int randnum;                        //隨機數變量,用于產生隨機方塊
  56. /****************************************************************************************/


  57. /****************************************函數聲明****************************************/
  58. void delayms(int);                                //粗略延時函數
  59. uchar move(uchar,int);                        //對二進制碼實行移位,可為負值
  60. void shapedisplay();                        //對點陣掃描一場,對數碼管掃描一場,用于顯示圖形和數字
  61. void keyscan();                                        //對所有鍵盤掃描一次,并執行相應運算和操作
  62. uchar check(char,int);                        //用于檢查方塊將要下落的位置或是將要旋轉的位置是否有障礙
  63. uchar shapedisappear();                        //用于消行,返回一次性消掉的行數
  64. numberdisplay(int amark);                //用于四位數字顯示
  65. void startimage();                                //游戲等待開始畫面函數
  66. void overimage();                                //游戲結束后的畫面
  67. void dataset();                                        //對數據初始化,為游戲重新開始做準備
  68. /****************************************************************************************/


  69. /*****************************************主函數*****************************************/
  70. void main()
  71. {
  72.         char j;
  73.         startimage();                                        //進入開機,函數內有鍵盤掃描,只有按下“開始”鍵會退出函數,否則不退出
  74.         dataset();                                                //對數據進行初始化
  75.         while(1){                                                //進入大循環
  76.                 k=speed;                                        //確定顯示的幀數
  77.                 while(k--){
  78.                         keyscan();                                //掃描鍵盤,放入高速循環語句中提高鍵盤的響應速度,并檢測此時用戶是否有相應請求
  79.                         shapedisplay();                        //顯示圖形和數字
  80.                 }
  81.                 y++;                                                //圖形下落一格
  82.                 if(check(shapenum,left)){        //在沒有顯示之前判斷將要下落的位置是否有障礙物,如果有障礙就進入到if語句中
  83.                         if(y==1){                                //如果y=1;說明方塊剛出現就遇到障礙物了,這時游戲需結束
  84.                                 overimage();                //進入游戲結束畫面,此函數內沒有鍵盤掃描,運行一段時間會自動退出
  85.                                 startimage();                //又進入開機畫面
  86.                                 dataset();                        //對數據進行初始化,將前一用戶數據清零        
  87.                         }
  88.                         else{                                                                                                        //遇到障礙物,但還不至于圖形不能出現
  89.                                 y--;                                                                                                //y回到原值
  90.                                 for(j=0;j<4;j++){                                                                        //將下落形狀的值賦給固定圖形,形成停留顯示的效果
  91.                                         staticdata[y+j]+=move(allshape[shapenum][j],left);
  92.                                 }
  93.                                 mark+=rate[shapedisappear()];                                                //消掉已拼滿的函數,并記錄所得分數
  94.                                 y=0;                                                                                                //為下一個方塊賦屬性值:從第一行出現
  95.                                 left=0;                                                                                                //為下一個方塊賦屬性值:居中顯示
  96.                                 randnum=rand()%19;shapenum=randnum;                                        //為下一個方塊賦屬性值:給定形狀
  97.                                 systemspeed=initialspeed-10*(mark/40);                                //計算相應分數下的系統速度值,分數越高,速度越快
  98.                                 speed=systemspeed;                                                                        //將此值賦給速度控制量
  99.                         }
  100.                 }
  101.         }
  102. }
  103. /****************************************************************************************/


  104. /***************************************自定義函數***************************************/
  105. void delayms(int xms)                          //粗略的延時函數
  106. {        
  107.         int i,j;
  108.         for(i=xms;i>0;i--)
  109.                 for(j=110;j>0;j--);
  110. }
  111. /****************************************************************************************/
  112. uchar move(uchar aa,int anum)        //移位函數        
  113. {                                                                 
  114.         if(anum>=0)
  115.                 aa<<=anum;
  116.         else
  117.                 aa>>=(-anum);
  118.         return aa;
  119. }
  120. /****************************************************************************************/
  121. void shapedisplay()                                //顯示函數
  122. {
  123.         uchar j;
  124.         for(j=y<3?3-y:0;j<4;j++){        //顯示動態方塊               
  125.                 slock=1;P1=j+y-3;P3=move(allshape[shapenum][j],left);
  126.                 slock=0;delayms(1);P3=0x00;
  127.         }
  128.         for(j=0;j<16;j++){                        //顯示靜態方塊
  129.                 slock=1;P1=j;P3=staticdata[j+3];
  130.                 slock=0;delayms(1);P3=0x00;
  131.         }
  132.         numberdisplay(mark);                //分數顯示        
  133. }
  134. /****************************************************************************************/
  135. numberdisplay(int amark)                //大數拆分并顯示,帶去無效零功能
  136. {
  137.         char i;
  138.         uchar num[4];
  139.         num[0]=amark/1000%10;num[1]=amark/100%10;num[2]=amark/10%10;num[3]=amark%10;
  140.         if(amark<10){                                   //顯示一位數
  141.                 for(i=3;i<4;i++){
  142.                         P0=0xff;
  143.                         duan=1;
  144.                         P0=number[num[i]];
  145.                         duan=0;
  146.                         P0=0x00;
  147.                         wei=1;
  148.                         P0=weima[i];
  149.                         wei=0;
  150.                         delayms(1);
  151.                         wei=1;
  152.                         P0=0x00;
  153.                         wei=0;
  154.                 }
  155.         }
  156.         else if(amark<100){                          //顯示兩位數
  157.                 for(i=2;i<4;i++){
  158.                         P0=0xff;
  159.                         duan=1;
  160.                         P0=number[num[i]];
  161.                         duan=0;
  162.                         P0=0x00;
  163.                         wei=1;
  164.                         P0=weima[i];
  165.                         wei=0;
  166.                         delayms(1);
  167.                         wei=1;
  168.                         P0=0x00;
  169.                         wei=0;
  170.                 }
  171.         }
  172.         else if(amark<1000){                  //顯示三位數
  173.                 for(i=1;i<4;i++){
  174.                         P0=0xff;
  175.                         duan=1;
  176.                         P0=number[num[i]];
  177.                         duan=0;
  178.                         P0=0x00;
  179.                         wei=1;
  180.                         P0=weima[i];
  181.                         wei=0;
  182.                         delayms(1);
  183.                         wei=1;
  184.                         P0=0x00;
  185.                         wei=0;
  186.                 }
  187.         }
  188.         else{                                                //顯示四位數
  189.                 for(i=0;i<4;i++){
  190.                         P0=0xff;
  191.                         duan=1;
  192.                         P0=number[num[i]];
  193.                         duan=0;
  194.                         P0=0x00;
  195.                         wei=1;
  196.                         P0=weima[i];
  197.                         wei=0;
  198.                         delayms(1);
  199.                         wei=1;
  200.                         P0=0x00;
  201.                         wei=0;
  202.                 }  
  203.         }         
  204.         return 0;
  205. }
  206. /****************************************************************************************/
  207. void keyscan()                                         //鍵盤掃錨并執行用戶輸入的指令
  208. {
  209.         if(leftkey==0&&(left<(shapewidth[shapenum]<3?3:2))&&!check(shapenum,left+1)&&startcontrol==0&&suspendcontrol==0){
  210.                 delayms(10);                        //按鍵無效條件:1.左移超邊緣;2.左移遇障礙;3.處在歡迎界面;4.處在暫停界面
  211.                 if(leftkey==0){        
  212.                         left++;                                //按鍵命令:方塊左移一位
  213.                         speed=systemspeed;
  214.                         while(!leftkey){                                                        
  215.                                 shapedisplay();                                
  216.                         }
  217.                 }
  218.         }
  219.         if(rightkey==0&&(left>(shapewidth[shapenum]<3?shapewidth[shapenum]-5:shapewidth[shapenum]-6))&&!check(shapenum,left-1)&&startcontrol==0&&suspendcontrol==0){
  220.                 delayms(10);                           //按鍵無效條件:1.右移超邊緣;2.右移遇障礙;3.處在歡迎界面;4.處在暫停界面
  221.                 if(rightkey==0){        
  222.                         left--;                                //按鍵命令:方塊右移一位
  223.                         speed=systemspeed;
  224.                         while(!rightkey){                        
  225.                                 shapedisplay();        
  226.                         }
  227.                 }
  228.         }
  229.         if(upkey==0&&!check(shaperotate[shapenum],left)&&(left<(shapewidth[shaperotate[shapenum]]<3?4:3))&&(left>(shapewidth[shaperotate[shapenum]]<3?shapewidth[shaperotate[shapenum]]-6:shapewidth[shapenum]-7))&&startcontrol==0&&suspendcontrol==0){
  230.                 delayms(10);                        //按鍵無效條件:1.翻轉超左右邊緣;2.翻轉遇障礙;3.處在歡迎界面;4.進入暫停界面
  231.                 if(upkey==0){        
  232.                         shapenum=shaperotate[shapenum];        //按鍵命令:將翻轉后的圖形編號賦給要顯示的圖形編號
  233.                         speed=systemspeed;
  234.                         while(!upkey){                        
  235.                                 shapedisplay();
  236.                         }
  237.                 }
  238.         }
  239.         if(downkey==0&&speed!=fastspeed&&startcontrol==0&&suspendcontrol==0){
  240.                 delayms(10);                        //按鍵無效條件:1.已經進入快速下降狀態;2.處在歡迎界面;3.進入暫停界面
  241.                 if(downkey==0){        
  242.                         speed=fastspeed;        //按鍵命令:將方塊下落速度加快
  243.                         k=speed;
  244.                         while(!downkey){
  245.                                 shapedisplay();
  246.                         }
  247.                 }
  248.         }
  249.         if(startsuspendkey==0&&startcontrol==1&&suspendcontrol==0){
  250.                 delayms(10);                           //按鍵有效條件:1.處在開始歡迎界面;2.處在暫停界面
  251.                 if(startsuspendkey==0){
  252.                         startcontrol=0;                           
  253.                         suspendcontrol=0;        //按鍵命令:使進入繼續游戲狀態
  254.                         while(!startsuspendkey){
  255.                         }
  256.                 }        
  257.         }
  258.          if(startsuspendkey==0&&startcontrol==0&&suspendcontrol==0){
  259.                 delayms(10);                         //按鍵無效條件:1.處在開始歡迎界面;2.處在暫停狀態
  260.                 if(startsuspendkey==0){
  261.                         suspendcontrol=1;        
  262.                         startcontrol=0;                //按鍵命令:狀態切換,使進入暫停狀態
  263.                         while(!startsuspendkey){
  264.                                 shapedisplay();        
  265.                         }
  266.                         while(suspendcontrol){
  267.                                 shapedisplay();
  268.                                 keyscan();                //等待結束暫停狀態的命令
  269.                         }                                                        
  270.                 }
  271.         }
  272.          if(startsuspendkey==0&&startcontrol==0&&suspendcontrol==1){
  273.                 delayms(10);                        //按鍵有效條件:處在暫停界面
  274.                 if(startsuspendkey==0){        
  275.                         suspendcontrol=0;
  276.                         startcontrol=0;                //按鍵命令:狀態切換,使進入繼續游戲狀態
  277.                         while(!startsuspendkey){
  278.                                 shapedisplay();
  279.                         }                                
  280.                 }
  281.         }
  282. }
  283. /****************************************************************************************/
  284. uchar check(char ashapenum,int aleft)        //判斷方塊是否會遇到障礙物
  285. {
  286.         char i=3,j=0;
  287.         while(!j&&i>=0){
  288.                 if((move(allshape[ashapenum][i],aleft)+staticdata[y+i])!=(move(allshape[ashapenum][i],aleft)|staticdata[y+i])){
  289.                         j++;
  290.                 }
  291.                 i--;
  292.         }
  293.         return j;                                                           //返回0,說明沒有障礙
  294. }
  295. /****************************************************************************************/
  296. uchar shapedisappear()                                           //方塊落定后消掉拼滿的行,并使沒有拼滿的行整體下移填補空缺行
  297. {
  298.         char i,j,r=4;
  299.         for(i=0;i<r;i++){
  300.                 if(staticdata[y+3-i]==0xff){
  301.                         for(j=y+3-i;j>0;j--){
  302.                                 staticdata[j]=staticdata[j-1];
  303.                         }
  304.                         i--,r--;
  305.                 }
  306.         }
  307.         return 4-r;                                                        //函數返回一次性消掉的行的數目
  308. }
  309. /****************************************************************************************/
  310. void startimage()                                                  //開機歡迎畫面,在沒有按鍵作用的時候會不斷執行
  311. {
  312.         uchar i,j;
  313.         startcontrol=1;
  314.         while(startcontrol){
  315.                 for(i=10;i>0;i--){
  316.                         for(j=0;j<16;j+=2){
  317.                                 slock=1;P1=j;P3=0xaa;
  318.                                 slock=0;delayms(1);P3=0x00;
  319.                         }
  320.                         for(j=1;j<16;j+=2){
  321.                                 slock=1;P1=j;P3=0x55;
  322.                                 slock=0;delayms(1);P3=0x00;
  323.                         }
  324.                         keyscan();                                           //隨時響應用戶輸入
  325.                 }               
  326.                 for(i=10;i>0;i--){
  327.                         for(j=1;j<16;j+=2){
  328.                                 slock=1;P1=j;P3=0xaa;
  329.                                 slock=0;delayms(1);P3=0x00;
  330.                         }
  331.                         for(j=0;j<16;j+=2){
  332.                                 slock=1;P1=j;P3=0x55;
  333.                                 slock=0;delayms(1);P3=0x00;
  334.                         }
  335.                         keyscan();                                        //隨時響應用戶輸入        
  336.                 }
  337.         }
  338. }
  339. /****************************************************************************************/
  340. void overimage()                                                  //游戲結束畫面,分數會強制閃爍8次,并自動結束
  341. {
  342.         int i,j;
  343.         for(j=0;j<8;j++){
  344.                 for(i=0;i<200;i++){
  345.                         numberdisplay(mark);        
  346.                 }
  347.                 delayms(500);
  348.         }
  349. }        
  350. /****************************************************************************************/
  351. void dataset()                                                           //數據全部清零,重新開始游戲
  352. {
  353.         char j;
  354.         y=0;
  355.         left=0;
  356.         shapenum=0;
  357.         initialspeed=100;
  358.         speed=initialspeed;
  359.         systemspeed=initialspeed;
  360.         fastspeed=5;
  361.         randnum=rand()%19;
  362.         shapenum=randnum;
  363.         mark=0;
  364.         for(j=0;j<19;j++){                                          //清除點陣上的顯示數據
  365.                 staticdata[j]=0;
  366.         }
  367. }
  368. /****************************************************************************************/
復制代碼

回復

使用道具 舉報

ID:304879 發表于 2018-4-10 18:09 | 顯示全部樓層
為什么我畫好圖,裝上編譯文件 .hex后,點開始仿真,卻不行。怎么辦
無標題2.png
回復

使用道具 舉報

ID:304879 發表于 2018-4-12 10:00 | 顯示全部樓層
好奇怪。仿真不了。不亮
回復

使用道具 舉報

ID:168911 發表于 2018-4-14 09:49 | 顯示全部樓層
是點陣不亮還是數碼管不亮?
回復

使用道具 舉報

ID:304879 發表于 2018-4-17 19:50 | 顯示全部樓層
老當益壯 發表于 2018-4-14 09:49
是點陣不亮還是數碼管不亮?

都不亮,如圖那樣
回復

使用道具 舉報

ID:365277 發表于 2018-7-6 13:49 | 顯示全部樓層
想問問電路圖上的s0~s7分別對應的什么腳位
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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