完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
前言:
这篇文章是我当时制作完成后写的总结,已经过去了一段时间,苦于找不到实物的图片,就把全文都粘贴到了下面。 今天是11月2日,昨天我完成了我的贪吃蛇的制作。那个战线一个多月,让我煞费苦心的工作。在这一过程中,学到了许多新知识,也认识了许多新朋友,无论星火杯结果如何,它都将成为我的大学生涯,甚至一生中宝贵的财富。所以我决定将我学到的,想到的都写下来,给将来的自己一份美好的回忆。这次总结的内容主要是进入西电来学到的一些硬件知识,主要包括51单片机基础知识(最小系统、LED流水灯、蜂鸣器、独立按键、数码管显示),Protues仿真(以贪吃蛇为例),Keil的使用(贪吃蛇程序的分析),最后是贪吃蛇制作的基本步骤。 一、51单片机基础 1、单片机介绍 单片机是在一块硅片上集成了微处理器、储存器及各种输入输出接口的芯片。目前单片机种类众多,笔者在制作贪吃蛇的时候用的是STC89C52RC。但只要学会一种,其它的都可以轻松搞定。 2、单片机引脚介绍 上图为STC89C52RC引脚图,共四十引脚,可按照其功能将其分为三类:电源和时钟引脚(VCC、GND、XTAL1、XTAL2),编程控制引脚和I/O口引脚(P0、P1、P2、P3)。 注:①P0口内部没有上拉电阻,不能正常输出高低电平,使用时务必外接上拉电阻(10KΩ)②P3.0为串行输入口(RXD,第10脚),P3.1为串行输出口(TXD,第11脚) 3、单片机最小系统 指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。如上方电路图。 4、LED流水灯 //常用预处理命令 typedef unsigned char u8; typedef unsigned int u16; #define LED P0 //包含头文件 #include //实现函数 led=_crol_(led,1); led=_cror_(led,1); 5.蜂鸣器 蜂鸣器可分为电磁式蜂鸣器(通过高低电平控制)和压电式蜂鸣器(通过脉冲触发)两种。原理:改变单片机引脚输出波形的频率,可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。改变输出电平的高低电平占空比,可以控制蜂鸣器的声音大小。 ###6.数码管动态扫描 原理:轮流向各位数码管送出字形码指令,利用发光管的余晖和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。 ##二、Protues仿真(以贪吃蛇为例) ###1.在Protues中用到的命令 1N4003——二极管 AT89C52——单片机 BUTTON——按键 MATRIX-8×8-RED——红色8×8点阵 RES——电阻 POWER——电源 GROUND——接地 ###2.LED点阵 笔者在焊接时用的是2088BS(一种共阳极点阵),若是想要区分共阴、共阳可用万用表测量。共阳极电路如右下图所示,如果想要位于(1,1)的灯亮,只需要将⑨设置为高电平,将⑬设置为低电平。进一步想让对角线亮起来,可利用动态扫描。 注:点阵的行列引脚分布是乱序的,焊接时一定要仔细,可用杜邦线连接试验。 3.电路图 分析:该电路由单片机,8*8点阵,一个电阻,四个二极管和四个按键组成。点阵的16个引脚分别和单片机的P1端口、P2端口相连,通过程序控制高低电平的变化,实现点阵的变化。四个二极管相当于下拉电阻,当按键未按下时,P3口直接经过二极管接地,控制P3口为低电平。按键按下后,电流通过按键进入单片机,使单片机变为高电平,当单片机检测到高电平的时候,会做出相应反应。实现贪吃蛇游戏。 三、Keil的使用(贪吃蛇程序的分析) #include #define uchar unsigned char #define SNAKE 20 //最大长度 #define TIME 500000 //显示延时时间 #define SPEED 71 //速度控制 ***it keyenable=P3^6; //方向使能 ***it up=P3^3; ***it down=P3^1; ***it right=P3^2; ***it left=P3^4; uchar x[SNAKE+1]; uchar y[SNAKE+1]; uchar time,n,i,e; //延时时间,当前蛇长,通用循环变量,当前速度 char addx,addy; //位移偏移量 void delay(char MS){while(MS--);} bit knock()//判断碰撞 { bit k; k=0; if(x[1]>7||y[1]>7) k=1; //撞墙 for(i=2;i k=1; //撞自己 return k; } void turnkey()//上下左右键位处理 { if(keyenable) { if(left){addy=0;if(addx!=1)addx=-1; else addx=1;} if(right){addy=0;if(addx!=-1)addx=1; else addx=-1;} if(up){addx=0;if(addy!=-1)addy=1; else addy=-1;} if(down){addx=0;if(addy!=1)addy=-1; else addy=1;} } } uchar mux(uchar temp) //乘方程序 { if(temp==7) return 128; if(temp==6) return 64; if(temp==5) return 32; if(temp==4) return 16; if(temp==3) return 8; if(temp==2) return 4; if(temp==1) return 2; if(temp==0) return 1; return 0; } void timer0(uchar k)//显示程序 { while(k--) { for(i=0;i P2=mux(x); P1=255-mux(y); turnkey(); //上下左右键位处理 delay(TIME); //显示延迟 P2=0x00;P1=0xff; } } } void main(void) { e=SPEED; P0=0x00;P1=0xff; P2=0x00;P3=0x00; while(1) { for(i=3;i for(i=3;i x[0]=4;y[0]=4; //果子 n=3; //蛇长 n=-1 x[1]=1;y[1]=0; //蛇头 x[2]=0;y[2]=0; //蛇尾1 addx=0;addy=0; //位移偏移 while(1){if(keyenable)break;timer0(1);} while(1) { timer0(e); if(knock()){e=SPEED;break;} //判断碰撞 if((x[0]==x[1]+addx)&(y[0]==y[1]+addy)) //是否吃东西 { n++; if(n==SNAKE+1) { n=3;e=e-10; for(i=3;i for(i=3;i } x[0]=x[n-2]; y[0]=y[n-2]; } for(i=n-1;i>1;i--) {x=x[i-1];y=y[i-1];} x[1]=x[2]+addx; y[1]=y[2]+addy; //移动 } } } |
|
|
|
只有小组成员才能发言,加入小组>>
2300 浏览 0 评论
1348浏览 3评论
815浏览 2评论
464浏览 1评论
1335浏览 0评论
216浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 18:20 , Processed in 1.250491 second(s), Total 50, Slave 42 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号