单片机工程实践报告.docx
《单片机工程实践报告.docx》由会员分享,可在线阅读,更多相关《单片机工程实践报告.docx(13页珍藏版)》请在冰豆网上搜索。
单片机工程实践报告
单片机工程实践
(第7组)
组长:
乒乓球游戏机(任务十)
王伟男(电子08-1班)学号:
200810203017
周秀丽(电子08-1班)学号:
200820203071
徐菡卿(电子08-1班)学号:
200810203033
斯日古楞、高鹏、韩海波、陈宇(研)
设计时间:
2011年3月7日~2011年3月18日
设计目的:
用单片机实现一个模拟的乒乓球游戏机
设计任务:
任务内容:
开发LED显示模块加速模块、显示模块、蜂鸣器模块
任务分配:
组长:
王伟男负责主程序的编写以及定时器和中断的编写及联调组员:
徐菡卿负责编写键盘采集程序编写
组员:
周秀丽负责编写延时子程序和蜂鸣器的程序的编写
框图(包括自检和任务的框图):
主程序框图、子程序框图及相关说明
(1)主程序框图
乒乓球向左移的子程序框图(乒乓球向右移动的程序同理):
分数显示子程序:
键盘自检:
LED自检程序:
四、
程序清单:
・***************************************************************************
***********************
;#######功能:
实现模拟乒乓球游戏机功能
;##############CPU:
AT80C51
;##############晶振频率11.0592MHz
;##############开发环境:
伟福ICE
;########返回值:
无
;########设计人:
刘红喜、王欣冉、郭兴荣
;########组别:
一组
;########游戏规则:
当按下k3键时游戏开始,首先从左侧发球,其中k1和k4键分别代表左侧球拍和右侧####
;#################当左侧球拍提前击球或者滞后击球都会为对方加分,接住球不计分,右侧同理########
;#################当接住球后开始加速,但是当提前击球或者滞后击球则停止加速球的运动###########
;#################规定每局打20次,在20次结束后开始显示比分
###################################
************************
score_leftequ30h;uint_leftequ31h;decade_leftequ32h;score_rightequ33h;uint_rightequ34h;decade_rightequ35h;定义右侧分数十位缓存区
定义左侧分数缓存区左侧得分的个位缓存区左侧得分的十位缓存区定义右侧分数缓存区
定义右侧的分缓存区
定义蜂鸣器端口定义k1位定义k2位定义k3位定义k4位定义拨盘
speedequ36h;定义球移动速度缓存区speed2equ37htimesequ38h;为发球的次数开辟缓存区beepbitp2.3;k1bitp1.0;k2bitp1.1;k3bitp1.2;k4bitp1.3;sw1bitp1.4;sw2bitp1.5sw3bitp1.6sw4bitp1.7org00hajmpmainorg0bhajmptimer0;timer0为定时器0子程序
org30h;错开中断入口地址
;下面是主程序##################
;#######################################
main:
init:
movp1,#0ffh;
movp0,#00h;
setbp2.3;
movscore_left,#0h;
movuint_left,#0h;
movdecade_left,#0h
movscore_right,#0h;
movuint_right,#0h;
movdecade_right,#0h;
键盘端口初始化
关数码管
关闭蜂鸣器
初始化分数
初始化左侧分数个位
初始化右侧分数
初始化右侧个位分数
初始化右侧分数十位
movspeed,#60;初始化球的移动速度movtimes,#20;每局打20下
movTMOD,#01h设置定时计数器方式1movTH0,#0b1h
movTL0,#0e0h;定时20msmovIE,#82h;开总中断和定时计数器0中断movr7,#0h;
start:
jbk3,start;
lcalldelay2;
jbk3,start;
初始化r7
启动判断开关
延时去抖动
如果k3键按下则继续执行,否则返回
lcallwin_buzzer;*****************************************;乒乓球左移程序;此段程序用于将“球”向左移动
led_left:
movp0,#80h;送入“一”
djnztimes,led_left1;判断是否为20次lcallscore_display_leftled_left1:
acallsel5acalldelayacallsel8led_left2:
jbk1,led_left3;
lcalldelay2
jbk1,led_left2lcallled_left_failled_left3:
acallsel4acalldelayacallsel8led_left4:
jbk1,led_left5lcalldelay2
如果k1不按下则
如果在此时按下k1键则跳入输判断子程序
jbk1,led_left4acallled_left_fail;
led_left5:
acallsel3acalldelayacallsel8led_left6:
jbk1,led_left7lcalldelay2jbk1,led_left6lcallled_left_fail;
如果没有按下键则重新从左发球
led_left7:
acallsel2acalldelayacallsel8led_left8:
jbk1,led_left9lcalldelay2jbk1,led_left8lcallled_left_failled_left9:
acallsel1acalldelayacallsel8led_left10:
jbk1,led_left11;
nop;较容易出问题处noplcalldelay2jbk1,led_left10acallsel1;开数码管第一位nopacallwin_buzzer
setbtr0;如果接住球启动定时器加速球的速度ljmpled_rightled_left11:
incscore_right
lcallfail_buzzerclrTR0ljmpled_left
;此程序实现乒乓球右移动程序
・*****************************led_right:
movp0,#80h;送入“一”djnztimes,led_right1lcallscore_display_leftled_right1:
acallsel1acalldelayacallsel8
led_right2:
jbk4,led_right3
lcalldelay2
jbk4,led_right2
lcallled_right_failled_right3:
acallsel2
acalldelay
acallsel8led_right4:
jbk4,led_right5lcalldelay2jbk4,led_right4lcallled_right_failled_right5:
acallsel3
acalldelay
acallsel8led_right6:
jbk4,led_right7
lcalldelay2jbk4,led_right6lcallled_right_failled_right7:
acallsel4
acalldelay
acallsel8led_right8:
jbk4,led_right9lcalldelay2jbk4,led_right8
lcallled_right_fail
如果没有按下则重新从有发球
led_right9:
acallsel5acalldelayacallsel8nopnopled_right10:
jbk4,led_right11;
lcalldelay2jbk4,led_right10acallsel5;开数码管第5位nopacallwin_buzzer
setbTR0;如果接住球则启动定时计数器ajmpled_leftled_right11:
incscore_leftlcallfail_buzzerclrTR0ljmpled_right;功能:
对输球进行处理的子程序
;返回值:
右侧分数
led_left_fail:
lcallfail_buzzerincscore_rightclrTR0ajmpled_leftled_right_fail:
lcallfail_buzzerincscore_leftclrTR0ajmpled_right
;下面是所有的子程序sel5:
setbp2.5
clrp2.6
clrp2.7
ret
sel4:
clrp2.5
setbp2.6
setbp2.7
ret
sel3:
clrp2.5
setbp2.6
clrp2.7
ret
sel2:
clrp2.5
clrp2.6
setbp2.7
ret
sel1:
clrp2.5
clrp2.6
clrp2.7
ret
sel8:
setbp2.5;开三态门74hc245
setbp2.6
setbp2.7
ret;分数显示程序;本段程序用来将采集的分数显示到数码管上;接住球的蜂鸣器程序win_buzzer:
movr4,#60movp0,#0ch;在蜂鸣器响的同时让"1"也亮win_buzzer1:
cplbeepacalldelay1
djnzr4,win_buzzer1
ret
;未接住蜂鸣器的程序fail_buzzer:
movr4,#60fail_buzzer1:
cplbeepacalldelay2djnzr4,fail_buzzer1ret;分数显示程序
;本段程序用来将采集的左侧击球分数显示到数码管上
score_display_left:
mova,score_left;
movb,#10divabmovuint_left,b;movdecade_left,a;movDPTR,#tabmova,uint_left;movca,@a+DPTRacallsel3;movp0,a;lcalldelay1movp0,#00h;mova,decade_left
将分数的个位送入相应的缓冲区
将十位送入相应的缓冲区
将个位数送入到a中
开个位显示
显示个位数
关显示以去除虚亮
movca,@a+DPTRacallsel2;movp0,a;lcalldelay1movp0,#00h;
开十位显示
显示十位数
关显示以去除虚亮
sore_display_right:
mova,score_right;movb,#10divabmovuint_right,b;movdecade_right,a;movDPTR,#tabmova,uint_right;movca,@a+DPTR
将分数的个位送入相应的缓冲区
将十位送入相应的缓冲区
将个位数送入到a中
开个位显示显示个位数
acallsel5;movp0,a;lcalldelay1movp0,#00h;
mova,decade_right
关显示以去除虚亮
movca,@a+DPTR
acallsel4;
movp0,a;
lcalldelay1movp0,#00h;
ajmpscore_display_leftret
开十位显示
显示十位数
关显示以去除虚亮
;定时程序中断子程序;为球移动速度进行定时
・***********************
timer0:
pushACC
pushPSWincr7cjner7,#20,exitdecspeedmovr7,#00h
exit:
movTH0,#0b1h;重装初值movTL0,#0e0h;
popPSW
popACC
retidelay:
movr6,speedd1:
movr5,#100d2:
movr4,#60djnzr4,$djnzr5,d2djnzr6,d1retdelay1:
movr0,#20d3:
movr1,#20
djnzr1,$
djnzr0,d3retdelay2:
movr2,#50d4:
movr3,#20
djnzr3,$
djnzr2,d4ret
tab:
db7eh,0ch,0b6h,9eh,0cch,0dah,0fah,0eh,0feh,0deh;0,1,2,3,4,5,6,7,8,9
end
数码管显示
######################################################################################################################################
蜂鸣器自检程序:
beePbitp2.3;sbitbeep=P2八3;freequ00horg00h
ajmpmain
org0bh
ajmptimer0
org30h
main:
movTMOD,#01h;0000/0001movTH0,#00hmovTL0,#0ffhmovIE,#82h;1000/0010setbtr0
output:
incfreacalldelay;ajmpoutput
timer0:
pushACCpushPSWmovTH0,#0fehmovTL0,frecplbeeppopPSWpopACCreti
delay:
movr6,#50d5:
movr7,#20d6:
djnzr7,d6djnzr6,d5retend
##############################################################################################################################################################################键盘自检:
k1bitp1.0;定义键盘
k2bitp1.1
k3bitp1.2
k4bitp1.3
sw5bitp1.4;定义拨盘
sw6bitp1.5
sw7bitp1.6
sw8bitp1.7
;键盘定义完毕
beepbitp2.3定义蜂鸣器端口org00hajmpmainorg30hmain:
lcallsel8movp0,#00hmovp1,#Offh;端口初始化且定义p1口为输入口setbbeep初;始化蜂鸣器口nopnopjnbk1,next1jnbk2,next2jnbk3,next3jnbk4,next4ajmpmain
next1:
movpO,#O86h
clrp2.Osetbp2.1setbp2.2setbp2.4next11:
cplbeep
acalldelay1jnbk1,next11ljmpmainret
next2:
movpO,#Odbh
clrp2.1setbp2.Osetbp2.2setbp2.4next22:
cplbeep
acalldelay2jnbk2,next22ljmpmainret
next3:
movpO,#Ocfh
clrp2.2setbp2.Osetbp2.1setbp2.4next33:
cplbeep
acalldelay3jnbk3,next33ljmpmainret
next4:
movpO,#Oe6h
clrp2.4setbp2.Osetbp2.1
setbp2.2next44:
cplbeep
acalldelay4jnbk4,next44ljmpmainretsel8:
setbp2.7
setbp2.6
setbp2.5retdelay1:
movr4,#20d3:
movr5,#20d4:
djnzr5,d4
djnzr4,d3
retdelay2:
movr4,#50d5:
movr5,#20d6:
djnzr5,d6
djnzr4,d5
retdelay3:
movr4,#200d7:
movr5,#20d8:
djnzr5,d8
djnzr4,d7
retdelay4:
movr4,#500d9:
movr5,#50d10:
djnzr5,d10
djnzr4,d9
ret
end
################################################################################################################################################################################LED自检程序
org00h
ajmpmain
org30h
main:
acallsel5
acallnext
acallsel4
acallnext
acallsel3
acallnext
acallsel2
acallnext
acallsel1acallnext
ajmpmainsel5:
setbp2.5
clrp2.6
clrp2.7retsel4:
clrp2.5
setbp2.6
setbp2.7retsel3:
clrp2.5
setbp2.6clrp2.7retsel2:
clrp2.5
clrp2.6setbp2.7retsel1:
clrp2.5p2.6p2.7
delay:
movr6,#50
d1:
movr5,#50
d2:
movr4,#50djnzr4,$djnzr5,d2djnzr6,d1end
见附页
七、参考资料
1、《单片机系统综合设计与实践》教材主编:
裴岩刘利民内蒙古大学出版社。