1、目录一、 设计目的:用单片机实现一个模拟的乒乓球游戏机0二、 设计任务:0三、 框图(包括自检和任务的框图):0四、 程序清单:6键盘自检:k1 bit p1.0;定义键盘13LED自检程序15五、 设计体会17七、参考资料17一、 设计目的:用单片机实现一个模拟的乒乓球游戏机二、 设计任务:任务内容:开发LED显示模块 加速模块、显示模块、蜂鸣器模块任务分配:组长:王伟男负责主程序的编写以及定时器和中断的编写及联调 组员:徐菡卿负责编写键盘采集程序编写 组员:周秀丽负责编写延时子程序和蜂鸣器的程序的编写 三、 框图(包括自检和任务的框图):1、 硬件编程框图及相关说明P0.0P0.7Led数
2、码管单片机P2.5-p2.774ls138蜂鸣器P1.0-P1.7键盘 P2.32、 主程序框图、子程序框图及相关说明(1) 主程序框图 开始 向左发球 是 是否为20次 右侧加分蜂鸣器响 停止加速 否 显示分数 否 是否接住球 是向右发球 开始加速 左加分蜂鸣器响 是 停止加速是否为20次 否 是否接住球 否 是 开始加速乒乓球向左移的子程序框图(乒乓球向右移动的程序同理): 开始 开显示“一” 第一位显示 下几位显示分数显示子程序: 开始 取分数将分数的十位数与个位数放入缓存区 显示个位数 延时 显示十位数定时器中断子程序: 开始 开始计时 否 是否已经溢出50次 是加速 重装初值 蜂鸣器
3、自检程序: 主程序 中断子程序 开始 开始 装入初值 取反蜂鸣器启动定时计数器 重装初值 加初值 返回 返回 键盘自检: 开始 否 是否有键按下 是 蜂鸣器响 否 键是否提起 是 返回LED自检程序: 开始 显示第一位 数字0-9显示第二位 数字0-9 显示第三位 数字0-9显示第四位 数字0-9 显示第五位数字0-9 返回 四、 程序清单: ;*;#功能:实现模拟乒乓球游戏机功能;#CPU:AT80C51;#晶振频率11.0592MHz;#开发环境:伟福ICE;#返回值:无;#设计人:刘红喜、王欣冉、郭兴荣;#组别:一组;#游戏规则:当按下k3键时游戏开始,首先从左侧发球,其中k1和k4键分
4、别代表左侧球拍和右侧#;#当左侧球拍提前击球或者滞后击球都会为对方加分,接住球不计分,右侧同理#;#当接住球后开始加速,但是当提前击球或者滞后击球则停止加速球的运动#;#规定每局打20次,在20次结束后开始显示比分#;*score_left equ 30h;定义左侧分数缓存区uint_left equ 31h;左侧得分的个位缓存区decade_left equ 32h;左侧得分的十位缓存区score_right equ 33h;定义右侧分数缓存区uint_right equ 34h;定义右侧的分缓存区decade_right equ 35h;定义右侧分数十位缓存区speed equ 36h;定
5、义球移动速度缓存区speed2 equ 37htimes equ 38h;为发球的次数开辟缓存区beep bit p2.3;定义蜂鸣器端口k1 bit p1.0;定义k1位k2 bit p1.1;定义k2位k3 bit p1.2;定义k3位k4 bit p1.3;定义k4位sw1 bit p1.4;定义拨盘sw2 bit p1.5sw3 bit p1.6sw4 bit p1.7org 00hajmp mainorg 0bhajmp timer0;timer0为定时器0子程序org 30h;错开中断入口地址;*;下面是主程序#;#;*main:init:mov p1,#0ffh;键盘端口初始化
6、mov p0,#00h;关数码管 setb p2.3;关闭蜂鸣器 mov score_left,#0h;初始化分数 mov uint_left,#0h;初始化左侧分数个位 mov decade_left,#0h mov score_right,#0h;初始化右侧分数 mov uint_right,#0h;初始化右侧个位分数 mov decade_right,#0h;初始化右侧分数十位 mov speed,#60;初始化球的移动速度 mov times,#20;每局打20下 mov TMOD,#01h;设置定时计数器方式1 mov TH0,#0b1h mov TL0,#0e0h;定时20ms m
7、ov IE,#82h;开总中断和定时计数器0中断 mov r7,#0h;初始化r7start:jb k3,start;启动判断开关 lcall delay2;延时去抖动 jb k3,start;如果k3键按下则继续执行,否则返回 lcall win_buzzer;*;乒乓球左移程序;此段程序用于将“球”向左移动;*led_left:mov p0,#80h ;送入“一” djnz times,led_left1;判断是否为20次 lcall score_display_left led_left1:acall sel5 acall delay acall sel8led_left2:jb k1,
8、led_left3;如果k1不按下则 lcall delay2 jb k1,led_left2 lcall led_left_failled_left3:acall sel4 acall delay acall sel8led_left4:jb k1,led_left5 lcall delay2 jb k1,led_left4 acall led_left_fail;如果在此时按下k1键则跳入输判断子程序led_left5:acall sel3 acall delay acall sel8led_left6:jb k1,led_left7 lcall delay2 jb k1,led_left
9、6 lcall led_left_fail;led_left7:acall sel2 acall delay acall sel8led_left8:jb k1,led_left9 lcall delay2 jb k1,led_left8 lcall led_left_failled_left9:acall sel1 acall delay acall sel8led_left10:jb k1,led_left11 ;如果没有按下键则重新从左发球 nop;较容易出问题处 nop lcall delay2 jb k1,led_left10 acall sel1;开数码管第一位 nop acall
10、 win_buzzer setb tr0;如果接住球启动定时器加速球的速度 ljmp led_rightled_left11:inc score_right lcall fail_buzzer clr TR0 ljmp led_left;*;此程序实现乒乓球右移动程序;*led_right:mov p0,#80h ;送入“一” djnz times,led_right1 lcall score_display_leftled_right1:acall sel1 acall delay acall sel8led_right2:jb k4,led_right3 lcall delay2 jb k
11、4,led_right2 lcall led_right_failled_right3:acall sel2 acall delay acall sel8led_right4:jb k4,led_right5 lcall delay2 jb k4,led_right4 lcall led_right_failled_right5:acall sel3 acall delay acall sel8led_right6:jb k4,led_right7 lcall delay2 jb k4,led_right6 lcall led_right_failled_right7:acall sel4 a
12、call delay acall sel8led_right8:jb k4,led_right9 lcall delay2 jb k4,led_right8 lcall led_right_failled_right9:acall sel5 acall delay acall sel8 nop nopled_right10: jb k4,led_right11;如果没有按下则重新从有发球 lcall delay2 jb k4,led_right10 acall sel5;开数码管第5位 nop acall win_buzzer setb TR0;如果接住球则启动定时计数器 ajmp led_l
13、eftled_right11:inc score_left lcall fail_buzzer clr TR0 ljmp led_right;*;功能:对输球进行处理的子程序;返回值:右侧分数;*led_left_fail:lcall fail_buzzer inc score_right clr TR0 ajmp led_leftled_right_fail:lcall fail_buzzer inc score_left clr TR0 ajmp led_right;*;下面是所有的子程序;*sel5: setb p2.5 clr p2.6 clr p2.7 retsel4: clr p2
14、.5 setb p2.6 setb p2.7 retsel3: clr p2.5 setb p2.6 clr p2.7 retsel2: clr p2.5 clr p2.6 setb p2.7 retsel1: clr p2.5 clr p2.6 clr p2.7 retsel8:setb p2.5;开三态门74hc245 setb p2.6 setb p2.7 ret;*;分数显示程序;本段程序用来将采集的分数显示到数码管上;*;接住球的蜂鸣器程序win_buzzer:mov r4,#60 mov p0,#0ch;在蜂鸣器响的同时让1也亮win_buzzer1:cpl beep acall
15、delay1 djnz r4,win_buzzer1 ret;未接住蜂鸣器的程序fail_buzzer:mov r4,#60fail_buzzer1:cpl beep acall delay2 djnz r4,fail_buzzer1 ret;*;分数显示程序;本段程序用来将采集的左侧击球分数显示到数码管上;*score_display_left: mov a,score_left; mov b,#10 div ab mov uint_left,b;将分数的个位送入相应的缓冲区 mov decade_left,a;将十位送入相应的缓冲区 mov DPTR,#tab mov a,uint_lef
16、t;将个位数送入到a中 movc a,a+DPTR acall sel3;开个位显示 mov p0,a;显示个位数 lcall delay1 mov p0,#00h;关显示以去除虚亮 mov a,decade_left movc a,a+DPTR acall sel2;开十位显示 mov p0,a;显示十位数 lcall delay1 mov p0,#00h;关显示以去除虚亮sore_display_right:mov a,score_right; mov b,#10 div ab mov uint_right,b;将分数的个位送入相应的缓冲区 mov decade_right,a;将十位送入
17、相应的缓冲区 mov DPTR,#tab mov a,uint_right;将个位数送入到a中 movc a,a+DPTR acall sel5;开个位显示 mov p0,a;显示个位数 lcall delay1 mov p0,#00h;关显示以去除虚亮 mov a,decade_right movc a,a+DPTR acall sel4;开十位显示 mov p0,a;显示十位数 lcall delay1 mov p0,#00h;关显示以去除虚亮 ajmp score_display_left ret;*;定时程序 中断子程序;为球移动速度进行定时;*timer0:push ACC push
18、 PSW inc r7 cjne r7,#20,exit dec speed mov r7,#00hexit: mov TH0,#0b1h;重装初值 mov TL0,#0e0h; pop PSW pop ACC retidelay:mov r6,speed d1:mov r5,#100 d2:mov r4,#60 djnz r4,$ djnz r5,d2 djnz r6,d1 retdelay1:mov r0,#20 d3:mov r1,#20 djnz r1,$ djnz r0,d3 retdelay2:mov r2,#50 d4:mov r3,#20 djnz r3,$ djnz r2,d
19、4 rettab: db 7eh,0ch,0b6h,9eh,0cch,0dah,0fah,0eh,0feh,0deh;数码管显示0,1,2,3,4,5,6,7,8,9 end;#蜂鸣器自检程序:beep bit p2.3 ;sbit beep=P23;fre equ 00horg 00hajmp mainorg 0bhajmp timer0org 30hmain:mov TMOD,#01h ;0000/0001 mov TH0,#00h mov TL0,#0ffh mov IE,#82h ;1000/0010 setb tr0output: inc fre acall delay ; ajmp
20、 outputtimer0:push ACC push PSW mov TH0,#0feh mov TL0,fre cpl beep pop PSW pop ACC retidelay:mov r6,#50 d5:mov r7,#20 d6:djnz r7,d6 djnz r6,d5 ret end ;#键盘自检:k1 bit p1.0;定义键盘k2 bit p1.1k3 bit p1.2k4 bit p1.3sw5 bit p1.4 ;定义拨盘sw6 bit p1.5sw7 bit p1.6sw8 bit p1.7;键盘定义完毕beep bit p2.3;定义蜂鸣器端口;=org 00haj
21、mp mainorg 30hmain:lcall sel8 mov p0,#00h mov p1,#0ffh;端口初始化且定义p1口为输入口 setb beep ;初始化蜂鸣器口 nop nop jnb k1,next1 jnb k2,next2 jnb k3,next3 jnb k4,next4 ajmp mainnext1:mov p0,#086h clr p2.0 setb p2.1 setb p2.2 setb p2.4next11: cpl beep acall delay1 jnb k1,next11 ljmp main retnext2:mov p0,#0dbh clr p2.1
22、 setb p2.0 setb p2.2 setb p2.4next22: cpl beep acall delay2 jnb k2,next22 ljmp main retnext3:mov p0,#0cfh clr p2.2 setb p2.0 setb p2.1 setb p2.4next33: cpl beep acall delay3 jnb k3,next33 ljmp main retnext4:mov p0,#0e6h clr p2.4 setb p2.0 setb p2.1 setb p2.2next44: cpl beep acall delay4 jnb k4,next4
23、4 ljmp main retsel8:setb p2.7 setb p2.6 setb p2.5 retdelay1:mov r4,#20 d3: mov r5,#20 d4: djnz r5,d4 djnz r4,d3 retdelay2:mov r4,#50 d5: mov r5,#20 d6: djnz r5,d6 djnz r4,d5 retdelay3:mov r4,#200 d7: mov r5,#20 d8: djnz r5,d8 djnz r4,d7 retdelay4:mov r4,#500 d9: mov r5,#50 d10: djnz r5,d10 djnz r4,d
24、9 ret end;#LED自检程序org 00hajmp mainorg 30hmain: acall sel5 acall next acall sel4 acall next acall sel3 acall next acall sel2 acall next acall sel1 acall next ajmp mainsel5: setb p2.5 clr p2.6 clr p2.7 retsel4: clr p2.5 setb p2.6 setb p2.7 retsel3: clr p2.5 setb p2.6 clr p2.7 retsel2: clr p2.5 clr p2.
25、6 setb p2.7 retsel1: clr p2.5 clr p2.6 clr p2.7 retnext: mov p0,#07eh acall delay mov p0,#0ch acall delay mov p0,#0b6h acall delay mov p0,#09eh acall delay mov p0,#0cch acall delay mov p0,#0dah acall delay mov p0,#0fah acall delay mov p0,#0eh acall delay mov p0,#0feh acall delay mov p0,#0deh acall delay mov p0,#01h acall delay retdelay:mov r6,#50 d1:mov r5,#50 d2:mov r4,#50 djnz r4,$ djnz r5,d2 djnz r6,d1 end五、 设计体会见附页七、参考资料1、单片机系统综合设计与实践教材 主编:裴岩 刘利民 内蒙古大学出版社。