在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)項(xiàng)目實(shí)戰(zhàn)---貪吃蛇(測(cè)試版)

            51單片機(jī)項(xiàng)目實(shí)戰(zhàn)---貪吃蛇(測(cè)試版)

            作者: 時(shí)間:2018-08-06 來(lái)源:網(wǎng)絡(luò) 收藏

            一、元器件

            1、AT89C51

            本文引用地址:http://www.biyoush.com/article/201808/385449.htm

            關(guān)于就不在嗦了,相信大家都已經(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輸入與門(mén),將所有按鍵狀態(tài)集合在一起,然后送給外部中斷0。我們將4個(gè)按鍵都接在與門(mén),只要有一個(gè)按下,那么與門(mén)的輸出就會(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)鍵詞: 51單片機(jī) 貪吃蛇

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉