給大家分享一個51單片機做的點陣五子棋的程序源碼附帶proteus仿真電路圖。。。。。。。測試成功.
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- sbit SD=P2^4;
- sbit STCK=P2^5;
- sbit SHCK=P2^6;
- sbit K2=P1^0; //左移
- sbit K1=P1^1; //右移
- sbit K3=P1^2; //上移
- sbit K4=P1^3; //下移
- sbit K5=P1^4; //確定
- unsigned char player;
- unsigned char x=0,y=0,k=0;
- unsigned char player1lie[8]={ 0 };
- unsigned char player2lie[8]={ 0 };
- unsigned char code lie[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
- unsigned char code hang[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
- unsigned char code zimoP1[]={0xE1,0x41,0x41,0x4F,0x49,0x49,0x69,0x4F};
- unsigned char code zimoP2[]={0xE1,0x21,0x21,0xE1,0x8F,0x89,0x89,0xEF};
- unsigned char code zimo[]={0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81};
- unsigned char nowplayer;
- unsigned char player1=1;
- unsigned char player2=2;
- void delay1ms(unsigned int i)
- {
- unsigned char j;
- while(i--)
- for(j=0;j<115;j++)
- ;
- }
- void shuru(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- SHCK=0;
- SD=dat&0x80;
- dat<<=1;
- SHCK=1;
- }
- }
- void shuchu()
- {
- STCK=0;
- STCK=1;
- }
-
- void player2win()
- {
- unsigned char i;
- while(1)
- {
- for(i=0;i<8;i++)
- {
- shuru(zimoP2[i]);
- shuru(hang[i]);
- shuchu();
- }
- }
- }
- //2勝顯示
- void player1win()
- {
- unsigned char i;
- while(1)
- {
- for(i=0;i<8;i++)
- {
- shuru(zimoP1[i]);
- shuru(hang[i]);
- shuchu();
- }
- }
- }
- //1勝顯示
- void pinju()
- {
- unsigned char i;
- while(1)
- {
- for(i=0;i<8;i++)
- {
- shuru(zimo[i]);
- shuru(hang[i]);
- shuchu();
- }
- }
- }
- //平局顯示
- void pingju()
- {
- if(k>=32)
- pinju();
- }
- void checkplayer1()
- {
- unsigned char i,m,n=0,k1=0;
- for(i=0;i<8;i++)
- {
- player=0x1f;
- for(m=0;m<4;m++)
- {
- if((player&player1lie[i])==player)
- player1win();
- else
- player=player<<1;
- }
- }
- //左右判斷
-
-
-
-
- for(i=0;i<8;i++)
- {
- for(m=0;m<8;m++)
- {
- if(player1lie[m]&lie[i])
- {
- k1++;
- if(k1>=5)
- player1win();
- }
- else k1=0;
- }
- } //上下判斷
- for(i=0;i<4;i++)
- {
- for(m=0;m<8;m++)
- {
- if((player1lie[0+m]>>(m+i))&0x01)
- k1++;
- else
- {
- if(k1>=5)
- player1win();
- k1=0;
- continue;
- }
- }
-
- }
- for(i=1;i<4;i++)
- {
- for(m=0;m<8;m++)
- {
- if((player1lie[7-m]>>(7-i-m))&0x01)
- k1++;
- else
- { if(k1>=5)
- player1win();
- k1=0;
- continue;
- }
- }
-
- }
-
- //斜向判斷
- }
-
- //判斷2勝
-
- void checkplayer2()
- {
- unsigned char i,m,n=0,k1=0;
- for(i=0;i<8;i++)
- {
- player=0x1f;
- for(m=0;m<4;m++)
- {
- if((player&player2lie[i])==player)
- player2win();
- else
- player=player<<1;
- }
- }
- //左右判斷
-
-
-
-
- for(i=0;i<8;i++)
- {
- for(m=0;m<8;m++)
- {
- if(player2lie[m]&lie[i])
- {
- k1++;
- if(k1>=5)
- player2win();
- }
- else k1=0;
- }
- } //上下判斷
- for(i=0;i<4;i++)
- {
- for(m=0;m<8;m++)
- {
- if((player2lie[0+m]>>(m+i))&0x01)
- k1++;
- else
- {
- if(k1>=5)
- player2win();
- k1=0;
- continue;
- }
- }
-
- }
- for(i=1;i<4;i++)
- {
- for(m=0;m<8;m++)
- {
- if((player2lie[7-m]>>(7-i-m))&0x01)
- k1++;
- else
- { if(k1>=5)
- player2win();
- k1=0;
- continue;
- }
- }
-
- }
-
- //斜向判斷
- }
-
- unsigned char anjian()
- {
- if(K1==0)
- {
- delay1ms(200);
- if(K1==0)
- {
- if(x>=1)
- x--;
- }
- }
- if(K2==0)
- {
- delay1ms(200);
- if(K2==0)
- {
- if(x<7)
- x++;
- }
- }
- if(K3==0)
- {
- delay1ms(200);
- if(K3==0)
- {
- if(y>=1)
- y--;
- else ;
- }
- }
- if(K4==0)
- {
- delay1ms(200);
- if(K4==0)
- {
- if(y<7)
- y++;
- }
-
- }
- shuru(lie[x]);
- shuru(hang[y]);
- shuchu();
- if(K5==0)
- {
- delay1ms(200);
- if(K5==0)
- {
- switch(nowplayer)
- {
- case 1:player1lie[y]=player1lie[y]|(0x80>>x);k++;nowplayer=player2;break;
- case 2:player2lie[y]=player2lie[y]|(0x80>>x);nowplayer=player1;break;
- }
- }
- }
- return k;
- }
- //按鍵移位與確定
- void display()
- {
- unsigned int a,b;
- for(b=0;b<20;b++)
- {
- for(a=0;a<8;a++)
- {
- shuru(player1lie[a]);
- shuru(hang[a]);
- shuchu();
- shuru(player2lie[a]);
- shuru(hang[a]);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
點陣五子棋.zip
(59.6 KB, 下載次數: 90)
2017-6-20 19:21 上傳
點擊文件名下載附件
|