嵌入式课程设计报告 模拟计算器和乒乓球游戏机
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
近年来,随着科技的进步,计算机在人们的生活中的地位逐渐变得不可替代,同时,嵌入式领域的不断深入带动控制检测技术的日益更新,嵌入式系统具有低功耗、体积小、功能强、集成度高等优点。
在试验检测和自动控制方面,嵌入式的部件往往作为一个核心的控制系统再加以软件控制,使得生活中的自动控制领域发生技术性的飞跃。
本次设计包括两个内容:简易计算器和乒乓球游戏机,都是利用周立功S3C2410实验箱上的硬件实现的,在模拟计算器系统的设计中,利用键盘输入数据,LED数码管显示结果,能够进行加减乘除的运算。
在乒乓球游戏机的系统设计中,利用键盘作为球拍,用四个LED灯模拟球运动,数码管显示分数来模拟乒乓球的击球过程和分数的统计,LCD提示本局结束。
关键字:嵌入式 S3C2410 计算器乒乓球游戏机
目录
1 系统需求分析 (1)
1.1 简易计算器的设计 (1)
1.2 乒乓球游戏机的设计 (1)
2 概要设计 (2)
2.1 简易计算器的功能模块 (2)
2.2 乒乓球游戏机的功能模块 (3)
3 详细设计 (4)
3.1 简易计算器的程序流程图 (4)
3.2 乒乓球游戏机的程序流程图 (5)
3.3 简易计算器的功能实现 (6)
3.3.1 显示输入数据的函数 (6)
3.3.2 显示计算结果的函数 (6)
3.4乒乓球游戏机的功能实现函数 (8)
3.4.1 定时器的设置和中断服务函数 (8)
3.4.2 发球函数的实现 (8)
3.4.3 判断失误次数的函数实现 (9)
3.4.4 击球函数的实现 (10)
4 测试结果 (13)
4.1 简易计算器的测试 (13)
4.2 乒乓球游戏的测试 (14)
6 致谢 (16)
7 参考文献 (17)
1 系统需求分析
1.1 简易计算器的设计
设计一个能够实现简单的加减乘除运算的简易计算器,主要是键盘
的输入和数据的显示,利用实验箱上的键盘进行数据和运算符号的输入,
LED数码管实现数据和结果的显示,通过本设计的分析,主要实现一下
功能:
1.实验箱上数字键盘的数据输入,运算符的输入
2. LED动态显示输入的数据和计算的结果。
3. 输入运算符后数码管清屏。
1.2 乒乓球游戏机的设计
本设计主要是利用实验箱的资源模拟乒乓球的游戏过程,能够实现
击球、发球和计分的功能。
主要的需求分析如下:
1. 球的运动:利用LED流水灯的流向模拟球的运动方向,击球之后,
灯的运动反向。
2. 击球:甲、乙两方各有一个按键作为球拍,以按键的按下开关表
示击球。
如果没有失误,则甲方击球后发光二极管向乙方移动,反之亦
然。
3. 失误:接球方必须在放光二极管移动到自己方最末一个二极管时,按下击球键使球向对方移动。
如果击球过迟或者长时间没有击球,都认为是失误。
4. 计分:利用数码管显示失误的次数即分数,如果失误达到11分,则数码管熄灭表示输,同时LCD显示本局结束。
5. 速度的控制,利用数字键来控制灯运动速度的增减。
2 概要设计
2.1 简易计算器的功能模块
该设计主要有数据的输入和数据的显示,数据的输入靠键盘实现,主要是数据的输入和运算符的输入,在输入运算符之后数码管全灭等待下一个数据的输入,按下Enter键计算两次输入数据的运算结果,再次按下Enter键重新开始下一次计算数据的输入。
能够实现数码管的动态显示。
图2.1 简易计算器功能模块图
2.2乒乓球游戏机的功能模块
乒乓球游戏机的主要是球的运动部分、击球部分和失误统计部分。
球的运动部分能够实现任意球员发球,灯的运动方向不同,击球部分主要用键盘模拟球拍,在击球的时候判断是否已经超过击球时间,是否长时间没有击球,数码管主要是统计显示失误的分数,输球是刷新分数,当失误次数达到11时,熄灭掉输方的数码管,同时LCD显示本局结束。
该系统的功能模块图如下:
图2.2 乒乓球游戏机功能模块图
3 详细设计
3.1 简易计算器的程序流程图
图3.1 简易计算器程序流程图
3.2 乒乓球游戏机的程序流程图
图3.2 乒乓球游戏机程序流程图
3.3 简易计算器的功能实现
3.3.1 显示输入数据的函数
该函数主要功能是进行移位,使输入的数据能够准确显示输入的数据,而不是倒着显示。
void move_num(int num)
{
int i;
for(i=num;i>0;i--)
{
disp_buf[i] = disp_buf[i-1];
}
}
3.3.2 显示计算结果的函数
该函数主要是用来显示计算结果,并根据输入数据的小数点位数判断结果的小数点的显示位数和位置。
对于不同的运算保持不同的精度。
Void show_result(float Last_result,int point_position,int a)
{
int sum;
int i = 0;
if(a==1)
{
disp_buf[point_position]=0;
sum = (int)Last_result;
while(sum > 0)
{
disp_buf[i] = sum % 10;
sum /= 10;
i++;
}
disp_buf[point_position] += 0x80;
ZLG7290_SendBuf((uint8 *)disp_buf,8); }
if(a==2)
{
disp_buf[point_position * 2]=0;
sum = (int)Last_result;
while(sum > 0){
disp_buf[i] = sum % 10;
sum /= 10;
i++;
}
disp_buf[point_position * 2] += 0x80; ZLG7290_SendBuf((uint8 *)disp_buf,8); }
}
3.4乒乓球游戏机的功能实现函数
3.4.1 定时器的设置和中断服务函数
定时器设置为0.01秒,每0.01秒进入中断服务程序一次,在中断服务程序中进行时间的累加,到1秒中检测是否击球,没有击球就使失误分数加1。
//定时器设置
void settime()
{
// Fclk=200MHz,时钟分频配置为1:2:4,即Pclk=50MHz。
rTCFG0 = 250; // 预分频器0设置为250,取得200KHz rTCFG1 = 1; // TIMER0再取1/4分频,取得50KHz rTCMPB0 = 0x0000; // 设置定时器为0
rTCNTB0 = 500; // 定时0.01秒
rTCON = (1<<1); // 更新定时器数据
rTCON = (1<<0)|(1<<3); // 启动定时器
}
//中断服务程序
void IRQ_Time0(void)
{
time++;
// 清除中断标志
rSRCPND = 1<<10;
rINTPND = rINTPND;
}
3.4.2 发球函数的实现
该函数主要是确定发球方,进而确定球的运动方向。
void OneStart()//甲方发球
{
int j;
for(j=1;j <=8;j*=2)
{
LED_DispNum(j);
DelayNS(set_time);
}
}
void TwoStart()//乙方发球
{
int j;
for(j=8;j >=1;j/=2)
{
LED_DispNum(j);
DelayNS(set_time);
}
}
3.4.3 判断失误次数的函数实现
该函数主要是计算并显示双方失误的次数,判断是否达到11次,没有达到则继续击球,否则LCD显示本局结束,输球方的数码管熄灭。
void jisuan(int err1,int err2) //计算最后输赢
{
if(err1>=11)
{
disp_buf[4] = 0x1f;
disp_buf[5] = 0x1f;
ZLG7290_SendBuf((uint8 * )disp_buf,8);
DispDesktop(); // 显示图片
DelayNS(100);
}
if(err2>=11)
{
disp_buf[0] = 0x1f;
disp_buf[1] = 0x1f;
ZLG7290_SendBuf((uint8 * )disp_buf,8);
DispDesktop(); // 显示图片
DelayNS(100);
}
}
3.4.4 击球函数的实现
该函数主要是实现击球的情况,同时判断击球的时间是否已经超过预设时间,如果长时间不击球则认为失误或者击球时间超过1秒也是失误,失误分数加1,调用显示函数显示当前分数。
if(key==1)//甲方打球
{
DelayNS(5);
if(key==1)
{
if(start_flag==0)
{
time = 0;
start_flag = 1;
}
if(time <= 100)
{
for(j=1;j <=8;j*=2)
{
LED_DispNum(j);
DelayNS(set_time);
if(j==8)
{
time=0;
player_flag = 2;
}
}
}
else//甲方失误
{
error1++;
disp_buf[4] = error1 % 10;
disp_buf[5] = error1 / 10;
ZLG7290_SendBuf((uint8 * )disp_buf,8);
jisuan(error1,error2);
TwoStart();
time=0;
}
}
}
if(key==12)//乙方打球
{
DelayNS(5);
if(key==12)
{
if(start_flag==0)
{
time = 0;
重庆科技学院《嵌入式体系结构与接口技术》课程设计
start_flag = 1;
}
if(time <= 100)
{
for(j=8;j >=1;j/=2)
{
LED_DispNum(j);
DelayNS(set_time);
if(j==8)
{
time=0;
player_flag = 1;
}
}
}
else//乙方失误
{
error2++;
disp_buf[0] = error2 % 10;
disp_buf[1] = error2 / 10;
ZLG7290_SendBuf((uint8 * )disp_buf,8);
jisuan(error1,error2);
OneStart();
time=0;
}
}
}
4 测试结果4.1 简易计算器的测试
测试输入两个数相乘观察结果如下:
图4.1 输入数据的显示
图4.2 计算结果的显示
4.2 乒乓球游戏的测试
乒乓球游戏的测试中,主要测试灯的流动方向,击球之后反向运动,数码管的失误分数统计,能够动态显示计数分数,在结束时LCD屏幕的提示输方的数码管灯熄灭等。
主要显示功能如下图所示:
图4.3 乒乓球运动显示
图4.4 失误分数的显示
图4.5 结束提示
5 总结
通过本次简易计算器和乒乓球游戏机的设计,我对S3C2410实验箱的结构有了更加详细的了解,同时,也巩固了平时学习中的理论知识。
在对ZLG7290的运用中,熟悉并掌握了ZLG7290的操作原理和编程,会了键盘的消抖、连击处理等知识,简易计算器的设计完成了计算器的基本功能,能够实现加减乘除的运算,并且能够准确显示所输入的数据,得出正确的结果。
乒乓球游戏机的设计能够实现球运动方向的控制,击球之后球的运动方向反向,计算击球时间做出是否失误的判断。
失误达到11次之后显示本局结束。
6 致谢
首先感谢冯老师这两周的辛勤辅导,使我对基本理论知识有了更深刻的掌握,在本次课程设计中,老师的帮助给了我很多函数实现过程中的方便方法,让我也对C语言也有了一次提高的过程。
感谢在本次课程设计中帮助我的同学。
感谢学校和院系给我这次课程设计的机会。
7 参考文献
1、ARM嵌入式系统开发-软件设计与优化,Andrew N.Sloss,沈建华(译),北
京航空航天大学出版社,2005;
2、ARM体系结构与编程,杜春雷,清华大学出版社,2007;。