单片机综合设计报告.docx
《单片机综合设计报告.docx》由会员分享,可在线阅读,更多相关《单片机综合设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
![单片机综合设计报告.docx](https://file1.bdocx.com/fileroot1/2023-6/30/0a8ae26b-e76a-4c5a-8c87-1da98dc85f12/0a8ae26b-e76a-4c5a-8c87-1da98dc85f121.gif)
单片机综合设计报告
单片机实验
综合设计报告
〔基于CS—III的迷宫游戏的设计实现〕
学院名称
计算机科学与技术学院
专业名称
计科1101
学生XX
周杭黄太春
学号
2011157920111559
指导教师
高小明彭勇
报告成绩
辩论成绩
二〇一四年五
功能设计:
(一)可以实现地图选择功能
每当用户开场游戏或重新游戏时都需要先进展游戏地图的选择,地图的选择是通过单片机上的按键C、D、E、F来进展确定,其分别相对应于地图1、地图2、地图3、地图4的选择。
按下其中一个按键即表示已选择地图,当所走步数为零时可以随意切换地图,否那么不可再次选择地图。
(二)可以实现所走步数计数功能
当用户选择地图后即开场游戏,用户通过单片机4×4的按键进展操作,除了之前用作选择地图的C、D、E、F按键外其它按键只要相对应地可以组成上下左右的关系即可用于控制走向。
当用户按下一个有效按键那么系统自动计数,如果按键操作不符合规定系统不进展计数。
(三)可以实现显示当前地图功能
当用户按下用于选择地图的按键C、D、E、F其中的任何一个键,LED就会在P1_0进展显示,每次仅可以显示当前所选的地图号。
(四)可以实现显示当前已走步数功能
当用户开场游戏后,当所走位置符合要求,系统就会自动进展计数,并且当前计数值LED就会在P1_2、P1_3进展动态显示,以方便用户实时了解自己的成绩。
(五)可以实现限制最多可以走多少步以完毕游戏功能
当用户所走步数大于游戏规定的最大步数值时,系统自动完毕游戏。
(六)可以实现游戏胜利、失败时出现提示画面功能
当用户完成游戏或未完成游戏时LED点阵屏上会显示相应的画面,微笑即胜利,悲伤即失败。
(七)实际推广应用图所示
设计开发平台简介:
〔一〕硬件平台
CS—III型单片机实验开发设备是由计算机学院独立设计开发,用于?
单片机原理及应用?
课程的实验教学。
这套设备的设计和开发采用模块化组合设计,可以结合不同类型的单片机模块进展实验开发。
针对课程的教学采用了ATMEL 公司的AT89S52 单片机芯片,同时配合Keil 集成开发环境,支持汇编语言和C语言的程序设计。
功能特点:
*使用CPU主模块与实验板别离设计的方式,同时可以兼容不同类型的单片
机模块,并可根据用户需要独立设计模块。
*采用ISP通信技术,支持在线编程,方便用户开发。
*采用开关电源设计,平安可靠〔板上最高电压不超过18v〕,驱动电流最高
可达5V/3A,过载自动保护,方便用户其他设备的引入
*所有IO端口全部引出,方便与外部端口连接搭配。
*实验板上的功能器件可直接采用跳线器直接连接,减少过多的飞线连接。
*2个端口模拟显示,可直接模拟端口上下电平状态,方便用户观察。
*8个状态开关,可模拟256种开关状态,利用一个端口直接读取。
*交通灯模拟显示。
*6个数码管显示,方便开发秒表,时钟,计算器,以及显示特殊提示信息等。
*一个4*4矩阵键盘,配合状态模拟LED,可作键盘全扫描和逐行扫描,一个
shift键,方便键盘功能开发
*独立脉冲产生模块,可产生脉冲及方波,配合中断和计数器使用。
*普通键盘接口和鼠标接口,方便用户开发通信协议。
*采用串转并的方式进展端口扩展,同时配合汉字点阵模块显示,可作汉字显
示和字库开发。
*扩展显示模块。
*具有发声器,配合定时器方便用户开发电子音乐盒。
*具备8k字节程序/数据存储器扩展。
*具有RS232转换电路,完成UART通信实验,可与上位机进展通信设计。
*8通道8位A/D转换模块,可外接信号源,方便数据采集。
*8位D/A转换实验,两路模拟量输出。
实验开发板功能框图:
实验板布局图:
〔二〕软件平台
KeilC51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:
编译器、汇编器、实时操作系统、工程管理器、调试器等。
uVision2IDE可提供灵活的开发环境。
uVision2包含一个器件数据库(devicedatabase),可以自动设置汇编器、编译器、连接定位和调试器选项,以满足用户选择各种不同型号微控制器的要求。
此数据库包含:
片上存储器和外围设备的信息、扩展数据指针(extradatapointer)和加速器(mathaccelerator)的特性。
同时,uVision2还可以为片外存储器产生必要的连接选项,以确定起始地址和使用规模。
Keil集成开发环境的使用如下图:
硬件设计及实现:
根据CS—III型单片机实验开发设备设计出符合要求且在实验开发板上可实现功能的迷宫小游戏。
如下列图所示:
由上图可知,硬件用到了LED数码管显示、蜂鸣器、AT89S52、8X8点阵、4X4按键键盘,其中按键键盘相应位置所对应的数值如下列图所示:
软件设计及实现
〔1〕程序流程图如下图:
〔2〕关键代码
延时函数:
voiddelay()
{
inti;
for(i=0;i<500;i++);
}
键盘扫描函数:
intkeyboardscanning()
{
unsignedchartmp;
intxline,yline;
P2=0x0f;
tmp=P2&0x0f;
if(tmp==0x0f)//无键盘按下的状态
{
flag=0;
mark=0;
P3_6=1;
}
else//有键盘按下的状态
{
if(tmp==0x07)xline=0;
if(tmp==0x0b)xline=1;
if(tmp==0x0d)xline=2;
if(tmp==0x0e)xline=3;
mark=1;
P3_6=0;
}
P2=0xf0;
tmp=P2&0xf0;
if(tmp==0xf0)//无键盘按下的状态
{
mark=0;
flag=0;
P3_6=1;
}
else//有键盘按下的状态
{
if(tmp==0x70)yline=0;
if(tmp==0xb0)yline=4;
if(tmp==0xd0)yline=8;
if(tmp==0xe0)yline=12;
mark=1;
P3_6=0;
}
returnxline+yline;
}
获胜点阵屏显示函数:
voidWinScreenOut()
{
inti;
for(i=0;i<8;i++)
{
datasend(columnchoose[i]);//点阵屏列选择
datasend(winscreen[i]);//点阵屏列显示
P1_5=1;
}
}
失败点阵屏显示函数:
voidLostScreenOut()
{
inti;
for(i=0;i<8;i++)
{
datasend(columnchoose[i]);//点阵屏列选择
datasend(lostscreen[i]);//点阵屏列显示
P1_5=1;
}
}
迷宫地图显示函数:
voidMapScreenOut()
{
inti;
for(i=0;i<8;i++)
{
datasend(columnchoose[i]);//点阵屏列选择
datasend(Bitmapscreen[i]);//点阵屏列显示
P1_5=1;
}
datasend(columnchoose[7]);//点阵屏列选择
datasend(0x00);//点阵屏列显示
P1_5=1;
}
点移动判断函数:
voidmovejudgement()
{
if(mark==1)//判断是否有键按下
{
if(n==2&&flag==0)//下移判断
{
if(y==0||(Bitmapscreen[x]>>y-1&0x01)==1)
y=y;
else
{
y--;
step++;
}
flag++;
n=0;
}
elseif(n==5&&flag==0)//左移判断
{
if(x==0||(Bitmapscreen[x-1]>>y&0x01)==1)
x=x;
else
{
x--;
step++;
}
flag++;
n=0;
}
elseif(n==7&&flag==0)//右移判断
{
if(x==7||(Bitmapscreen[x+1]>>y&0x01)==1)
x=x;
else
{
x++;
step++;
}
flag++;
n=0;
}
elseif(n==10&&flag==0)//上移判断
{
if(y==7||(Bitmapscreen[x]>>(y+1)&0x01)==1)
y=y;
else
{
y++;
step++;
}
flag++;
n=0;
}
}
}
主函数:
voidmain()
{
intbt=0;
time();
TR0=1;//中断开关
while
(1)
{
if(mark==1)
{
if(n==15&&step==0)
{
p=4;
for(q=0;q<8;q++)
{
Bitmapscreen[q]=Bitmapscreen1[q];
}
}
elseif(n==14&&step==0)
{
p=3;
for(q=0;q<8;q++)
{
Bitmapscreen[q]=Bitmapscreen2[q];
}
}
elseif(n==13&&step==0)
{
p=2;
for(q=0;q<8;q++)
{
Bitmapscreen[q]=Bitmapscreen3[q];
}
}
elseif(n==12&&step==0)
{
p=1;
for(q=0;q<8;q++)
{
Bitmapscreen[q]=Bitmapscreen4[q];
}
}
}
bt++;
printstep(step,p);
if(x==7&&y==0&&step<5)//胜利点阵屏显示画面
WinScreenOut();
elseif(step>5)//失败点阵屏显示画面
LostScreenOut();
else
{
if(bt<50)
{
movepointscreen();//移动点显示函数调用
}
if(bt>=250)
bt=0;
MapScreenOut();//迷宫地图函数调用
}
}
}
实现效果测试:
〔1〕测试用例表:
测试号
测试内容
测试例图
是否实现
1
代码写入后系统运行正常
1
是
2
地图1选择后显示正常
2
是
3
地图2选择后显示正常
3
是
4
地图3选择后显示正常
4
是
5
地图4选择后显示正常
5
是
6
地图号显示正常
2,3,4,5
是
7
正确载入地图后红点可正常移动
6
是
8
红点移动步数显示正常
6
是
9
获胜后正确显示win图
7
是
10
失败后正确显示lost图
8
是
〔2〕硬件运行图:
图1
图2
图3
图4
图5
图6
设计总结:
通过此次训练收获很多,尤其是编程能力有很大提高,同时与同学交流能力也得到了锻炼,根本掌握了数码管,键盘扫描,蜂鸣器,定时器等的编程。
实际操作过程中也遇到了很多问题,编程中也出现很多问题,但通过翻书与同学交流,也都逐渐解决了,这次迷宫游戏做的也不够好,不能实现动态限时功能,单片机的原理和编程能力都还有待提高。