数电课程设计 基于STC89C51的开灯游戏设计.docx

上传人:b****7 文档编号:25100417 上传时间:2023-06-05 格式:DOCX 页数:16 大小:122.49KB
下载 相关 举报
数电课程设计 基于STC89C51的开灯游戏设计.docx_第1页
第1页 / 共16页
数电课程设计 基于STC89C51的开灯游戏设计.docx_第2页
第2页 / 共16页
数电课程设计 基于STC89C51的开灯游戏设计.docx_第3页
第3页 / 共16页
数电课程设计 基于STC89C51的开灯游戏设计.docx_第4页
第4页 / 共16页
数电课程设计 基于STC89C51的开灯游戏设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数电课程设计 基于STC89C51的开灯游戏设计.docx

《数电课程设计 基于STC89C51的开灯游戏设计.docx》由会员分享,可在线阅读,更多相关《数电课程设计 基于STC89C51的开灯游戏设计.docx(16页珍藏版)》请在冰豆网上搜索。

数电课程设计 基于STC89C51的开灯游戏设计.docx

数电课程设计基于STC89C51的开灯游戏设计

课程设计说明书

 

课程名称:

数字电子技术

题目:

基于AT89C51的“开灯”游戏设计

学生姓名:

迟木

专业:

_

班级:

___

学号:

__

指导教师:

郑文良_________

日期:

2013年6月21日

 

课程设计任务书

一、设计题目:

基于AT89C51的“开灯”游戏设计

二、主要内容及要求

要求实现逻辑功能:

游戏目的:

通过按键将灯阵全部点亮。

游戏规则:

(1)开始时灯阵为全灭;

(2)按下按键时,其对应的灯与其上下左右灯状态全部反转;

(3)当游戏没有完成的时候指示灯一(红灯)持续亮,只有全部的LED被点亮后指示灯二(绿灯)才会点亮表明游戏结束。

利用仅仅单片机18个I/O来控制矩阵键盘和矩阵LED共50个独立的元件,将实现游戏特定的效果,每次按键的时候都将其本身及其上下左右的灯的状态全部翻转。

三、进度安排

 

四、总评成绩

 

 

基于AT89C51的“开灯”游戏设计

一、设计任务与要求

游戏目的:

通过按键将灯阵全部点亮。

游戏规则:

(1)开始时灯阵为全灭;

(2)按下按键时,其对应的灯与其上下左右灯状态全部反转;

(3)当游戏没有完成的时候指示灯一(红灯)持续亮,只有全部的LED被点亮后指示灯二(绿灯)才会点亮表明游戏结束。

画出电路图,编写出游戏程序并实现电路的模拟实验。

利用仅仅单片机18个I/O来控制矩阵键盘和矩阵LED共50个独立的元件,将实现游戏特定的效果,每次按键的时候都将其本身及其上下左右的灯的状态全部翻转。

二、方案设计与论证

1、所用器件及实现平台、

(1)AT89C51单片机一块

(2)LED灯25个

(3)按键开关25个

(4)74HC138译码器一块

(5)74HC573锁存器一块

(6)单片机最小系统部分元件

(7)电阻、导线若干。

2、游戏实现的基本原理

电路主要分为:

单片机最小系统部分、键盘部分、LED显示等三部分组成。

(1)单片机最小系统部分:

 

电路如图一所示

(2)键盘扫描部分:

voidkey(uchar*hang,uchar*lie)

{

P2=0x00;

P3=0xFF;

while

(1)

{

if(P3!

=0xFF)//检测到了按键

{

P3=P3;//将P3口状态锁存

P2=0xFF;//检测P2口状态

*hang=change(P2);//将P2口状态转换为行坐标并输出

*lie=change(P3);//将P3口状态转换为列坐标并输出

while(P2!

=0xFF)

{

}

//P2=0xFF;

//P3=0xFF;

return;

}

}

}

ucharchange(uchardat)

{

uchari;

dat=~dat;

for(i=0;i<5;i++)

{

if(dat==0x01<

{

returni;

}

}

return9;

}

 

 

电路如图2所示

(3)LED灯显示部分:

为使灯的状态反转

voidDispose(ucharx,uchary)

{

Light[x]^=0x01<

if(x>0)//翻转指定点的上一点

{

Light[x-1]^=0x01<

}

if(x<4)//翻转指定点的下一点

{

Light[x+1]^=0x01<

}

if(y>0)//翻转指定点的左一点

{

Light[x]^=0x01<<(y-1);

}

if(y<4)//翻转指定点的右一点

{

Light[x]^=0x01<<(y+1);

}}

 

电路所图三所示

3、游戏电路设计、参数计算和器件选择

电路的仿真采用是Protues,是英国Labcenterelectronics公司出版的EAD工具软件。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。

Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。

(1)采用AT89C51作为系统的主控制芯片;

(2)采用74HC138译码器作为LED显示的行的动态扫描芯片,仅仅使用的138输出口的底五位作为行选部分;

(3)采用74HC573锁存器作为LED显示电路的驱动芯片;在实际电路在还应该添加300Ω左右的电阻作为限流电阻使用。

而在模拟时,为方便起见不做处理;

(4)键盘扫描部分采用静态的扫描,经过翻译程序得到行与列的数据X,Y。

(5)显示的核心结构在于P0口的第三位作为LED矩阵的行扫描,选中行的时候对应的列(P0口的高五位)被执行相应的动作,如此便可以实现每一位LED的变化,

voidscan()interrupt1

{

staticuchari=0;//静态变量

P1=i;//138译码器的三位控制,做行的扫描

P1|=Light[i]<<3;//左移动三位,为五列的驱动

i=(i+1)%5;//01234

}以上程序部分即为行列扫描,其实是一个中断的实现,中断时间为单片机计数器的溢出触发时间65536us约为65ms,作为扫描时间相对于人眼的视觉暂留足够实现。

 

三、游戏实际模拟的效果图

图四游戏效果图:

只剩一盏灯的时候,游戏没有终结。

图四—控制系统电路AT89C51

四、仿真调试与分析

在经历至少四五次的电路设计之后选定了使用74LS138起码器作为了矩阵LED的动态扫描芯片,由于单片机的驱动电流一般仅有5毫安左右,而且总输出电流在100毫安以下,而LED的驱动电流一般在10毫安左右,因此单片机不具有直接驱动多个LED的能力。

所以采用了74HC573并入并出寄存器作为了矩阵LED的驱动芯片。

在实际的调试中,前期的电路设计更改,多次发现设计的电路并不理想,不得不一次次的更改设想,最终的成型电路便是上图的电路,另外程序的构思也是很费心思,作为一款简单的游戏电路,还是涉及到了很大量的数据据算,安排,一次次的调试。

再调试过程中本来才有的已有的点阵灯列,但是点阵的LED太小,效果不是很好,从网上的资料得知可以更改LED矩阵的工作模式为模拟模式或者是数字模式,这就为模拟的LED能够显示出预期的效果提供了方便,在实际的电路中,也是可以达到特定的效果。

五、结论与心得

通过这次数字电子的课程设计,把学到的东西与实践相结合。

从中对我们学的知识有了更进一步的理解,而且更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和其具体的使用方法。

也锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。

虽然只是一次简单的课程设计,但通过这次课程设计我们了解了课程设计的一般步骤,和设计中应注意的问题。

设计本身并不是有很重要的意义,而是对待问题时的态度和处理事情的能力。

各个芯片能够完成什么样的功能,使用芯片时应该注意那些要点。

同一个电路可以用那些芯片实现,各个芯片实现同一个功能的区别。

另外,我还渐渐熟悉了pretues这个仿真软件的各个功能,让我体会到了其中的乐趣,还在电脑制作文档的过程中,使我对办公软件有了更进一步的了解和掌握。

最主要的是,通过这次的简单游戏的设计,虽然仅仅是一款结构简单的游戏,但作为一个独立的作品,可以让我从一款产品的设想,设计,开发,再到应用有了一个清晰简单的认识。

这对以后的学习和工作应该是一个好的开始,好的经验。

 

六、参考文献

七、附录

源程序代码

/***************************************************

****************本设计为开灯游戏********************

游戏目的:

通过按键将灯阵全部点亮。

游戏规则:

(1)开始时灯阵为全灭;

(2)按下按键时,其对应的灯与其上下左右灯状态全部反转;

(3)最终点亮全部LED灯。

来源:

***同学编写的一个简单JAVA小游戏。

时间:

2013年*月21日。

作者:

迟木

****************************************************/

#include

#defineucharunsignedchar

#defineuintunsignedint

voidDispose(ucharx,uchary);

ucharchange(uchardat);

voidkey(uchar*hang,uchar*lie);

uintLight[5]={0};

voidmain()

{

ucharx,y;

EA=1;

ET0=1;

TH0=0x00;

TL0=0x00;

TMOD=0x02;

TR0=1;

while

(1)

{

key(&x,&y);//读取键值

Dispose(x,y);//处理读到的键值

}

}

/**********************************

**voidscan()

**点阵动态扫描产生连续的效果

**********************************/

voidscan()interrupt1

{

staticuchari=0;//静态变量

P1=i;//138译码器的三位控制,做行的扫描

P1|=Light[i]<<3;//左移动三位,为五列的驱动

i=(i+1)%5;//01234

}

/*************************************

**voidkey(uchar*hang,uchar*lie)

**键值扫描,扫描出按键

**************************************/

voidkey(uchar*hang,uchar*lie)

{

P2=0x00;

P3=0xFF;

while

(1)

{

if(P3!

=0xFF)//检测到了按键

{

P3=P3;//将P3口状态锁存

P2=0xFF;//检测P2口状态

*hang=change(P2);//将P2口状态转换为行坐标并输出

*lie=change(P3);//将P3口状态转换为列坐标并输出

while(P2!

=0xFF)

{

}

//P2=0xFF;

//P3=0xFF;

return;

}

}

}

/*****************************

**ucharchange(uchardat)

**转换键码为二维数组下标

*****************************/

ucharchange(uchardat)

{

uchari;

dat=~dat;

for(i=0;i<5;i++)

{

if(dat==0x01<

{

returni;

}

}

return9;

}

/***********************************

**Dispose(ucharx,uchary)处理函数

**将指定点的前后左右坐标翻转亮暗

***********************************/

voidDispose(ucharx,uchary)

{

Light[x]^=0x01<

if(x>0)//翻转指定点的上一点

{

Light[x-1]^=0x01<

}

if(x<4)//翻转指定点的下一点

{

Light[x+1]^=0x01<

}

if(y>0)//翻转指定点的左一点

{

Light[x]^=0x01<<(y-1);

}

if(y<4)//翻转指定点的右一点

{

Light[x]^=0x01<<(y+1);

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1