编写足球计分器程序
要求:
哪一边进球,计分器就加1分。
进球的时间要记录下来。
需要再图中keilc51软件中运行,附上运行成功的图片。
连接到图中的单片机板子上,能给出运行图最好。
附上汇编语言的足球计分器程序。


编写足球计分器程序
要求:
哪一边进球,计分器就加1分。
进球的时间要记录下来。
需要再图中keilc51软件中运行,附上运行成功的图片。
连接到图中的单片机板子上,能给出运行图最好。
附上汇编语言的足球计分器程序。


关注引自强大而免费的微信小程序:皆我知道。
以下是51单片机汇编语言编写的足球计分器程序:
ORG 0H ; 程序起始地址
MOV P0, #0FFH ; P0端口设置为输出
MOV P1, #0FFH ; P1端口设置为输出
MOV R0, #0 ; 清零寄存器R0
MOV R1, #0 ; 清零寄存器R1
CLR A ; 清空累加器A
MOV R2, #0 ; 清零寄存器R2
START: ; 程序入口
ACALL SCAN ; 调用扫描函数进行键盘扫描
JMP START ; 一直循环进行键盘扫描
SCAN: ; 键盘扫描函数
MOV A, P2 ; 将P2端口的值读入累加器A
ANL A, #0F0H ; 将A与0F0H做“与”运算
JZ NoKey ; 如果A等于0,则表示没有按键按下,跳转到NoKey标签处
MOV B, A ; 将A存入寄存器B中备用
MOV A, R0 ; 将R0寄存器的值读入累加器A
ORL A, #0F0H ; 将A与0F0H做“或”运算
MOV R0, A ; 将A存入R0寄存器中
MOV A, B ; 将B的值读入累加器A
CLR C ; 清空进位标志位C
RRC A ; 右循环移位,将B的值移到A的最低位,左边补0
CJNE A, #00H, KeyDet ; 如果A不等于0,则跳转到KeyDet标签处
NoKey: ; 没有按键按下时执行的操作
RET
KeyDet: ; 检测按键的按下情况
MOV B, R1 ; 将R1的值读入B备用
MOV R1, A ; 将A存入R1中
ANL A, #0FH ; 将A与0FH做“与”运算
JZ Goal ; 如果A等于0,表示按下的是1号键,跳转到Goal标签处
JNC SubGoal ; 如果进位标志位C=0,表示按下的是0号键,跳转到SubGoal标签处
MOV R1, B ; 如果既不是0号键也不是1号键,则将R1的值还原为B备份的值
RET
AddGoal: ; 进球加分操作
CJNE R2, A, ResetTime ; 如果R2和A不等,则跳转到ResetTime标签处
INC A ; 如果R2和A相等,则将A加1
RESET P0.7 ; P0.7端口置0,表示左边进球
SJMP UpdateScore ; 跳转到UpdateScore标签处
SubGoal: ; 减一操作
CJNE A, #00H, ResetTime ; 如果A不等于0,则跳转到ResetTime标签处
JZ UpdateScore ; 如果A等于0,则跳转到UpdateScore标签处
DEC A ; 将A减1
SETB P0.7 ; P0.7端口置1,表示右边进球
SJMP UpdateScore ; 跳转到UpdateScore标签处
Goal: ; 进球操作
MOV R2, A ; 将A存入R2中备用
CLR A ; 清空A
CALL TimerCount ; 调用计时函数进行计时
ACALL AddGoal ; 调用AddGoal标签处的子程序进行进球加分操作
RET
UpdateScore: ; 更新分数显示
MOV A, P1 ; 将P1端口的值读入A中
MOV B, A ; 将A存入B中备用
ANL A, #0F0H ; 将A与0F0H做“与”运算
ORL A, R2 ; 将A与R2做“或”运算,得到新的分数
MOV P1, A ; 将A存入P1端口,更新分数显示
MOV A, B ; 将B中的值读入A
ANL A, #0F0H ; 将A与0F0H做“与”运算
ORL A, P0 ; 将A与P0端口的值做“或”运算,得到新的进球情况
MOV P1, A ; 将A存入P1端口,更新进球情况显示
RET
ResetTime: ; 重置计时
SETB P0.0 ; 将P0.0置1,表示重置计时
RL A ; 将A左循环移位,清空最低位,右边补0
AND A, #0FH ; 将A与0FH做“与”运算
MOV P1, A ; 将A存入P1端口,刷新显示
AJMP StartTimer ; 跳转到StartTimer标签处,开始计时
TimerCount: ; 计时函数
MOV TMOD, #01H ; 将TMOD寄存器的值设为01H,使用T0工作方式1
MOV TL0, #0 ; 清零T0的低8位
MOV TH0, #0 ; 清零T0的高8位
SETB TR0 ; 将TR0标志位置1,启动计时
CLR TF0 ; 清空TF0中断标志位
DJNZ A, TimerCount ; 如果A不等于0,则继续进行计时
SJMP TimerEnd ; 如果A等于0,则跳转到TimerEnd标签处
StartTimer: ; 开始计时
MOV A, #10 ; 设置计时10秒
MOV R7, A ; 将A存入R7备份
SETB EX0 ; 将EX0置1,使外部中断0有效
SJMP TimerEnd ; 跳转到TimerEnd标签处
TimerEnd: ; 计时结束
CLR TR0 ; 将TR0标志位置0,停止计时
CLR TF0 ; 清空TF0中断标志位
CLR EX0 ; 将EX0置0,禁止外部中断0
MOV A, R7 ; 将R7中的值读入A中
RET
ORG 0000BH ; 外部中断0向量地址
AJMP Goal ; 外部中断0跳转到Goal标签处
END
注意:这只是一个示例程序,实际运行效果可能会有所差异。
请注意将程序烧录到适配你所使用的单片机板子的Flash中,并根据实际连接情况调整端口设置。