嵌入式c语言小学期实验报告,小学期STC实验报告.doc

1bc5148b59e6a617d39058cfa22d1529.gif小学期STC实验报告.doc

课程实验报告课 程 名 称: 夏季小学期实训 实验项目名称: 可切换单双人手速游戏 专 业 班 级: 姓 名: 学 号: 指 导 老 师 : 完 成 时 间: 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)/点亮第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=count_1/100;P2=weixuani;/选择数码管的位数P0=duanxuanj;/显示对应的数值delay_ms(1);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的值void speed()/游戏时间控制if(flag=0)&(light=0)/开始扫描按键key_scan();if(flag=0)/蜂鸣器停止之后进入led显示count+;led_sel=1;P0=led;delay_ms(2);display_led();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;void timer0() interrupt 1 /定时中断TH0=0xfc;TL0=0x18;pp+;if(flag)beep=beep;elsebeep=0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值