单片机C51篮球计时计分器课程设计
篮球赛计时计分器
一 设计目的
设计并制作一个用于赛场的篮球赛计时计分器,实现如下基本功能:
(1) 能记录整个赛程的比赛时间,并能修改比赛时间,暂停比赛时间。 (2) 能随时刷新甲,乙两队在整个赛程中的比分。 (3) 中场交换场地时,能交换甲,乙两队比分的位置。 (4) 比赛时间结束时,能发出报警指令。
二 设计意义
通过篮球计分计时器的制作,可以使我熟悉,了解单片机开发设计实例的过程,
并能使读者加深对单片机的理解和运用以及掌握单片机与外围接口的一些方法
和技巧,这主要表现在以下的一些方面:
(1) 篮球计分计时器包含了8051系列单片机的最小应用系统的构成,同
时在此基础上扩展了一些实用性强的外围接口。
(2) 掌握键盘接口原理,能正确地把键盘使用到单片机系统中,可以了
解到LED显示器的结构,工作原理以及这种显示器的接口实例。
(3)学会调试电路,分析电路故障,积累电路调试经验。
三 具体设计内容 1 系统框图构成
基于单片机系统的篮球计分计时器的系统构成框图如下所示:
2硬件电路改进:
由于原来的电路比较复杂,用了很多芯片,浪费成本,而且给后期调试的调试会带来较多麻烦,故对原来的硬件电路进行了改动。改动方面主要关于数码管显示的驱动和位选的,前期的电路设计采用了大量的CD4511和CD4094来进行数码管显示的驱动和位选,而这次的电路设计只用了8个三极管就实现了这项功能。
下面前期电路设计的计时部分的原理图,还有更为复杂的计分原理图未给出
后期改进的整体原理图:
(3)软件调试及组装
软件的编程调试首先要抓住计分和计时两大模块,在这两大模块成功的基础上再进行其他细小模块的组装和完善。主要编程的问题,所以就概述就举例子概述一下
计分模块和计时模块刚开始均会出现显示数值范围不正确或者十位和个位二者之中只显示个位的情况,经软件调试,重新编程后成功的解决了问题。
I 上半场比赛结束, 可按下交换比分按钮,交换甲乙两队的比分,重新调整计时时间为20分钟,按下启动按钮,下半场比赛开始
八 篮球赛计时计分器程序流程图及程序
两队分数清零设置定时Y
N
倒计时开始定时Y
N
N
K1,K2,K3,K4是否按下
Y
Y
喇叭响10秒
N
甲乙两队交换分数并显示
代码如下:
K1 BIT P1.0 K2 BIT P1.1
K3 BIT P1.2 K4 BIT P1.3 K5 BIT P1.4 K6 BIT P1.5
K7 BIT P1.6 K8 BIT P1.7
MIN EQU 30H SEC EQU 31H
SEC100 EQU 32H DIS_BUF EQU 33H BUF_MIN_H EQU DIS_BUF BUF_MIN_L EQU DIS_BUF+1 BUF_SEC_H EQU DIS_BUF+2 BUF_SEC_L EQU DIS_BUF+3
K_OLD EQU 41H K_NEW EQU 42H
DIS_DIGIT EQU 43H DIS_INDEX EQU 44H K_OLD1 EQU 45H K_NEW1 EQU 46H FLAG EQU 47H CONVERT EQU 48H
ORG 0000H JMP MAIN ORG 0003H
LJMP INT_0 ORG 0000BH
LJMP TIMER0 ORG 0001BH
LJMP TIMER1
ORG 0030H MAIN:
MOV SP,#60H MOV P0,#0FFH MOV P2,#0FFH MOV TMOD,#011H MOV TH0,#0FCH MOV TL0,#017H MOV TH1,#0DCH CLR A
MOV TL1,A
MOV CONVERT,#00H MOV CONVERT+1 ,#00H MOV CONVERT+2,#00H MOV CONVERT+3 ,#00H CLR A MOV MIN,#20 MOV SEC,A
MOV SEC100,A
MOV BUF_MIN_H,#0A4H
MOV BUF_MIN_L,#0C0H MOV BUF_SEC_H,#0C0H MOV BUF_SEC_L,#0C0H MOV DIS_BUF+4,#0C0H MOV DIS_BUF+5,#0C0H MOV DIS_BUF+6,#0C0H
MOV DIS_BUF+7,#0C0H MOV FLAG ,#00H
MOV K_OLD,#00H
BEEP_BL00: MOV R3,#10 MOV R2,#200 MAIN1100:
CPL p3.7 LCALL DELAY500 LCALL DELAY500 DJNZ R2,MAIN1100 CPL p3.6 LCALL DELAY500 LCALL DELAY500 LCALL DELAY500 MOV R2,#200 MAIN2100:
CPL p3.7 LCALL DELAY500 DJNZ R2,MAIN2100 DJNZ R3,MAIN1100 LJMP START
DELAY500:
MOV R7,#230 LOOP1:
DJNZ R7,LOOP1 RET START: MOV DIS_DIGIT,#0FEH CLR A
MOV DIS_INDEX,A SETB EA SETB ET0 SETB TR0 SETB IT0 SETB EX0
SETB PT0 MAIN_LP:
CALL KEY_PROG SJMP MAIN_LP KEY_PROG:
CALL K_SCAN MOV A,K_NEW
CJNE A,K_OLD,KEY_P1 JMP END_PROC_KEY KEY_P1:
MOV R4,#15 KEY_P2:
MOV R7,#10
CALL DELAYMS DJNZ R4,KEY_P2
CALL K_SCAN MOV A,K_NEW
CJNE A,K_OLD,KEY_P3 JMP END_PROC_KEY KEY_P3:
JB ACC.0,PROC_K1 JB ACC.1,PROC_K2 JB ACC.2,PROC_K3 JB ACC.3,PROC_K4 LJMP END_PROC_KEY
PROC_K1:LCALL BEEP_BL001 INC MIN MOV A,MIN ; CJNE A, #100,UPDATE_MIN21 MOV MIN,#00H UPDATE_MIN21: MOV A,MIN MOV B,#10 DIV AB ; A = MIN / 10 MOV DPTR,#DIS_CODE MOVC A,@A+DPTR
MOV BUF_MIN_H,A MOV A,MIN MOV B,#10 DIV AB MOV A,B MOVC A,@A+DPTR
MOV BUF_MIN_L,A SJMP END_PROC_KEY
PROC_K2:LCALL BEEP_BL001 DEC MIN MOV A,MIN
CJNE A, #255, UPDATE_MIN1 MOV MIN,#99 UPDATE_MIN1: MOV A,MIN MOV B,#10 DIV AB MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A MOV A,MIN L MOV B,#10 DIV AB MOV A,B MOVC A,@A+DPTR
MOV BUF_MIN_L,A SJMP END_PROC_KEY
PROC_K3: LCALL BEEP_BL001 PUSH PSW INC FLAG MOV A ,FLAG RRC A
JNC STOP CLR P3.6 SETB ET1 SETB TR1 POP PSW
SJMP END_PROC_KEY STOP:SETB P3.6 CLR ET1 CLR TR1 POP PSW
SJMP END_PROC_KEY
PROC_K4: LCALL BEEP_BL001
MOV R3,CONVERT+1 MOV CONVERT+1,CONVERT+3 MOV CONVERT+3,R3
MOV R3,CONVERT
MOV CONVERT,CONVERT+2 MOV CONVERT+2,R3 LCALL CONVETER END_PROC_KEY: RET
; 键扫描子程序 K_SCAN:
MOV P1,#0FFH MOV K_NEW,#00H MOV A,P1 CPL A
ANL A,#0F0H
SWAP A
MOV K_NEW,A RET
USING 0 TIMER0:
; 定时器0中断服程序, 用于数码管的动态扫描 PUSH ACC PUSH PSW PUSH AR0
MOV TH0,#0FCH MOV TL0,#017H MOV P2,#0FFH MOV A,#DIS_BUF ADD A,DIS_INDEX MOV R0,A MOV A,@R0 MOV P0,A MOV P2,DIS_DIGIT MOV A,DIS_DIGIT RL A
MOV DIS_DIGIT,A INC DIS_INDEX MOV R5 , DIS_INDEX CJNE R5,#08H,TT
MOV DIS_INDEX ,#00H MOV DIS_DIGIT,#0FEH TT: POP AR0 POP PSW POP ACC RETI
TIMER1:
; 定时器1中断服务程序, 产生时基信号10ms PUSH PSW PUSH ACC PUSH B PUSH DPH PUSH DPL
MOV TH1,#0DCH MOV TL1,#00H INC SEC100 MOV A,SEC100
CJNE A, #100, END_TIMER1
MOV SEC100,#00H
LCALL DEC_SEC
END_TIMER1:
POP DPL
POP DPH
POP B
POP ACC
POPPSW
RETI ;
DEC_SEC:
DEC SEC
MOV A ,MIN
JNZ OBTAIN
CPL P3.6
MOV A ,SEC
JNZ OBTAIN
MOV BUF_SEC_L,#0C0H
CLR TR1
CLR ET1
BEEP_BL: MOV R3,#10
MOV R2,#200
MAIN11:
CPL p3.7
LCALL DELAY500
LCALL DELAY500
DJNZ R2,MAIN11
CPL p3.6
LCALL DELAY500
LCALL DELAY500
LCALL DELAY500
MOV R2,#200
MAIN21:
CPL p3.7
LCALL DELAY500
DJNZ R2,MAIN21
DJNZ R3,MAIN11
LJMP OBTAIN
OBTAIN:
MOV A,SEC
CJNE A, #255,UPDATE_SEC
MOV SEC,#59
LCALL DEC_MIN
UPDATE_SEC:
MOV A,SEC
MOV B,#10
DIV AB
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_SEC_H,A
MOV A,SEC
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_SEC_L,A
RET
DEC_MIN:
DEC MIN
MOV A,MIN
CJNE A, #255, UPDATE_MIN
MOV MIN,#00H
UPDATE_MIN:
MOV A,MIN
MOV B,#10
DIV AB ; A = MIN / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A
MOV A,MIN
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_MIN_L,A
RET
RET
; 中断INT0服务程序
INT_0:
PUSH PSW
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
JB k1,RKEY1
MOV R7,#30
LCALL DELAYMS
JB k1,RKEY1
LJMP KP1
RKEY1 :JB k2,RKEY2
MOV R7,#30
LCALL DELAYMS
JB k2,RKEY2
LJMP KP2
RKEY2 :JB k3,RKEY3
MOV R7,#30
LCALL DELAYMS
JB k3,RKEY3
LJMP KP3
RKEY3 : JB k4,RKEY4
MOV R7,#30
LCALL DELAYMS
JB k4,RKEY4
LJMP KP4
RKEY4: LJMP KP5
KP1: LCALL BEEP_BL001
INC CONVERT
MOV A,CONVERT
CJNE A,#0AH,KP5
MOV CONVERT ,#00H
INC CONVERT+1
MOV A,CONVERT+1
CJNE A,#0AH,KP5
MOV CONVERT+1,#00H
LJMP KP5
KP2: LCALL BEEP_BL001
DEC CONVERT
MOV A,CONVERT
CJNE A,#255,KP5
MOV CONVERT,#09H
DEC CONVERT+1
MOV A,CONVERT+1
CJNE A,#255,KP5
MOV CONVERT+1,#09H
LJMP KP5
KP3: LCALL BEEP_BL001
INC CONVERT+2
MOV A,CONVERT+2
CJNE A,#0AH,KP5
MOV CONVERT+2 ,#00H
INC CONVERT+3
MOV A,CONVERT+3
CJNE A,#0AH,KP5
MOV CONVERT+3,#00H
LJMP KP5
KP4: LCALL BEEP_BL001
DEC CONVERT+2
MOV A,CONVERT+2
CJNE A,#255,KP5
MOV CONVERT+2 ,#09H
DEC CONVERT+3
MOV A,CONVERT+3
CJNE A,#255,KP5
MOV CONVERT+3,#09H
LJMP KP5
KP5:LCALL CONVETER
POP DPL
POP DPH
POP B
POP ACC
POPPSW
RETI
DELAYMS:
; 延时子程序
DLY_LP1:
MOV R6,#185
DLY_LP2:
NOP
NOP
NOP
DJNZ R6,DLY_LP2
DJNZ R7,DLY_LP1
END_DLYMS:
RET
;蜂鸣器响一声子程序
BEEP_BL001: MOV R3,#1
PUTOFF:
MOV R2,#30
MAIN11001: ;
CPL p3.7
LCALL DELAY500
LCALL DELAY500
DJNZ R2,MAIN11001
DJNZ R3,PUTOFF
RET
;显示缓冲区代码转码子程序
CONVETER:
MOV A,CONVERT
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV DIS_BUF+7,A
MOV A,CONVERT+1
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV DIS_BUF+6,A
MOV A,CONVERT+2
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV DIS_BUF+5,A
MOV A,CONVERT+3
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV DIS_BUF+4,A
RET
查表指令
DIS_CODE:
DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 099H
DB 092H
DB 082H
DB 0F8H
DB 080H
DB 090H
DB 0FFH
END
总 结
这次课程设计虽然只有短短的两周时间,但我受益匪浅。刚开始时觉得自己
的课题无处入手,但通过老师的讲解和查询资料,开始有了自己的思路,整理出了总体方案,然后设计出硬件原理图,源程序等。在这次设计中困难最大的就是调试,收获最多的也是调试,因为调试的时候你必须对程序相当的熟悉,对每一条指令相当了解,并且硬件的连接也要清晰的印在脑海里,只有这样你才能让软件和硬件结合在一起,实现预期功能。在编程结束时需要编写END指令,这也是初学者编程时经常忘记的。
总之,在课程设计中遇到了不少的困难,在老师的细心讲解和辅导下,最
终完成了本次设计。在此,由衷感谢老师的指导和帮助。
参考文献
[1] 、《单片微型计算机原理及应用》张毅坤 陈善久 编 西安电子科技大学出版社
[2]、《微型计算机接口技术及应用》刘乐善编 华中理工大学出版社
[3]、《计算机硬件技术基础试验教程》邹逢兴编 高等教育出版社
[4]、《16位微型计算机原理接口及其应用》周佩玲编中国科学技术大学出版社
[5]、《微型计算机原理与接口技术》吴秀清编 中国科学技术出版社
[6]、《微型计算机接口技术》邓亚平编 清华大学出版社
[7]、《单片机应用程序设计技术》 周航慈 著 北京航空航天大学出版社
[8]、《单片机实用技术问答》 谢宜仁 主编 人民邮电出版社