找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4489|回复: 2
打印 上一主题 下一主题
收起左侧

【重发一下】汇编语言中单片机中断程序的问题

[复制链接]
跳转到指定楼层
楼主
刚刚明明是一个绑定的QQ号,结果弄到另一个号上了现在重发今天刚学的8051会汇编的中断部分,发现写完的程序存在一些问题,希望大家能帮我解决一下
下面是程序的源代码:
//**************************************************************************************
//程序名称:汇编语言的基础运用,中断打断数码管
//调试环境:proteus仿真
//作    者:CAIN
//预期效果:当开关按下的时候数码管会停止变化,led灯流水显示,之后继续执行数码管程序
//创建日期:2016.2.19
//**************************************************************************************
//                           中断程序位置的配置
//**************************************************************************************
       ORG    0000H
           AJMP   MAIN
           ORG    0003H
           LJMP   IN0
           ORG    0030H
//**************************************************************************************
//                                                         主函数
//**************************************************************************************
MAIN:  SETB   EA
           SETB   EX0
           SETB   IT0
START: MOV    A,#01H
       MOV    R3,#9H
           MOV    R4,#1H
L1:           MOV    DPTR,#TABLE
           MOV    A,R4   
           MOVC   A,@A+DPTR
           MOV    P2,A
           INC    R4   
           ACALL  DELAY
           DJNZ   R3,L1
           AJMP   START
//**************************************************************************************
//                                                         延时函数
//**************************************************************************************
DELAY:
       MOV    R5,#0AH
L4:           MOV    R6,#64H
L3:           MOV    R7,#0C8H
L2:           NOP
           NOP
           NOP
           DJNZ   R7,L2
           DJNZ   R6,L3  
           DJNZ   R5,L4
           RET
//**************************************************************************************
//                                                         外部中断0服务函数
//**************************************************************************************
IN0:   
       PUSH   ACC
           PUSH   DPH
           PUSH   DPL
           PUSH   PSW
           MOV    R2,#8H
           MOV    A,#01H
L5:           MOV    P1,A
           ACALL  DELAY
           RL     A
           DJNZ   R2,L5
           POP    PSW
           POP    DPL
           POP    DPH
           POP    ACC
           RETI  
//**************************************************************************************
//                                                         数码管段选数组
//**************************************************************************************
TABLE:  DB    3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,40H
        END
//**************************************************************************************
//                                                                          END
//**************************************************************************************

程序中有以下问题:
接通单片机电源后,按下开关,执行完中断程序后会有两种错误情况,第一种是需要等待一段时间后数码管才会继续变化,另一种是执行完中断之后数码管会从1(设定的初值)开始变话
本人认为问题可能在的地方,我觉得问题是处在延时函数上,具体原因没有找到,请大神们找一找是什么原因。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:77908 发表于 2016-2-21 12:54 | 只看该作者
经过几天的调试,发现我忽略了一个问题,当我在中断中调用延时函数时,最后将几个通用寄存器清零了,导致回到主函数调用的延时函数时进行-1后判断时出现了负数,而负数的补码十分大,所以导致延时时间超长,导致需要等待很久。
修正方法为切换寄存器区域(RS0 RS1)

评分

参与人数 1黑币 +10 收起 理由
红尘有你 + 10 共享经验黑币奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:106117 发表于 2016-2-23 09:19 | 只看该作者
a616781689 发表于 2016-2-21 12:54
经过几天的调试,发现我忽略了一个问题,当我在中断中调用延时函数时,最后将几个通用寄存器清零了,导致回 ...

你的问题应该是“保护现场、恢复现场”的问题。当进入中断后,首先应想到的是保护现场,分别考虑静态现场和动态现场的保护。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表