linkstartycd 2023-12-18 17:03 采纳率: 0%
浏览 9
已结题

51单片机汇编语言程序keil软件运行图

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

img

img

  • 写回答

11条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-12-18 17:03
    关注

    引自强大而免费的微信小程序:皆我知道

    以下是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中,并根据实际连接情况调整端口设置。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月19日
  • 修改了问题 12月18日
  • 创建了问题 12月18日