[问答] 汇编语言:STC89C52,两位共阴极数码管数字停止不动,不会变化

[复制链接]

实习生

发表于 2017-12-19 21:37:05   999 查看 15 回复 显示全部楼层 倒序浏览
分享
在用STC89C52,来实现用两位共阴极数码管对外部中断0也就是P3.2口按下次数显示时,实际运行后发现会出现按到某个数值时,再次按下时并不反应,数字停止不动。请教大神,这是什么原因,恳请大神们帮帮忙,实在是搞不懂。程序如下:
ORG 0000H ;上电复位入口地址
LJMP MAIN
ORG 0003H  ;外部中断入口
LJMP IOTN0
ORG 0100H

MAIN:
MOV IE,#81H  ;开总中断,开INT0中断
MOV TCON,#00H  ;设置INT0为低电平触发
MOV P0,#0FFH   ;1111 1111
MOV R0,#00H    ;0000 0000
MOV R1,#00H    ;0000 0000
MOV R2,#0AH    ;0000 1010
MOV R3,#0AH    ;0000 1010
MOV DPTR,#TAB  ;将TAB这个表的首地址赋值给数据指针DPTR
MOV SP,#60H
START:MOV A,R0 ;将0000 0000给A
MOVC A,@A+DPTR ;将A中的值,加上DPTR里的值,访问程序段中这个地址的值,取出来送给A。
MOV P2,A    ;将A送到P2口
CLR P0.0    ;显示个位数
ACALL DELAY1MS ;调用延时函数
SETB P0.0  ;灭掉个位数
MOV A,R1  ;将0000 0000给A
MOVC A,@A+DPTR  ;将A中的值,加上DPTR里的值,访问程序段中这个地址的值,取出来送给A。
MOV P2,A   ;将A送到P2口
CLR P0.1   ;显示十位数
ACALL DELAY1MS  ;调用延时函数
SETB P0.1    ;灭掉十位数
JMP START   ;循环执行START
IOTN0:MOV IE,#00H  ;关中断
JB P3.2,LOOP0    ;位判1转
ACALL DELAY250MS   ;调用延时函数
JNB  P3.2,$     ;位判0转
INC R0      ;R0<--(R0)+1
DEC R2      ;R2<--(R2)-1
MOV A,R2     ;将R2给A
JZ LOOP1     ;对A判0转
MOV IE,#81H
CLR IE0    ;开中断
RETI      ;中断返回
LOOP0:
RET       ;返回
LOOP1:
MOV R0,#00H     ;0000 0000给R0
MOV R2,#0AH     ;0000 1010给R2
INC R1      ;R1<--(R1)+1
DEC R3      ;R3<--(R3)-1
MOV A,R3     ;R3给A
JZ LOOP2     ;对A判0转
MOV IE,#81H     ;开中断
RETI     ;中断返回
LOOP2:
MOV R1,#00H     ;0000 0000给R1
MOV R3,#0AH     ;0000 1010给R3
MOV IE,#81H     ;开中断
RETI      ;中断返回
TAB:DB 0F6H,50H,0C7H,0D3H,71H,0B3H,0B7H,0D0H,0F7H,0F3H  ;0123456789
DELAY250MS:MOV R6,#250    ;1us
DL1:MOV R7,#249      ;1us
DL0:NOP        ;1us
   NOP        ;1us
   DJNZ R7,DL0      ;(2+2)*249=996
   DJNZ R6,DL1      ;1+(2+996)*250=249 501 us=250ms
    RET        ;返回
DELAY1MS:MOV R7,#249    ;1us
DL:NOP        ;1us
   NOP        ;1us
   DJNZ R7,DL      ;1+(2+2)*249=997us=1ms
    RET        ;返回
END

附件: 您需要 登录 才可以下载或查看,没有帐号?注册

人中狼 2017-12-19

LOOP0:
RET       ;返回
这里更改为RETI后,在LOOP0和RETI之间再增加一个开中断的操作

标签:STC89C52 单片机

高级工程师

发表于 2017-12-19 21:37:06  
LOOP0:
RET       ;返回
这里更改为RETI后,在LOOP0和RETI之间再增加一个开中断的操作
回复

点赞 举报

技术员

发表于 2017-12-21 16:39:20  
你的中断一出来,在主循环循环一次就有和原来一样了,而主循环一次是很快的,所以看起来显示不变化。
你可以设置断点调试一下,看看运行状态
回复

点赞 举报

实习生

发表于 2017-12-23 18:30:29    楼主|
李雷 发表于 2017-12-21 16:39
你的中断一出来,在主循环循环一次就有和原来一样了,而主循环一次是很快的,所以看起来显示不变化。
你可以设置断点调试一下,看看运行状态

谢谢你,那个,我是新手,不太会那设置断点调试。呃,我的那个现象是:上电后,我每按一次按钮,就进入一次中断,然后数码管就相当于计数我按的次数,即,假设我按了三次,数码管就显示3,但有时候我接着再按,他就不计数,数码管就一直显示3不动,无论我怎么按都没变化了,我个人认为这是所谓的死机(程序跑飞)应该不是主循环的问题。
回复

点赞 举报

高级工程师

发表于 2017-12-23 18:45:26  
LOOP0:
RET       ;返回
这里应该是RETI
回复

点赞 举报

实习生

发表于 2017-12-23 22:21:24  
RET改为RETI应该就可以啦
回复

点赞 举报

实习生

发表于 2017-12-25 12:45:22    楼主|
人中狼 发表于 2017-12-23 18:45
LOOP0:
RET       ;返回
这里应该是RETI

死机的几率稍微下降了,但还是会出现死机现象
回复

点赞 举报

实习生

发表于 2017-12-25 12:45:56    楼主|
人中狼 发表于 2017-12-23 18:45
LOOP0:
RET       ;返回
这里应该是RETI

不太行,还是会死机
回复

点赞 举报

实习生

发表于 2017-12-25 12:47:50    楼主|
Lelouch12306 发表于 2017-12-23 22:21
RET改为RETI应该就可以啦

还是会死机
回复

点赞 举报

高级工程师

发表于 2017-12-25 19:30:18  
对按键按下次数的计算处理做复杂了,有些难理解,另外P0口是需要接上拉电阻的,复位电路里的电阻最好是10K的
回复

点赞 举报

实习生

发表于 2017-12-25 23:46:31    楼主|
人中狼 发表于 2017-12-25 19:30
对按键按下次数的计算处理做复杂了,有些难理解,另外P0口是需要接上拉电阻的,复位电路里的电阻最好是10K的

按键那里的话,我是用中断0口,对该口进行电平检测,(这里有软件延时,为了按键去抖)检测到低电平就进入中断,中断是用数据表(TAB)的形式进行查询(按一次,数据表就会查询到下一个数据)并赋给数码管以显示数值,START那里的话是利用眼睛的扫描频率,对数码管进行动态显示。而后面的上啦电阻等方面,我认为是次要的,应该不影响死机,我还查了一下,有人认为是堆栈溢出,但我也不是很懂。。。
回复

点赞 举报

实习生

发表于 2017-12-25 23:49:18    楼主|
人中狼 发表于 2017-12-25 19:30
对按键按下次数的计算处理做复杂了,有些难理解,另外P0口是需要接上拉电阻的,复位电路里的电阻最好是10K的

这是这个实验的题目:试利用外部中断输入的原理实现扰动监查的功能,即通过人为方式将外部中断输入引脚接地,从而产生低电平中断(模拟低电平干扰),能够通过两位的LED显示器显示干扰的次数
回复

点赞 举报

高级工程师

发表于 2017-12-26 09:52:38  
用你的程序和电路图,做了仿真,把
LOOP0:
RET       ;返回
的RET改为RETI后,没发现死机的问题,显示数字可以在0-99之间循环,不过是需要按键释放后才会更新显示。
或者你再测试一下,把遇到的问题详细描述一下,比如死机时是什么状态,什么情况下会死机
回复

点赞 举报

高级工程师

发表于 2017-12-26 09:53:08  
用你的程序和电路图,做了仿真,把
LOOP0:
RET       ;返回
的RET改为RETI后,没发现死机的问题,显示数字可以在0-99之间循环,不过是需要按键释放后才会更新显示。
或者你再测试一下,把遇到的问题详细描述一下,比如死机时是什么状态,什么情况下会死机
回复

点赞 举报

实习生

发表于 2017-12-26 12:30:54    楼主|
人中狼 发表于 2017-12-26 09:53
用你的程序和电路图,做了仿真,把
LOOP0:
RET       ;返回

仿真是应该没问题,但实物是不行的,我把程序烧进单片机后,刚开始没问题,但按了几个循环后,就会出现死机现象(假设我从00开始按,按一次,变为01,再按一次,变为02,以此类推,有时候我按到25,接着再按一次,应该是26,但他一直是25,无论我再怎么按,也不会变化。)复位后,又能重新开始,正常运行,但按了十几下,又会死机,自从复位后,我就不能按一个循环了,都是按到某个数后就死机。
回复

点赞 举报

实习生

发表于 2017-12-26 19:40:41    楼主|
非常感谢你的帮忙,现在试了很多次也不会死机了,能解释一下为什么要这样改吗?
如果我想要提高这个数码管的亮度,在P2口那里加8个上拉电阻连接到5V电源就行了吧?
回复

点赞 举报

高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /8 下一条

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

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

DSP论坛

瑞萨单片机论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区