基于51单片机的打地鼠实训报告.docx
《基于51单片机的打地鼠实训报告.docx》由会员分享,可在线阅读,更多相关《基于51单片机的打地鼠实训报告.docx(22页珍藏版)》请在冰豆网上搜索。
基于51单片机的打地鼠实训报告
编号:
桂林电子科技大学信息科技学院
单片机原理及串口技术
实训论文说明书
题目:
打地鼠游戏机
系别:
机电工程系
专业:
机械电子工程
学生姓名:
朱子任
学号:
1453200122
指导教师:
莫荣
职称:
教授
题目类型:
理论研究实验研究工程设计工程技术研究软件开发应用研究
2015年6月20日
独创性声明
本人郑重声明:
所呈交的学位论文,是本人在导师的指导下,独立进行研究工作所取得的成果。
除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律结果由本人承担。
学位论文作者签名:
日期:
关于学位论文版权使用授权的说明
本人完全了解桂林电子科技大学信息科技学院关于收集、保存、使用学位论文的以下规定:
学院有权采用影印、缩印、扫描、数字化或其它手段保存论文;学院有权提供本学位论文全文或者部分内容的阅览服务;学院有权将学位论文的全部或部分内容编入有关数据库进行检索、交流;学院有权向国家有关部门或者机构送交论文的复印件和电子版。
学位论文作者签名:
日期:
导师签名:
日期:
摘要
随着电子科技的飞速发展,单片机在电子及自动控制领域均得到了广泛的应用。
MCS-51单片机经历了几十年的发展之后,目前在技术、配套教材及资料上均已十分成熟。
通过对51单片机进行系统设计,同学们可以更好的掌握单片机的基本原理与设计开发过程。
本次实训的内容为打地鼠游戏机的设计与制作,来实现:
利用led灯亮灭表示“地鼠”进出地鼠洞,通过光敏元件代表锤子实现信号的转化,并由单片机控制led的亮灭,数码管的显示。
实训设计制作共耗时一周,实训作品可实现“地鼠”随机出现,数码管显示,光敏原件检测是否“击中”,单片机自行判断与通关等功能,作品运行稳定,完全达到了实训要求。
通过实训,本人已对C51单片机基本了解,并有了较深刻的认识。
关键词:
led随机显示;光敏原件;数码管显示;单片机;
引言……………………………………………………………………………2
1方案设计……………………………………………………………………2
1.1软件设计方案…………………………………………………………………2
1.2硬件设计方案…………………………………………………………………2
2总设计………………………………………………………………………2
2.1软件设计……………………………………………………………………2
2.2硬件设计……………………………………………………………………3
3.硬件设计……………………………………………………………………2
3.1单片机系统设计………………………………………………………………2
3.1.1单片机的选择………………………………………………………………2
3.1.2单片机引脚功能………………………………………………………………4
3.1.3单片机最小系统……………………………………………………………5
3.2数码管显示模块设计……………………………………………………………6
3.3“地鼠洞”模块电路……………………………………………………………7
3.4信号转换模块电路…………………………………………………………………7
3.4.1LM358电压比较器…………………………………………………………………7
3.4.2光敏电阻…………………………………………………………………7
3.4.3光电信号转换…………………………………………………………………7
4.软件设计…………………………………………………………………8
4.1主程序设计…………………………………………………………………8
4.2程序展示…………………………………………………………………9
5.总结…………………………………………………………………11
辞谢…………………………………………………………………11
参考文献…………………………………………………………………11
引言
随着电子科技的飞速发展,单片机在电子及自动控制领域均得到了广泛的应用。
MCS-51单片机经历了几十年的发展之后,目前在技术、配套教材及资料上均已十分成熟。
通过对51单片机进行系统设计,同学们可以更好的掌握单片机的基本原理与设计开发过程。
本次实训作品主要由:
单片机最小系统、数码管显示模块、信号转换模块、“地鼠洞”模块组成。
本次实训的核心是C51单片机最小系统,而后是其余拓展模块。
下面就从相关方面进行论述。
1.方案设计
将51单片机作为控制核心,倒数计时、关卡序号、分数由一个静态数码管显示。
“地鼠的冒出”信号由单片机的P2端口输出到地鼠洞模块,而后相应led点亮。
此时用一光敏元件进行光信号识别,(在这里推荐使用无极性的光敏电阻),并发送给LM358比较器,再由比较器,将相应电位输送给单片机进行计算与显示。
具体操作步骤为:
1.1软件设计方案
利用keil对51单片机编程,使其在显示“地鼠”前,先利用静态数码管显示一组3-1的三秒倒数计时。
而后,利用相关算法使“地鼠们”随即从洞里钻出(既led逐一点亮),同时LM358比较器比较光敏电阻电位从而判断“锤子”(光敏电阻)是否打到地鼠,并输出相关信号给单片机P1.0端口。
单片机记录被打到的地鼠的个数,与对应时间以制作下一组“地鼠”冒出次序的数组。
当十个“地鼠”全部打完时,led停止显示,数码管显示分数。
同时单片机根据打到地鼠的个数选择是否过关。
在负责输入信号的按键按下后,下一关开始。
1.2硬件设计方案
本实训设计的“打地鼠游戏机”,由C51单片机最小系统、数码管显示模块、信号转换模块、“地鼠洞”模块组成。
“地鼠”冒出又被打回或自动缩回的原理是,在单片机控制下,led被作为“地鼠”依次点亮,当作为“锤子”的光敏电阻接触到发光的led上的时候,光敏电阻组织发生变化,LM358感应电位变化并输出低电平给单片机的P1.0端口。
“地鼠”打完后,数码管显示分数,若分数足够,让独立按键选择是否进入下一关。
本硬件可分为四大部分:
C51单片机最小系统、数码管显示模块、信号转换模块、“地鼠洞”模块。
2.总体设计
2.1软件设计
单片机初始化
倒数计时
地鼠冒出
·
记录打地鼠时间
分数+1
是否打到地鼠
是
否
是否打满10只地鼠
否
是
显示分数
是否通关
分数是否够高
是是
否
地鼠冒出时间减半
2.2硬件设计
单片机最小系统
“地鼠洞”模块
信号转换模块
数码管显示模块
3硬件设计
3.1单片机系统设计
3.1.1单片机的选择
一般在系统的设计当中,能否完成设计任务最重要的就在于系统的核心器件是否选择合适,而单片机更是是系统控制的核心,所以对单片机的选择更是异常重要。
如果选择了一个合适的单片机不仅可以最大地简化系统的操作,而且其功能可能是最好的,可靠性也比较高,对整个系统来说更方便。
目前,市面上的单片机的种类繁多,并且他们在功能方面也是各自有各自的特点。
在一般的情况下来讲,在选择单片机时要需要考虑的几个方面有[5]:
(1)单片机最基本性能参数指标。
例如:
执行一条指令的速度、程序存储器的容量,I/O口的引脚数量等。
(2)单片机的某些增强的功能。
(3)单片机的存储介质。
例如:
对于程序存储器来说,最好选用的是Flash的存储器。
(4)单片机的封装形式。
封装的形式多种多样,例如:
双列直插封装、PLCC封装及表面贴附等。
(5)单片机对工作的温度范围的要求。
例如:
在进行设计户外的产品时,就必须要选用工业级的芯片,以达到温度范围的要求。
(6)单片机的功耗。
例如,如果信号线取电只能提供几mA的电流,所以为了能满足低功耗的要求这个时候选用STC的单片机是最合适的。
(7)单片机在市面上的销售渠道是否畅通、其价格是否便宜。
(8)单片机技术的支持网站如何,卖家提供的芯片资料是否足够完善,是否包含了用户手册,设计方案举例,相关范例程序等。
(9)单片机的保密性是否很好,单片机的抗干扰的性能如何等。
51系列单片机它在指令系统、硬件结构和片内资源等方面与标准的52系列的单片机可以完全的兼容。
51系列的单片机执行速率快(最高时钟频率为90MHz),功耗低,在系统、在应用可编程,不占用用户的资源[5]。
根据本系统设计的实际要求,选择AT89S51单片机做为本设计的单片机使用,它是由ATMEL公司生产的高性能、低功耗的CMOS8位单片机。
89S51单片机具有以下几个性能特点:
4k字节的闪存片内程序存储器,128字节的数据存储器,32个外部输入和输出口,2个全双工串行通信口,看门狗电路,5个中断源,2个16位可编程定时计数器,片内震荡和时钟电路且全静态工作并由低功耗的闲置和掉电模式[5]。
单片机的引脚功能图如图3.1所示。
图3.151单片机的引脚功能图
3.1.2单片机引脚功能
(1)电源引脚
Vcc(40脚):
正电源的引脚,工作电压是5V。
GND(20脚):
接地端。
(2)时钟电路的引脚XTAL1和XTAL2
为了产生时钟信号,在89S51单片机的芯片内部已经设置了一个反相放大器,其中XTAL1端口就是片内反相放大器的输入端,XTAL2端则是片内振荡器反相放大器的输出端[5]。
单片机使用的工作方式是自激振荡的方式,XTAL1和XTAL2外接的是12MHz的石英晶振,使内部振荡器按照石英晶振的频率频率进行振荡,从而就可以产生时钟信号。
时钟信号电路如图3.2所示。
图3.2时钟信号电路
(3)复位RST(9脚)
当振荡器运行时,只要有有两个机器周期即24个振荡周期以上的高电平在这个引脚出现时,那么就将会使单片机复位,如果将这个引脚保持高电平,那么51单片机芯片就会循环不断地进行复位[5]。
复位后的P0口至P3口均置于高电平,这时程序计数器和特殊功能寄存器将全部清零[5]。
本课题设计的单片机复位电路如图3.3所示。
图3.3单片机复位电路图
(4)输入输出口(I/O口)引脚
P0口是一个三态的双向口,既可以作为数据和地址的分时复用口,又可以作为通用输入输出口[5]。
P0口在有外部扩展存储器时将会被作为地址/数据总线口,此时P0口就是一个真正的双向口;而在没有外部扩展存储器时,P0口也可以作为通用的I/O接口使用,但此时只是一个准双向口;另外,P0口的输出级具有驱动8个LSTTL负载的能力即输出电流不小于800uA[5]。
P1口是一个带内部上拉电阻的8位双向I/O口,而P1口只有通用I/O接口一种功能,而且P1口能驱动4个LSTTL负载;在使用时通常不需要外接上拉电阻就能够直接驱动发光二极管;在端口置1时,其内部上拉电阻将端口拉到高电平,作输入端口用[5]。
对于输出功能,在单片机工作的时候,可以通过用程序指令控制单片机引脚输出高电平或低电平[5]。
例如:
指令CLR是清零的意思,CLRP1.0的意思就是让单片机的P1.0端口输出低电平;而指令SETB是置1的意思,SETBP1.0的意思就是让单片机P1.0端口输出高电平[5]。
P2口是一个带内部上拉电阻的8位双向I/O口,而且P2口具有驱动4个LSTTL负载的能力[5]。
P2端口置1时,内部上拉电阻将端口的电位拉到高电平,作为输入口使用;在对内部的Flash程序存储器编程时,P2口接收高8位地址和控制信息,而在访问外部程序和16位外部数据存储器时,P2口就送出高8位地址[5]。
在访问8位地址的外部数据存储器时,P2引脚上的内容在此期间不会改变[5]。
P3口也是一个带内部上拉电阻的8位双向I/O口,P3口能驱动4个LSTTL负载,这8个引脚还用于专门的第二功能[5]。
P3口作为通用I/O口接口时,第二功能输出线为高电平。
P3口置1时,内部上拉电阻将端口电位拉到高电平,作输入口使用;在对内部Flash程序存储器编程时,此端接控制信息[5]。
P3口的第二功能,如表3.1所示[5]。
表3.1 P3口第二功能表
P3引脚
兼用功能
P3.0
串行通讯输入口(RXD)
P3.1
串行通讯输出口(TXD)
P3.2
外部中断0请求输入端(INT0)
P3.3
外部中断1请求输入端(INT1)
P3.4
定时器0输入端(T0)
P3.5
定时器1输入端(T1)
P3.6
外部数据存储器写选通信号输出端(/WR)
P3.7
外部数据存储器写选通信号输出端(/RD)
(5)其它控制或复用引脚
(a)ALE/PROG(30脚):
地址锁存有效信号输出端。
在访问片外存储器时,ALE(地址锁存允许)以每机器周期两次进行信号输出,其下降沿用于控制锁存P0口输出的低8位地址;在不访问片外存储器的时候,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6),而在访问片外数据存储器时,ALE脉冲会跳空一个,此时是不可以做为时钟输出[5]。
对片内含有EPROM的机型在编程时,这个引脚用于输入编程脉冲/PROG的输入端[5]。
(b)/PSEN(29脚):
片外程序存储器读选通信号输出端,低电平时有效。
当89S51从外部程序存储器取指令或常数时,每个机器周期内输出2个脉冲即两次有效,以通过数据总线P0口读回指令或常数。
但在访问片外数据存储器时,/PSEN将不会有脉冲输出[5]。
(c)/EA/Vpp(31脚):
/EA为片外程序存储器访选用端。
当该引脚访问片外程序存储器时,应该输入的是低电平,要使89S51只访问片外程序存储器,这时该引脚必须保持低电平;而在对Flash存储器编程时,用于施加Vpp编程电压[5]。
3.1.3单片机最小系统
单片机最小系统是其他拓展系统的最基本的基础,单片机最小系统是指一个真正可用的单片机最小配置系统即单片机能工作的系统。
对于80S51单片机,由于片内已经自带有了程序存储器,所以只要单片机外接时钟电路和复位电路就可以组成了单片机的最小系统了。
单片机的最小系统如图3.4所示。
图3.4单片机最小系统原理图
3.2数码管显示模块设计
发光二极管的缩写是LED,在每个数码管里面都有8只发光二极管,它们分别记作a、b、c、d、e、f、g、dp,其中dp是小数点,每一只发光二极管都有一根电极引到外部的引脚上,而另外一只二极管的引脚就连接在一起同样也引到外部引脚上,此引脚就记作公共端COM。
市面上常用的LED数码管有两种即共阳极数码管与共阴极数码管。
共阳极是数码管里面的发光二极的阳极接在一起作为公共引脚即公共阳极,在使用时此公共引脚接到电源正极。
相反,共阴极就是数码管里面的发光二极管的阴极接在一起作为公共引脚即公共阴极,在使用时此引脚接到电源负极。
单片机对数码管的显示可以分为静态显示和动态显示,静态显示能够稳定地显示数值,但是搭建电路时比较烦索,而动态显示是数码管轮流显示再利用人眼的“视觉暂留”特性,这样看出来的就是在显示不同数值[8]。
数码管的动态显示比较实用,电路构建简单,所以本设计采用动态扫描的方法显示测量距离,只要轮流显示的速度足够快的时候就能够实现测量数值的显示。
显示模块选用4位共阳极数码管进行动态扫描,此扫描方式能完全达到显示要求。
本次试训数码管输出数据并不复杂,故可采用静态数码管。
同时,为防止单片机管脚输出功率过低,我们可以接上一个74Ls573h来提高输出功率。
数码管显示模块电路如图3.5所示:
图3.5数码管显示模块电路图
3.3“地鼠洞”模块电路
“地鼠洞”模块电路,其工作原理与数码管显示模块电路大致相同。
为了让单片机更好的显示“地鼠”冒出,我们可以将led的阴极联在一起,而阳极分别连接单片机P2端口。
同时为防止单片机输出功率不够,我们可以再接一个74Ls573h来提高功率。
“地鼠洞”模块电路如图3.6所示:
图3.6“地鼠洞”模块电路图
3.4信号转换模块电路图
信号转换器模块的核心是LM358电压比较器以及光敏电阻。
3.4.1LM358电压比较器
电压比较器是对输入信号进行鉴别与比较的电路,是组成非正弦波发生电路的基本单元电路
电压比较器可以看作是放大倍数接近“无穷大”的运算放大器。
其功能主要是:
比较两个电压的大小(用输出电压的高或低电平,表示两个输入电压的大小关系):
当”+”输入端电压高于”-”输入端时,电压比较器输出为高电平;
当”+”输入端电压低于”-”输入端时,电压比较器输出为低电平;
电压比较器的作用:
它可用作模拟电路和数字电路的接口,还可以用作波形产生和变换电路等。
利用简单电压比较器可将正弦波变为同频率的方波或矩形波。
它可用作模拟电路和数字电路的接口,还可以用作波形产生和变换电路等。
利用简单电压比较器可将正弦波变为同频率的方波或矩形波。
在本实训中,我们主要使用它作为电压比较器的功能。
3.4.2光敏电阻
光敏电阻又称光导体,常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。
这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。
这是由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔向电源的负极,从而使光敏电阻器的阻值迅速下降。
使得光敏电阻阻值呈现入射光强,电阻减小,入射光弱,电阻增大。
还有另一种入射光弱,电阻减小,入射光强,电阻增大的变化趋势。
光敏电阻器一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化)。
常用的光敏电阻器硫化镉光敏电阻器,它是由半导体材料制成的。
光敏电阻器对光的敏感性(即光谱特性)与人眼对可见光(0.4~0.76)μm的响应很接近,只要人眼可感受的光,都会引起它的阻值变化。
设计光控电路时,都用白炽灯泡(小电珠)光线或自然光线作控制光源,使设计大为简化。
3.4.3光电信号转换
光电信号转换模块电路的基本原理是利用光敏电阻将光信号转换成模拟电位信号,再通过LM358电压比较器(接在3号“+”输入端口上)将模拟电位信号同另一比较端(接在2号“-”输入端上)的参考电位信号比较,若3号端口电位低于2号端口,则1号输出端就输出低电平。
同时,为实现选择关卡,本人在另外连接了三个按键开关用于输出低电平信号。
光电电位转换模块电路图如图3.7所示:
图3.7光电信号转换模块电路图
4.软件设计
本设计采用的是模块化的思路来进行设计和编写程序,程序主要由系统主程序和延时程序构成。
主程序完成单片机的初始化,倒数计时、显示“地鼠”、计算“地鼠”被打下的时间、计算下一只“地鼠”的位置和显示分数等。
延时程序负责延时,协同主程序执行。
4.1主程序设计:
初始化过后,为了游戏的可玩性,先在数码管上显示倒数计时3秒,而后显示关卡序号。
此时P2端口通过while循环显示“地鼠”,同时利用循环变量与延时控制“地鼠冒出时间”,当“锤子”打到地鼠或循环变量为0时,退出循环。
倘若在“地鼠冒出”并“缩回”期间,“锤子”打到“地鼠”,则循环变量非零。
从而可通过此方法判断“地鼠被打倒”。
若真打到“地鼠”,分数自增,并将循环变量%8运算的结果作为下一只“地鼠”的冒出位置,从而实现“地鼠”随机出现。
当打完十只“地鼠”后,游戏停止,数码管显示得分,而后通过连接P1.0按键继续游戏,如果得分高于8分,则可分别通过P1.1、P1.2选择是否过关,若过关,延时时间取原延时时间的一半,然后,进入下一关,继续游戏。
整个程序的关键是“地鼠”的随机出现。
为了加强游戏的可玩性,很多游戏都选择使用用随机函数实现随机控制。
生成随机函数主要有两种方法:
方法一:
定时器直接随机取值
这是利用人工按下按键开启定时器中断的方式,每次按键按下就开启定时计数器,从而生成一个随机数。
这种方式的优点是随机性高,程序相对简单,适用于51单片机初学者,而其对外部硬件与人工操作依赖较强。
方法二:
使用随机函数库random()
随机函数库random()是单片机内部专门用来产生随机数的函数库。
Random()与srandom()程序都包含在头文件include里。
当需要使用时,只要调用random()函数。
Srand()函数将设置起始值,并由random()函数的伪随机数发生器使用。
随机数发生器产生同一序列的伪随机数,并传给定值。
从而得到随机数。
这种方式的优点在于:
程序执行时只需要CPU自己计算,不需要人为控制。
而缺点在于,此类函数使用复杂。
且随机数经常相同,实用性较低。
介于以上两种方法,本人设计的随机算法主要参考第一种方法。
既,在显示“地鼠”时,使用了while循环语句,并设置一变量在其中用于计算while循环语句的循环次数。
同时利用循环变量与延时控制“地鼠冒出时间”,当“锤子”打到地鼠或循环变量为0时,退出循环。
倘若在“地鼠冒出”并“缩回”期间,“锤子”打到“地鼠”,则循环变量非零,从而断定“地鼠被打倒”。
若真打到“地鼠”,分数自增,并将循环变量%8运算的结果作为下一只“地鼠”的冒出位置,从而实现“地鼠”随机出现。
4.2程序展示
#include
#define uchar unsigned char
#define uint unsigned int
sbit hit=P1^2;
sbit yes=P1^0;
sbit no=P1^1;
uchar code table[8]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //地鼠控制数组
uchar code score[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段选码
uchar a=100,b=10,c,d=2,e=1,x=100,s=0,time;
void delayms(uint x)//毫秒级延时函数
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void delay1s()//一秒延时函数
{
uint k,l;
for(k=1000;k>0;k--)
for(l=110;l>0;l--);
}
void main()
{
while
(1)
{
c=x;//装入延时变量
P3=score[3];//倒数计时
delay1s();
P3=score[2];
delay1s();
P3=score[1];
delay1s();
P3=score[e];
while(b)
{
x=c;//重装延时变量
a=100;
P2=table[d];//显示地鼠
while(hit==1&&a>0)//检测地鼠被打到的时间
{
P2=table[d];
delayms(x);
x=c;
a--;
}
P2=0x00;//地鼠被打回
delay1s();
if(a)//将地鼠被打到的时间转变为下一