www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]基于51單片機(jī)的貪吃蛇實(shí)例

 一、元器件

1、AT89C51

關(guān)于51單片機(jī)就不在啰嗦了,相信大家都已經(jīng)很熟悉了。

2、8x8點(diǎn)陣

點(diǎn)陣?yán)锩婢褪且恍┒O管啦,通過(guò)縱橫交叉連接,橫8豎8,每個(gè)交叉點(diǎn)都接一個(gè)二極管。這里給大家找到一個(gè)點(diǎn)陣的實(shí)物圖

 


 

我想大家看到這個(gè)圖就應(yīng)該知道如何去點(diǎn)亮一個(gè)點(diǎn)陣了。假如要點(diǎn)亮最左上角那個(gè),那么9號(hào)引腳拉高,13號(hào)引腳拉低,這樣既可。

二、原理圖

 


 

 


 

三、項(xiàng)目分析

1、首先定義一個(gè)結(jié)構(gòu)體

struct snake{

unsigned char x[20];

unsigned char y[20];

unsigned char length;

unsigned char direction;

}snk;

數(shù)組x,y分別存放每一個(gè)點(diǎn)的橫縱坐標(biāo),length為蛇的長(zhǎng)度,direction為蛇前進(jìn)的方向

2、坐標(biāo)系:點(diǎn)陣的左下角為點(diǎn)(0,0),橫縱坐標(biāo)都是正向增長(zhǎng),P2控制橫坐標(biāo);P0控制縱坐標(biāo)。通過(guò)坐標(biāo)可以找到點(diǎn)陣中點(diǎn)的位置,然后將其點(diǎn)亮

假設(shè)現(xiàn)在有第2個(gè)點(diǎn)的坐標(biāo)x[2] = 1, y[2] = 2,那么點(diǎn)亮這個(gè)點(diǎn)的方式為

P2 = 0x04; //0000 0100

P0 = 0xfb; //1111 1011

3、按鍵產(chǎn)生外部中斷,在中斷里判斷按下那個(gè)方向get_direction(),并且同時(shí)設(shè)置坐標(biāo)set_location()

4、定時(shí)器每隔1s就應(yīng)該更新位置,因?yàn)樯咭煌5那斑M(jìn)。定時(shí)器不需要更新方向,因?yàn)榉较蛑挥邪存I才會(huì)改動(dòng),定時(shí)器用前一步的方向

5、關(guān)于點(diǎn)的位置更新方式

1)、向上移動(dòng)

后面的點(diǎn)去覆蓋前面的點(diǎn),第一個(gè)點(diǎn)用新坐標(biāo)表示x[0]不變,y[0]+1

2)、向下移動(dòng)

后面的點(diǎn)去覆蓋前面的點(diǎn),第一個(gè)點(diǎn)用新坐標(biāo)表示x[0]不變,y[0]-1

3)、向左移動(dòng)

后面的點(diǎn)去覆蓋前面的點(diǎn),第一個(gè)點(diǎn)用新坐標(biāo)表示x[0]-1,y[0]不變

4)、向右移動(dòng)

后面的點(diǎn)去覆蓋前面的點(diǎn),第一個(gè)點(diǎn)用新坐標(biāo)表示x[0]+1,y[0]不變

6、關(guān)于邊界問(wèn)題:

1)、任何一個(gè)點(diǎn)的橫坐標(biāo) 0 <= x[i] < 8

2)、任何一個(gè)點(diǎn)的縱坐標(biāo) 0 <= y[i] < 8

3)、第一個(gè)點(diǎn)在移動(dòng)的時(shí)候不能和其他點(diǎn)重復(fù),否則就自己追尾了

7、關(guān)于原理圖按鍵的設(shè)計(jì)

貪吃蛇要求系統(tǒng)能迅速響應(yīng)按鍵,因此輪詢的方式并不可取,只有靠外部中斷。然而51只有2個(gè)外部中斷,我們起碼需要4個(gè)方向鍵,這樣就不能一個(gè)按鍵配一個(gè)外部中斷,通過(guò)使用4輸入與門,將所有按鍵狀態(tài)集合在一起,然后送給外部中斷0。我們將4個(gè)按鍵都接在與門,只要有一個(gè)按下,那么與門的輸出就會(huì)產(chǎn)生一個(gè)下降沿,從而產(chǎn)生外部中斷。

四、源代碼

main.c

#include "snake.h"

int error = 0;

int time=0;

void interrupt_init()

{

EA = 0; //關(guān)閉總中斷

IT0 = 1; //外部中斷0方式 下降沿

EA = 1; //開(kāi)啟總中斷

EX0 = 1; //開(kāi)啟外部中斷

}

void timer_init()

{

EA = 0; //關(guān)總中斷

ET0 = 1; //開(kāi)定時(shí)器0中斷

TMOD = 0x02; //定時(shí)器0工作方式2

TL0 = 6; //定時(shí)250us

TH0 = 6;

EA = 1; //開(kāi)總中斷

TR0 = 1; //開(kāi)始定時(shí)

}

int main()

{

// unsigned char tempx, tempy;

// unsigned char i,j;

interrupt_init();

timer_init();

snk_init();

while(1)

{

//如果位置錯(cuò)了就重新初始化蛇

if(error)

snk_init();

//點(diǎn)亮點(diǎn)陣

matrix();

}

}

void inter0() interrupt 0

{

//按鍵產(chǎn)生外部中斷,獲取新的方向

get_direction();

//設(shè)置新的位置

error = set_location();

// matrix();

}

void timer0() interrupt 1

{

time++;

//定時(shí)器為250us 積累4000次就是1s

if(time == 4000)

{

//每隔1s都需要重新設(shè)置位置,讓蛇前進(jìn)

error = set_location();

time = 0;

}

}

snake.c

點(diǎn)擊(此處)折疊或打開(kāi)

#include "snake.h"

//蛇的結(jié)構(gòu)體,x為橫坐標(biāo),y為縱坐標(biāo),length為蛇的長(zhǎng)度,direction為蛇的前進(jìn)方向

struct snake{

unsigned char x[20];

unsigned char y[20];

unsigned char length;

unsigned char direction;

}snk;

void matrix()

{

unsigned char i;

int count=500;

//關(guān)閉所有的點(diǎn)

P2 = 0x00;

P0 = 0xff;

//根據(jù)蛇每一個(gè)點(diǎn)的坐標(biāo),將對(duì)應(yīng)的點(diǎn)陣點(diǎn)亮

for(i=0; i

{

P2 = 1<

P0 = ~(1<

}

}

void snk_init()

{

//初始化坐標(biāo),總共4個(gè)點(diǎn)(3,0) (2,0) (1,0) (1,0)

snk.x[0] = 3;

snk.y[0] = 0;

snk.x[1] = 2;

snk.y[1] = 0;

snk.x[2] = 1;

snk.y[2] = 0;

snk.x[3] = 0;

snk.y[3] = 0;

//初始長(zhǎng)度4

snk.length = 4;

//初始移動(dòng)方向 向右

snk.direction = RIGHT;

//點(diǎn)亮點(diǎn)陣

matrix();

}

void get_direction()

{

//通過(guò)按鍵的狀態(tài)獲取方向

if(!up)

snk.direction = UP;

if(!down)

snk.direction = DOWN;

if(!left)

snk.direction = LEFT;

if(!right)

snk.direction = RIGHT;

}

int set_location()

{

unsigned char i;

int err = 0;

if(snk.direction == UP)

{

for(i=snk.length-1; i>0; i--)

{

snk.x[i] = snk.x[i-1];

snk.y[i] = snk.y[i-1];

}

//如果向上運(yùn)動(dòng),第0個(gè)點(diǎn)的橫坐標(biāo)不變,縱坐標(biāo)加1

snk.x[0] = snk.x[0];

snk.y[0] = snk.y[0] + 1;

}

else if(snk.direction == DOWN)

{

for(i=snk.length-1; i>0; i--)

{

snk.x[i] = snk.x[i-1];

snk.y[i] = snk.y[i-1];

}

//如果向下運(yùn)動(dòng),第0個(gè)點(diǎn)的橫坐標(biāo)不變,縱坐標(biāo)減1

snk.x[0] = snk.x[0];

snk.y[0] = snk.y[0] - 1;

}

else if(snk.direction == LEFT)

{

for(i=snk.length-1; i>0; i--)

{

snk.x[i] = snk.x[i-1];

snk.y[i] = snk.y[i-1];

}

//如果向左運(yùn)動(dòng),第0個(gè)點(diǎn)的橫坐標(biāo)減1,縱坐標(biāo)不變

snk.x[0] = snk.x[0] - 1;

snk.y[0] = snk.y[0];

}

else

{

for(i=snk.length-1; i>0; i--)

{

snk.x[i] = snk.x[i-1];

snk.y[i] = snk.y[i-1];

}

//如果向右運(yùn)動(dòng),第0個(gè)點(diǎn)的橫坐標(biāo)加1,縱坐標(biāo)不變

snk.x[0] = snk.x[0] + 1;

snk.y[0] = snk.y[0];

}

err = is_location_error();

return err;

}

int is_location_error()

{

unsigned char i;

//如果第0個(gè)點(diǎn)的坐標(biāo)和其他任意一個(gè)點(diǎn)重復(fù),那么蛇就自己撞自己,出錯(cuò)

for(i=1; i

{

if((snk.x[0]==snk.x[i]) && (snk.y[0]==snk.y[i]))

return 1;

}

//如果蛇的坐標(biāo)超出范圍,也出錯(cuò)

if(snk.x[0]>7 || snk.y[0]>7)

return 1;

return 0;

}

snake.h

#include

//定義四個(gè)方向按鍵

sbit up = P3^4;

sbit down = P3^5;

sbit left = P3^6;

sbit right = P3^7;

//定義1個(gè)游戲級(jí)別按鍵

sbit level = P3^0;

//定義一個(gè)復(fù)位按鍵

sbit reset = P3^1;

//定義4個(gè)方向的值

#define RIGHT 0

#define UP 1

#define LEFT 2

#define DOWN 3

void delay_us();

void delay_10us();

void delay_ms();

void delay_10ms();

void delay_100ms();

void delay_s();

int is_location_error();

void matrix();

void snk_init();

void set_direction();

int get_location();

int is_location_error();

『本文轉(zhuǎn)載自網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系刪除』

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉