- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
打地鼠的单片机设计
任务三 打地鼠
NO5.2.1 任务要求
游戏开始时,闪烁显示得分0,玩家需要同时按下复合按钮开始,(本例CD键)当松开复合按钮后,数码管任意的跳出10个数,速度由慢到快,每跳出一个数玩家需按下相应的按钮,如果命中得1分,且发光二极管发光提示命中,如果没有命中,不得分发光二极管不发光,当10个结束之后,最后闪烁显示出玩家的积分。打中1个积1分,如果需要重新开始则需再次按下复合按钮。
NO 5.2.2 任务分析
本任务是一个综合设计题,它把前面两个任务很好的整合在一起,并且用到前面学的很多细节方面,比如说速度由慢到快怎么编,比如说显示的成绩闪烁显示怎么编,比如说复合按钮做某件事情怎么编。
上图和前面学到的图不同的地方时多了一个发光二极管LED-BLUE。
软件流程图:
NO 5.2.3 相关知识:
1 速度由慢到快的做某件事怎么编?
方法: for(i=0;ix;i++)
{delay(10000);}
我们可以通过改变变量x的值来实现delay延时的时间, x的初值可以定义成30,每跳出一个地鼠让x-=2;当一个周期结束之后即10个地鼠全跳出之后,让x回到初值即x=30;
2 显示的成绩闪烁怎么编?
方法:
void T0_PRG() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
scan();
c++;
if(c==30) c=0;
if(r==0c15) DM=0X00;
if(r==0c15) DM=~seg[m];
}
通过中断的形式来实现的,每调用一次中断让变量c++;当10个地鼠打完之后,r=0;r为结束标志,此时如果c15;数码管消隐,否则显示即可。
3 复合按钮做某件事情怎么编?
方法:
用到AB,同时满足AB两个条件时做某件事
switch(key_val)
{
case 12:
{a=1;break;}
case 13:
{b=1;break;}
}
在键盘扫描中:用到switch选择如果12号和13号按下会相应的标志位为1。
在主程序中:
if(a==1b==1) {r=1; a=0; b=0;}
if(r==1)
{ random();}
如果a=1并且b==1 则标志位r=1,调用随机函数;并且给ab清零,为下一次做准备。
NO 5.2.4 任务实施:
1 PROTEUS 画图 比较上个任务多了一个发光二极管
2 KEILC软件编程:
#include reg52.h
#include stdlib.h
#define DM P0
unsigned int tt;
unsigned int k;
unsigned int x=30;
unsigned int c;
unsigned char n,m,r ;
sbit H0=P1^0;//键盘
sbit H1=P1^1;
sbit H2=P1^2;
sbit H3=P1^3;
sbit L0=P1^4;
sbit L1=P1^5;
sbit L2=P1^6;
sbit L3=P1^7;
sbit D=P3^0;//灯
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x08,0x03,0xc6,0xa1,0x86,0x8e};
unsigned char key_val,a,b;
void scan();
void delay(unsigned int t);
void random();
void scan()//键盘扫描
{
H0=0;H1=0;H2=0;H3=0;L0=1;L1=1;L2=1;L3=1;
if(L0==0||L1==0||L2==0||L3==0)
{
delay(500);
if(L0==0||L1==0||L2==0||L3==0)
{
H0=0;H1=1;H2=1;H3=1;L0=1;L1=1;L2=1;L3=1;
if(L0==0) key_val=0;
if(L1==0) key_val=1;
if(L2==0) key_val=2;
if(L3==0) key_val=3;
while(L0==0||L1==0||L2==0||L3==0);
H0=1;H1=0;H2=1;H3=1;L0=1;L1=1;L2=1;L3=1;
if(L0=
文档评论(0)