




免费预览已结束,剩余67页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
打地鼠游戏机(B题)2011级华工 猫酷队队员 李腾辉 陈健锋 蔡旭坤公布论文和全部源码,仅供学习摘要:本作品采用STC12C5A60S22单片机作为主控芯片,选取1602液晶作为显示屏,通过红外接收器用遥控控制游戏机的开机和关机。游戏程序应用C语言编译,主要使用函数为随机函数和键盘扫描函数。通过随机函数产生一个随机数,该随机数使显示屏对应位置出现“O”,同时对应的LED被点亮以代表地鼠的随机出现。通过键盘扫描函数,使每个按键各对应一个LED灯,通过按下该键使相应LED灯熄灭。本系统配有开场音乐和游戏音效。关键词:单片机、随机函数、键盘扫描函数、音乐Abstract: this work using STC12C5A60S2 microcontroller as the main control chip select LCD as a display,1602, through the infrared receiver remote control game startup and shutdown. This game program using C language editing, the main function used are the random function and keyboard scan function. Use random functions to generate a random number, at the same time the random number to display the corresponding position0 and the corresponding LED is illuminated to represent the random hamster. Through the keyboard scan function, make each key corresponds to a LED lamp, by pressing this key to the corresponding LED lights. The whole process has background music and game sound.Key words: SCM, random function, keyboard scan function, music游戏说明:本游戏由8个LED灯分别代表8只地鼠,当地鼠跳出来时显示屏对应位置出现“O”,同时该地鼠对应的LED灯被点亮,在限定时间内按下相应按键后,对应LED灯熄灭,同时“O”闪烁一下,表示打中该地鼠。游戏规则为,打中18号地鼠,每只得一分,在每局限定的时间30秒内得满当前关所需分即可进入一下关。游戏分四关:第一关,地鼠跳出时间长,得10分后,游戏进入第二关;第二关,地鼠跳出时间较短,得15分后,游戏进入第三关;第三关,地鼠跳出时间更快,得20分后,游戏进入第四关。第四关,得25分可过,但超越人类反应极限,不作阐述。方案比较、设计:方案一:用STC89C52作主控芯片,灯光表示地鼠,用红外遥控系统,用两层板完成整个电路。方案二:用STC12C5A60S2作主控芯片,用灯光和液晶“0”表示地鼠,加入音乐,用红外遥控系统,用一层板完成整个电路。显然,方案二更加适合,因为方案二中采用的主控芯片运算的速度要比方案一所用芯片快得多(达8倍),ram足够,而且游戏系统使用了定时中断函数,用STC12C5A60S2芯片会得到更快的响应。而且方案二加入了液晶显示和音乐,使游戏不那么单调,使玩家更好体现游戏的过程。最后,用一层板可以减少很多飞线,而且布局美观。电路原理:本系统包含六个子电路模块,分别为单片机系统电路、流水灯电路、蜂鸣器电路、2*4矩阵键盘、遥控红外接收电路、1602LCD显示屏模块。单片机系统电路流水灯电路蜂鸣器电路2*4矩阵键盘遥控红外接收电路1602液晶显示模块电路各模块整合并接上电源后,通过遥控打开游戏系统。随后,单片机系统驱动游戏系统进入初始化模式,同时蜂鸣器系统被驱动开始播放背景音乐。游戏开始后,背景音乐停止,单片机系统开始随机驱动8个LED灯点亮,同时液晶上对应位置出现O,蜂鸣器系统同时被驱动,发出“嘀”一声。此过程中,系统不断计时,不断刷新分数。游戏实现代码:/begin_display/#ifndef BeginDisplay_H#define BeginDisplay_H/#include#include#define uchar unsigned char#define uint unsigned intsbit lcden=P34;sbit lcdrs=P35;sbit dula=P26;sbit wela=P27;/sbit bemp=P23;int runlight9=0xff,0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f ;uchar run_light_num,kkk; /流水灯亮到哪一盏,kkk为定时0计数uchar begin_flag,time_counter,mouse_hit;void delay(uint z) /延时1ms uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);void delayus(unsigned char x) /最新12c5a延时1us while(x-) _nop_(); _nop_(); _nop_(); void delayms(unsigned char x) /最新12c5a延时1毫秒 unsigned char i,j,k; for(k = x; k 0; k-) for(i = 22; i 0; i-) for(j = 250; j 0; j-);void write_com(uchar com) lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0;void write_data(uchar date) lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0;void init() dula=0; wela=0; lcden=0; write_com(0x38); /显示模式设置 write_com(0x0f); /开显示、光标、闪烁 write_com(0x06); /读写一个后地址加一,不移屏 write_com(0x01); /清屏,显示清0,数据指针清0 write_com(0x80+0x01); /起始指针位置void begin_display() int i; uchar code table=#Whack a Mole#; uchar code table1= By CoolCat ; init(); write_com(0x80+0x10) ; for(i=0;i16;i+) /写入第一行字 write_data(tablei) ; delayms(5); write_com(0x80+0x50) ; /坐标变至下一行 for(i=0;i16;i+) write_data(table1i) ; delayms(5); for(i=0;i16;i+) write_com(0x18); /整屏左移一位 delayms(100); for(i=0;i5;i+) /整屏闪烁 write_com(0x08); delayms(50); write_com(0x0f); delayms(50); while(begin_flag);/*void light_run() int i; TH0=(65536-5000)/256; TL0=(65536-5000)%256; EA=1;/开中断 ET0=1; TR0=1; /开定时0 for(j=0;j4;j+) for(i=1;i9;i+) P0=runlighti; if(i=8) i=0; */void ready_go() int i; /bemp=1; /初始化不响 uchar code table3=Ready ; uchar code table4=Go ; uchar code table5=5 4 3 2 1; write_com(0x01); /清屏,显示清0,数据指针清0 write_com(0x80+0x01) ; for(i=0;i9;i+) /写入第一行字 write_data(table5i) ; bemp=bemp; delayms(500); bemp=1; write_com(0x80+0x40) ; /坐标变至下一行 for(i=0;i6;i+) /display ready 再停顿一下 write_data(table3i) ; delayms(50); delayms(500); for(i=0;i2;i+) write_data(table4i) ; delayms(50); write_data(0x7e) ; delayms(50); write_data(0x7e) ; /向右方向头 delayms(50); /*for(i=0;i16;i+) write_com(0x18); /整屏左移一位 delay(300); */ for(i=0;i2;i+) /整屏闪烁 write_com(0x08); delayms(50); write_com(0x0f); delayms(50); /*void Timer00() interrupt 1 /该中断为 流水灯转 TH0=(65536-5000)/256; TL0=(65536-5000)%256; run_light_num+; P0=runlightrun_light_num ; /流水灯亮 if (run_light_num=8) run_light_num=1; */#endif/GamingDisplay_h/#ifndef GamingDisplay_h#define GamingDisplay_h /有静止的time_score() , 动态的score_display() , /定时器2uchar iii; /定时器2的iuchar numm_temp=0x82;uchar hole= 0x80,0x82,0x83,0x84, 0x85,0x86,0x87, 0x88,0x8b ; /8b王牌鼠void first_line_mouse1602() int i; uchar code table8= #_#_# ; /8个地鼠 8是王牌地鼠 打中加2分 write_com(0x80); for(i=0;i16;i+) write_data(table8i) ; delay(1); void time_score() /显示时间和分数的单词 静态 加上显示地鼠 /尼码 还是得按5次才有显示 int i; /不要全部用i了 uchar code table6=Time ; uchar code table7=Score ; /dula=0; /wela=0; /lcden=0; /write_com(0x38); /显示模式设置 write_com(0x0c); /不要光标,闪烁 /write_com(0x06); /读写一个后地址加一,不移屏 write_com(0x01); /清屏,显示清0,数据指针清0 write_com(0x80+0x01); /起始指针位置 /write_com(0x0c); delay(5); first_line_mouse1602(); delayms(5); write_com(0x80+0x40) ; for(i=0;i5;i+) /第二行写时间 这个不用动 write_data(table6i) ; delayms(5); write_com(0x80+0x48) ; /第二行后 分数 for(i=0;i6;i+) write_data(table7i) ; delayms(5); void level_1_display() uchar code table8=#Level 1# ; int i; write_com(0x01); /清屏,显示清0,数据指针清0 write_com(0x80); /起始指针位置 for(i=0;i16;i+) write_data(table8i); delayms(50); delayms(500);void level_2_display() uchar code table8=#Level 2# ; int i; write_com(0x01); /清屏,显示清0,数据指针清0 write_com(0x80); /起始指针位置 for(i=0;i16;i+) write_data(table8i); delayms(50); delayms(500);void level_3_display() uchar code table8=#Level 3# ; int i; write_com(0x01); /清屏,显示清0,数据指针清0 write_com(0x80); /起始指针位置 for(i=0;i16;i+) write_data(table8i); delayms(50); delayms(500);void level_4_display()uchar code table8=#BT#Level 4# ;int i;write_com(0x01); /清屏,显示清0,数据指针清0write_com(0x80); /起始指针位置for(i=0;i16;i+)write_data(table8i);delayms(50);delayms(500);void congratulation() /过关后的庆贺 int i; uchar code table9=congratulation!; uchar code table10=Your score ; write_com(0x01); /清屏,显示清0,数据指针清0 write_com(0x80); /起始指针位置 for(i=0;i16;i+) write_data(table9i); delayms(50); write_com(0x80+0x41); for(i=0;i10;i+) write_data(table10i); delayms(50); write_com(0x80+0x4c) ; write_data(mouse_hit/10+0x30) ; /显示分数十位 /delay(5); write_data(mouse_hit%10+0x30) ; /显示分数个位 write_com(0x50); void game_over() / 失败 int i; uchar code table9= Gmae Over ; uchar code table10=Your score ; write_com(0x01); /清屏,显示清0,数据指针清0 write_com(0x80); /起始指针位置 for(i=0;i16;i+) write_data(table9i); delayms(50); write_com(0x80+0x41); for(i=0;i10;i+) write_data(table10i); delayms(50); write_com(0x80+0x4c) ; write_data(mouse_hit/10+0x30) ; /显示分数十位 /delay(5); write_data(mouse_hit%10+0x30) ; /显示分数个位 write_com(0x50); void mouse_1602display(uchar numm) /first_line_mouse1602(); write_com(holenumm_temp) ; write_data(0x5f) ; /0x5f=_ write_com(holenumm) ; write_data(0x4f) ; / 0x4f=大O numm_temp=numm; write_com(0x50);void init_timer2() RCAP2H=(65536-50000)/256; /重装载计数器赋初值 RCAP2L=(65536-50000)%256; ET2=1; /开定时器2中断 EA=1; /开总中断void gaming_display() init_timer2(); TR2=1; /开启定时器,并设置为 自动重装载模式/*void timer2() interrupt 5 /调用定时器2,自动重装载模式 TF2=0; /定时器2的中断标志要软件清0 iii+; /计数标志自加1 if(iii=8) iii=0; /将静态变量清0 score_display(); */#endif/mouse_level/#ifndef MouseLevel_H#define MouseLevel_H /有time_counter, mouse_hit ,random , key_scan , / mouse_out , 两个定时中断0和1#define level_1 50#define level_2 70#define level_3 80 /不同等级对应不同的地鼠数#define level_4 100uchar seed,keyscan_num, temp_num,random_num; /声明时间种子,键盘数,临时数,计时数 /击中地鼠数int iiii; int deng9=0xff,0xfe,0xfd,0xfb,0xf7, 0x7f,0xbf,0xdf,0xef ; int random()uchar j,k;srand(seed);k=(rand()%8+1);j=1+(int)(16.0*rand()/65535); /j和k是两种实现随机机算法,j算法优return(k) ;uchar keyscan();void mouse_out(uchar mouse_num,uchar speed) /第一个变量是老鼠数,第二个是速度 uchar i,kk, random_temp ,keyscan_temp; keyscan_num=0; random_num=1; mouse_hit=0; time_counter=30; /初始化时间和分数 TMOD=0X11; TH0=(65536-61440)/256; /定时中断初始化 开了2个中断 TL0=(65536-61440)%256; /0是给随机函数用的,1是进行定时扫描键盘的 TH1=(65536-10000)/256; TL1=(65536-10000)%256; EA=1;/开中断 ET0=1; TR0=1; /开定时0 ET1=1; TR1=1; for(kk=0;kk=7) random_num=random_temp-1; else random_num=random_temp+1; P1=dengrandom_num; bemp=0; delayms(50); bemp=1; /for(i=0;i100;i+) delay(99); for(i=0;i=10) congratulation(); for(i=0;i=15) congratulation(); for(i=0;i=20) congratulation(); for(i=0;i100) seed=0; /时间种子服务 iiii+; if(iiii%3=1) mouse_1602display(random_num); /1602液晶显示地鼠 write_com(0x80+0x4e) ; write_data(mouse_hit/10+0x30) ; /显示分数十位 /delay(5); write_data(mouse_hit%10+0x30) ; /显示分数个位 write_com(0x50); if(iiii=1) /经过计算15次恰为1秒 ,time_counter用以显示剩余时间 time_counter- ; if(time_counter=0) TR0=0; /关中断 TR1=0; P1=deng0; /灯全灭 first_line_mouse1602(); write_com(0x80+0x45) ; write_data(time_counter/10+0x30) ; /显示时间十位 /delay(5); write_data(time_counter%10+0x30) ; /显示时间个位 /delay(5); write_com(0x50); if(iiii=19) iiii=0; void Timer1() interrupt 3/该中断时定时进行键盘扫描服务 TH1=(65536-5000)/256; TL1=(65536-5000)%256; temp_num=keyscan(); /这个判断语句防止不断收到0 if(temp_num) keyscan_num=temp_num; uchar keyscan() uchar num,temp; P3=0xfe; temp=P3; temp=temp&0xf0; num=0; if(temp!=0xf0) /按下去 delay(5); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xee:num=1; break; case 0xde:num=5; break; /* case 0xbe:num=4; break; case 0x7e:num=8; break; */ /* while(temp!=0xf0) /松手才有效 temp=P3; temp=temp&0xf0; */ P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(5); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xed:num=2; break; case 0xdd:num=6; break; /* case 0xbd:num=3; break; case 0x7d:num=7; break; */ /* while(temp!=0xf0) temp=P3; temp=temp&0xf0; */ P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(5); temp=P3; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xeb:num=3; break; case 0xdb:num=7; break; /* case 0xbb:num=2; break; case 0x7b:num=6; break; */ /* while(temp!=0xf0) tem
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 菏泽会考试题及答案
- 河南话考试题及答案
- 广电内勤考试题及答案
- 公墓岗位考试题及答案
- 工务培训考试题及答案
- 高中玄学考试题及答案
- 高考试题及答案大全
- 妇幼考试题目及答案
- 销售业务订单跟踪处理操作指南
- 防触电考试题及答案
- 2025年福建省榕圣建设发展有限公司项目招聘12人笔试参考题库附带答案详解
- 一年级上册语文晨读课件
- 高职院校教师职业发展规划指南
- 2025重庆市专业应急救援总队应急救援人员招聘28人考试参考题库及答案解析
- 黑龙江省龙东地区2025届中考数学试卷(含解析)
- 2025-2026学年人教版(2024)小学美术二年级上册(全册)教学设计(附目录P144)
- 2025高考地理试题分类汇编:地球上的水含解析
- 2026届高考作文写作素材:《感动中国》2024年度十大人物素材及其运用
- 2025年重庆八中宏帆中学小升初自主招生数学试题(含答案详解)
- 口腔咨询顾问入门知识培训课件
- 公司金融学 课件 第三章:货币的时间价值
评论
0/150
提交评论