




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程实验报告 课 程 名 称: 夏季小学期实训 实验项目名称: 可切换单双人手速游戏 专 业 班 级: 姓 名: 学 号: 指 导 老 师 : 完 成 时 间: 2017 年 9 月 6 日信息科学与工程学院1、 设计内容利用STC-B单片机设计一个具有如下功能的手速游戏:1、 能够读取按键的次数并且能够用数码管表示出来;2、 能够双人同时按键,并且能自动显示最终比赛结果,显示数多的一方获胜;3、 能够设定一段时间用于比赛,其余时间不能扫描按键;4、 可以切换双人比赛模式与单人训练模式,单人模式只单纯在一段时间内计数;5、 有蜂鸣器提示游戏开始,并且有led流水灯作为时间提示;2、 运行效果说明程序下载到STC学习板上后:1、按下Reset,之后蜂鸣器发出响声,作为预备开始信号;2、 在开始之后,不断按下Key1与Key3,数码管上显示的个数不断增加,同时led从左到右逐个亮起,作为时间信号。3、当led从左至右亮完之后,时间停止,此时按下Key按键数码管不再加1;数码管上显示的个数即在规定时间内,按下Key键的次数并且能比较出按键次数多的一方。3、 方案设计与论证按照系统设计的要求与功能,将系统分为主控模块、按键扫描模块、数码管显示模块、LED显示模块、蜂鸣器电路、电源电路、复位电路、晶振电路几个模块,系统框图如下图所示。主控模块采用STC15F2K61S2单片机,按键模块用3个按键,用于进行双方按键计数以及切换单双人模式,显示模块有数码管显示比赛结果与过程、LED显示电路显示定时时间作为游戏时间的提示,蜂鸣器模块利用蜂鸣器定时鸣叫作为游戏开始前的预备信号。 复位电路 按键扫描主控模块STC15F2K61S2 晶振电路 蜂鸣器电路 电源电路 显示电路4、 硬件单元电路设计与参数计算1、 主控模块选用STC15F2K61S2单片机作为中央处理器,如下图所示: 2、 复位电路复位电路由电阻和极性电容组成,通过高电平使单片机复位;此复位电路同时具备了上电复位和手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机,死循环等情况,通过手动复位就可以实现重新启动的操作。手动按钮复位需要人为在复位输入端RST上加上高电平。一般采用的办法是在RST端和正电源Vcc之间接一个按钮和一个电阻,如图所示,当人为按下按钮时,则Vcc的+5电平就会直接加到RST端; 3、 按键电路按键电路由3个按键开关以及导航按键组成;在本实验设计中只用到三个轻触按键开关,KEY1用于按键计数,由右三位数码管显示按键结果;KEY3键用于案件计数,由左三位数码管显示按键结果,KEY2用于模式切换,用于从单人模式与双人模式中互相切换;4、 显示电路显示电路采用数码管与LED共同显示实验现象与结果,图中有数码管与LED的电路原理以及接口说明;接口P0口的8位输出分别控制8个发光二极管L0L7的阳极;而P2.3经反相器U4C控制8个发光管阴极E3;当阳极为高(对应P0口位为1)、阴极为低时,对应的二极管将会发光。而P2.3经反相器U4C控制74HC138的使能信号E3,结合P2.0、P2.1、P2.2这3个位选控制信号确定8个LED数码管中的哪个被点亮;电阻R15R22为限流电阻。当段选为高、使能信号有效时,对应的LED管将会发光;通过以一定频率扫描位选信号,选择段选信号进行数码管点亮一段时间,从而给人视觉上几个数码管几乎同时显示的效果;同时扫描led,使led从左到右不断亮起。本实验中在双人模式中,数码管左三位用于记录KEY3按键按下的次数,右三位记录KEY1按键按下的次数,中间两位在比赛过程中显示“”,如果两边按键按下次数相同,显示等号;两个数码管中靠近胜方的上部点亮,靠近数码管败方的下部被点亮;在单人模式中,左右三位数码管都显示KEY1按键按下的次数。5、 蜂鸣器电路蜂鸣器电路通过控制三极管的导通和截止来实现蜂鸣器的鸣响与不响;蜂鸣器鸣叫定时,定时1s鸣响之后停止鸣叫,切换模式之后也会鸣响1s作为游戏开始的预警;5、 软件设计与流程图1、 程序主流程图LED灯熄灭,数码管显示最终胜负结果2、 程序流程图解析主程序首先初始化定时器参数、按键参数、接口、蜂鸣器以及显示模块;然后开始进入定时中断函数同时可扫描KEY2模式切换键,选择切换单双人模式,按下则选择单人模式,不按选择双人模式;选择成功,定时器定时1s之后,蜂鸣器连续鸣叫1s,作为提示游戏开始的信号,此时只有数码管的初始显示与蜂鸣器的鸣叫,1s之后蜂鸣器鸣叫暂停;接着是LED灯从左到右开始依次点亮,点亮时间间隔1s,在LED点亮开始,程序开始扫描KEY1、KEY2键,并把扫描的次数显示在数码管上,LED全部点亮后不能再扫描按键;结果由数码管显示,胜方是按键次数的一方,靠近按键次数多的一侧,中间数码管点亮上半部分,靠近败方的数码管点亮下半部分,相等次数时显示等号;期间一直可以进行KEY2扫描,进行模式切换。6、 函数说明1、 延时函数利用while循环延时200ms;2、 按键扫描消抖函数利用参数k1、k3作为按键KEY1、KEY3的参数,当检测到按键按下,即检测到低电平时,此时参数值迅速翻转,由初始值0变为1,避免一次按下却扫描到多次低电平,所以此时if条件句里边就是当KEY与参数同时成立时,才能扫描一次键盘;然后在下一次检测到按键的高电平时,参数再次反转,就返回到参数的初始值,在一次次重复检测中能够不会抖动,数码管的显示也不会有延时或者抖动暂停等现象;3、 数码管显示函数利用for循环显示8个数码管,每个数码管显示的数据不同,在双人模式中1-3数码管显示KEY1键按键扫描到的次数结果,6-8位数码管显示KEY3键按键扫描到的次数结果,4-5位数码管显示的内容由程序运行的进度而定,在游戏过程中,数码管段选是0x40,游戏结束之后,这两个数码管的作用是显示胜败结果;按键次数多的一方,点亮靠近其数码管的上部,段选信号是0x63;次数少的一方,点亮靠近其数码管的下部,段选信号是0x5c;单人模式中1-3、6-8位数码管都是显示KEY1按键次数;双人模式:void display_1()/双人模式的数码管显示led_sel=0;/数码管显示,led_sel置为0for(i=0;icount_2)/点亮第4位数码管上半部分j=11;else if(count_1count_2)j=12;else if(count_1count_2)j=11;else if(count_1=count_2)j=13;else j=10;else if(i=5)/数码管6-8显示count_2j=count_2%10;else if(i=6)j=(count_2%100)/10;else if(i=7)j=count_2/100;P2=weixuani;/选择数码管的位数P0=duanxuanj;/显示对应的数值delay_ms(1);/延时200ms单人模式:void display_2()/单人模式的数码管显示led_sel=0;/数码管显示,led_sel置为0for(i=0;i8;i+)if(i=0)/数码管1-3、6-8都显示KEY1的按键结果count_1j=count_1%10;else if(i=1)j=(count_1%100)/10;else if(i=2)j=count_1/100;else if(i=3)j=14;else if(i=4)j=14;else if(i=5)j=count_1%10;else if(i=6)j=(count_1%100)/10;else if(i=7)j=count_1/100;P2=weixuani;/选择数码管的位数P0=duanxuanj;/显示对应的数值delay_ms(1);4、 LED显示函数LED显示函数是由一个if循环组成,count参数的作用是延时,由于LED扫描频率较快,利用延时函数能更好的观察实验现象;连续扫描50次即当count加到50时,表示两次扫描之间相隔1s;设置LED标志位light,当所有的LED灯全部点亮,即信号led=0xff时,标志位light反转,此时led重新设置为0x00,而同时按键扫描停止,在数码管显示函数中,根据light标志位,可以开始比较并显示最终比赛结果;当LED并没有全部点亮时,每当count累加到50时,led向右移一位并且加1;这样就能实现实验LED的定时点亮以及游戏的定时;void display_led()/led显示电路if(count=50)&(light=0)/延时1s并且led标志位位0if(led = 0xff) /led等于0xff时,重新赋值0x00,led灯全部熄灭,标志位反转led = 0x00;light=1;elseled = (led 1) + 1;/led值逐个左移并且补1,led依次点亮,直至所有全亮count=0;/重置count的值5、 蜂鸣器定时函数设置定时器工作模式为方式1,初始化TMOD为0x01,工作模式为16位定时器,并且设置定时器的初值TH0=0xfc,TL0=0x18,打开中断总开关EA=1,设置定时参数pp=0;在中断函数中pp累加,当pp累加到1000(相当于定时1s)时,蜂鸣器标志位反转,并且此时关闭中断总开关,不接受其他的中断信号;当蜂鸣器标志位反转的时候,蜂鸣器停止鸣叫;void timer0() interrupt 1 /定时中断TH0=0xfc;TL0=0x18;pp+;if(flag)beep=beep;elsebeep=0;if(pp=1000)/定时器flag=!flag;/蜂鸣器标志位反转EA=0;/关闭中断总开关6、 切换模式函数在程序开始运行时,直接进入双人模式,首先蜂鸣器鸣叫,然后led开始点亮;当扫描到KEY2时,退出双人模式的while循环,此时再次初始化,进入单人模式,但当扫描KEY2按下时,又切换回双人模式;切换模式之后都会重新调用初始化函数,然后经过相同的时间控制函数,显示模式稍微不同,实现了在单双人模式之间的转换,切换模式在程序的主函数中;void main()while(1)Init();/初始化,进入双人模式while(1)if(pp=1000)/定时器flag=!flag;/蜂鸣器标志位反转EA=0;/关闭中断总开关display_1();/数码管显示speed();if(KEY2=0)/扫描到KEY2键,则切换你while(!KEY2);break;Init();/初始化,进入单人模式while(1)if(pp=1000)flag=0;EA=0;display_2();speed();if(KEY2=0)/扫描到KEY2键则切换回双人模式while(!KEY2);break;7、 实验现象1、 双人模式开始扫描按键,LED正在逐步点亮2、 扫描按键,右侧数码管显示KEY1按键按下的次数3、 结果显示左右按键次数相等,中间两位显示等号4、 结果显示右侧按键次数比左侧多,4号数码管上部点亮;5、 结果显示左侧按键次数比右侧多,5号数码管上部点亮;6、 单人模式开始,右侧三位数码管与左侧三位数码管都点亮,LED正在依次点亮;7、 单人模式中按键扫描开始,左右两侧数码管都显示KEY1按键的次数;8、 实验结论与心得通过这次程序设计,我对单片机的理论知识有了进一步的掌握,对单片机的原理和实际应用有了更多的理解和掌握。我对单片机C语言编程有了更深刻的认识和更扎实的掌握,通过不断的修改、不断尝试,对源代码各个模块的函数都有了一个非常深入的掌握。在收获知识的同时,还收获了阅历,收获了成熟。在此过程中,不仅培养了独立思考、动手制作的能力,在各种其他能力上也都有了提高。更重要的是,在课程设计中,我们学会了很多学习的方法,真的是受益匪浅。要面对挑战,只有不断的学习、实践。9、 源程序程序头文件STC15F2K60S2.H#includeSTC15F2K60S2.H#define uint unsigned int#define uchar unsigned charuchar duanxuan=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x63,0x5c,0x48,0x00; /显示0-9、输赢情况uchar weixuan=0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00; /数码管7-0/引脚别名设置sbit KEY1 = P32;/K1按键sbit KEY2 = P33;/K2按键sbit KEY3 = P17;/K3按键sbit led_sel = P23;/数码管、LED引脚sbit beep = P34;/蜂鸣器引脚uint led=0x01;/LED初始化点亮第一个灯uint count_1;/KEY1计数参数uint count_2;/KEY3计数参数uint i,j;uint k1,k2,k3;/三按键的控制参数uint flag;/flag控制蜂鸣器开启关闭情况uint light;/light控制LED参数uint pp;/参数pp控制蜂鸣器定时uint count=0;/控制延时的参数void Init() /推挽输出P0M0 = 0XFF;P0M1 = 0X00;P2M0 = 0X08;/设置P23为推挽模式P2M1 = 0X00;P3M1 = 0x00;P3M0 = 0x10; /设置P34为推挽模式TMOD=0x01; /设置定时器0,工作方式0,16位自动重装定时器TH0=0xfc; /设定定时器0的初值TL0=0x18;EA=1; /打开总中断ET0=1; /打开定时器0中断允许位TR0=1;flag=1; /标志位置初始化light=0;pp=0;count_1=0;count_2=0;led=0x01;count=0;i=0,j=0;k1=0,k2=0,k3=0;beep=0; /蜂鸣器引脚置0,以保护蜂鸣器led_sel = 0;/选择让数码管发光P0 = 0;/初始化P0,让LED灯全部熄灭void delay_ms(uint n)/延时函数,一次延时200mswhile(n)uchar i, j;i = 11;j = 190;dowhile (-j); while (-i);n-;void key_scan()/按键扫描函数,设置按键消抖if(KEY1=0)&(k1=0)/在KEY1扫描到的时候,k1改变count_1+;k1=1;/扫描到KEY1时,count_1计数累加else if(KEY1=1)/扫描到高电平时,使参数变回初始值k1=0;if(k3=0)&(KEY3=0)count_2+;k3=1;/扫描到KEY3时,count_2计数累加else if(KEY3=1)k3=0;void display_1()/双人模式的数码管显示led_sel=0;/数码管显示,led_sel置为0for(i=0;icount_2)/点亮第4位数码管上半部分j=11;else if(count_1count_2)j=12;else if(count_1count_2)j=11;else if(count_1=count_2)j=13;else j=10;else if(i=5)/数码管6-8显示count_2j=count_2%10;else if(i=6)j=(count_2%100)/10;else if(i=7)j=count_2/100;P2=weixuani;/选择数码管的位数P0=duanxuanj;/显示对应的数值delay_ms(1);/延时200msvoid display_2()/单人模式的数码管显示led_sel=0;/数码管显示,led_sel置为0for(i=0;i8;i+)if(i=0)/数码管1-3、6-8都显示KEY1的按键结果count_1j=count_1%10;else if(i=1)j=(count_1%100)/10;else if(i=2)j=count_1/100;else if(i=3)j=14;else if(i=4)j=14;else if(i=5)j=count_1%10;else if(i=6)j=(count_1%100)/10;else if(i=7)j=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国浓缩蚝汁行业市场发展现状及竞争格局与投资发展研究报告
- 2025-2030中国注射用磷酸钾行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国泡沫混凝土行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国没药行业市场深度分析及发展趋势与投资前景研究报告
- 2025-2030中国沙滩毛巾行业市场发展趋势与前景展望战略研究报告
- 加强健康计划的健康管理师试题及答案
- 心理咨询师考试效率提升试题及答案
- 2说话要算数 第二课时 教学设计-2023-2024学年道德与法治四年级下册统编版
- 母猪产房管理技巧测试题及答案
- 婴儿发展里程碑试题及答案
- 名著知识竞赛
- 《系统思维解决问题》
- 术中输血技术操作评分标准
- 高敏肌钙蛋白在心肌梗死早期诊断的应用专家共识
- 保安经理工作计划
- 2024中国一重集团有限公司管理二级单位领导人员岗位招聘笔试参考题库附带答案详解
- 《配网设备状态检修试验规程》
- 2024年度-网盘金融学(货币银行学)黄达pdf
- 环境内分泌干扰物
- 三氧治疗糖尿病足
- 医疗器械临床试验三方协议模板
评论
0/150
提交评论