找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机汇编数码管倒计时显示程序问题

[复制链接]
跳转到指定楼层
楼主
刚学单片机三个星期的萌新,有问题实在解决不了,求大佬帮个忙。单片机型号STC95C52,数码管为共阴极数码管,LED连接数码管运行,晶振为11.0592MHz,我设的定时中断口为P3.3。其他接口和题目我都写在纸上,现在的问题就是:单片机能够正常运行,能够正常倒计时,LED能够正常运行,但是数码管显示的十位上(左边)的数字一直在闪,我怎么调都调不好,要么闪要么一秒只跳一下,就是不能稳定显示,实在没办法了,求大佬帮忙看看程序,从MAIN开始就行了,前面应该都没问题,不会汇编的大佬就不用进来了,谢谢各位大佬!!!

SECOND EQU 30H
TCOUNT EQU 31H
      
    ORG 0000H
    LJMP START
    ORG 001BH
    LJMP T_0
  
START:SETB IT1
      SETB EX1
   SETB EA
   MOV R6,#0
      MOV R0,#00H
   MOV R1,#01H
   MOV R2,#00H
   MOV R3,#00H
   MOV DPTR,#TABLE
   LCALL DISP1
DISP1:MOV R7,#200
DISP2:MOV A,R0
      ORL P2,#00001110B
   ANL P2,#11111110B
   MOVC A,@A+DPTR
   MOV P0,A
   LCALL DELAY
   MOV A,R1
   ORL P2,#00001101B
   ANL P2,#11111101B
   MOVC A,@A+DPTR
   MOV P0,A
   LCALL DELAY
   MOV A,R2
   ORL P2,#00001011B
   ANL P2,#11111011B
   MOVC A,@A+DPTR
   MOV P0,A
   LCALL DELAY
   MOV A,R3
   ORL P2,#00000111B
   ANL P2,#11110111B
   MOVC A,@A+DPTR
   MOV P0,A
   LCALL DELAY
   RET
DONE:SJMP DONE
  T_0:PUSH PSW
      PUSH ACC
   LJMP MAIN
   POP ACC
   POP PSW
   RETI


MAIN: MOV SECOND,#90
    MOV TCOUNT,#00H
       MOV TMOD,#01H
    MOV TH0,#3CH
    MOV TL0,#0B0H
    SETB TR0
DISP:  MOV A,SECOND
       MOV B,#10
    DIV AB
    MOV DPTR,#TABLE
    ORL P2,#00000101B
    ANL P2,#11111101B
    MOVC A,@A+DPTR
    MOV P0,A
    LCALL DELAY2
    MOV A,B
    ORL P2,#00001011B
    ANL P2,#11111011B
    MOVC A,@A+DPTR
    MOV P0,A
    LCALL DELAY2
   
WAIT:  JNB TF0,WAIT
       CLR TF0
    MOV TH0,#3CH
    MOV TL0,#0B0H
    INC TCOUNT
    MOV A,TCOUNT
    CJNE A,#20,NEX  
    MOV TCOUNT,#00H
    DEC SECOND
    MOV A,SECOND
    CJNE A,#00H,NEXT
    MOV SECOND,#90
    CLR P2.6
    CLR P2.5
    CLR P2.4
    CLR P2.3
    CLR P2.2
    CLR P2.1
    CLR P2.0   
    JNB P2.0,DONE1
NEX:   LJMP DISP
NEXT:  LJMP WAIT
DELAY:MOV R5,#25
   D1:MOV R4,#25
   D2:DJNZ R4,D2
      DJNZ R5,D1
   RET
DONE1:LJMP START1
START1:SETB P1.5
       LCALL DELAY
    CLR P1.5
    LCALL DELAY
    LJMP START1
DELAY1:MOV R0,#50
    D3:MOV R1,#30
    D4:DJNZ R1,D4
       DJNZ R0,D3
    RET
DELAY2:MOV R0,#5
    D5:MOV R1,#5
    D6:DJNZ R1,D4
       DJNZ R0,D3
    RET
TABLE: DB 03FH,006H,05BH,04FH,066H
       DB 06DH,07DH,007H,07FH,06FH
       END


IMG_20191221_182202.jpg (5.26 MB, 下载次数: 40)

IMG_20191221_182202.jpg

IMG_20191221_182138.jpg (3.79 MB, 下载次数: 47)

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

使用道具 举报

沙发
ID:401564 发表于 2019-12-22 15:53 | 只看该作者
代码在整齐
主要的指令后面要加注释,你整个程序下来,一条注释都没有,不说别人,就是你自己过几天再来看都不一定知道你写了什么呀参考一下我的,自己改动一下吧,自己是可以慢慢找到问题的
回复

使用道具 举报

板凳
ID:669989 发表于 2019-12-23 20:45 | 只看该作者
这里是正确的代码,给后面来的人留条可能存在的活路,等我过两天实验报告写完会连图一起发上来

SECOND EQU 30H
TCOUNT EQU 31H
      
           ORG 0000H
           LJMP START
           ORG 0013H
           LJMP T_0
           ORG 0040H
START:MOV SP,#60H
      SETB EX1
          SETB IT1
          SETB EA
      MOV R0,#00H
          MOV R1,#00H
          MOV R2,#00H
          MOV R3,#00H
          MOV DPTR,#TABLE
          LCALL DISP1
DISP1:MOV A,R0
      ORL P2,#00001110B
          ANL P2,#11111110B
          MOVC A,@A+DPTR
          MOV P0,A
          LCALL DELAY
          MOV A,R1
          ORL P2,#00001101B
          ANL P2,#11111101B
          MOVC A,@A+DPTR
          MOV P0,A
          LCALL DELAY
          MOV A,R2
          ORL P2,#00001011B
          ANL P2,#11111011B
          MOVC A,@A+DPTR
          MOV P0,A
          LCALL DELAY
          MOV A,R3
          ORL P2,#00000111B
          ANL P2,#11110111B
          MOVC A,@A+DPTR
          MOV P0,A
          LCALL DELAY
          RET
DONE:  SJMP DONE
MAIN:  MOV SECOND,#10
           MOV TCOUNT,#00
       MOV TMOD,#01H
           MOV TH0,#3CH
           MOV TL0,#0B0H
           SETB TR0
DISP:  MOV A,SECOND
       MOV B,#10
           DIV AB
           MOV R0,A
           MOV R1,B
           MOV DPTR,#TABLE
           MOV R4,#1
DISP2: MOV R3,#100
DISP3: MOV A,R0
       ORL P2,#11110101B
           ANL P2,#11111101B
           MOVC A,@A+DPTR
           MOV P0,A
           LCALL DELAY2
           MOV A,R1
           ORL P2,#11111011B
           ANL P2,#11111011B
           MOVC A,@A+DPTR
           MOV P0,A
           LCALL DELAY2
           DJNZ R3,DISP3
           LJMP WAIT
WAIT: JNB TF0,WAIT
       CLR TF0
           MOV TH0,#3CH
           MOV TL0,#0B0H          
           DEC SECOND
           MOV A,SECOND
           CJNE A,#00,DISP
           MOV SECOND,#10
           CLR p2.7
           CLR P2.6
           CLR P2.5
           CLR P2.4
           CLR P2.3
           CLR P2.2
           CLR P2.1
           CLR P2.0
           LJMP START1
START1:SETB P1.5
       LCALL DELAY1
           CLR P1.5
           LCALL DELAY1
           LJMP START1                 
          
  T_0:PUSH PSW
      PUSH ACC
          LCALL MAIN
          POP ACC
          POP PSW
          RETI

DELAY:MOV R5,#25
   D1:MOV R4,#25
   D2:DJNZ R4,D2
      DJNZ R5,D1
          RET

DELAY1:MOV R6,#15
    D3:MOV R7,#15
    D4:DJNZ R7,D4
       DJNZ R6,D3
           RET

DELAY2:MOV R5,#75
   D5:MOV R4,#200
   D6:DJNZ R4,D2
      DJNZ R5,D1
          RET

TABLE: DB 03FH,006H,05BH,04FH,066H
       DB 06DH,07DH,007H,07FH,06FH
       END
回复

使用道具 举报

地板
ID:401564 发表于 2019-12-23 22:26 | 只看该作者
注释,注释呀,人家写C语言都要有注释的,更不用说汇编了,没有注释,没有分清标号的,哪怕是只有几十行代码,别人看起来也是很难理解的
如果你是复制了别人的代码,最好也是自己给加上注释,关键部分加完注释,你基本上就知道这程序是怎么跑的了
           CLR p2.7
           CLR P2.6
           CLR P2.5
           CLR P2.4
           CLR P2.3
           CLR P2.2
           CLR P2.1
           CLR P2.0
           LJMP START1
START1:SETB P1.5

你看一下这一段,这用不着那么多的CLR指令的,  MOV P2,#000H就可以了
LJMP START1
LJMP START1这个标号就在下一条指令了,那LJMP指令就没有存在的意义了
LJMP WAIT
WAIT: JNB TF0,WAIT这个地方也是一样的
这程序写这太随意了,一旦有什么问题,想找原因要找半天,如果是刚刚入门就更难了
回复

使用道具 举报

5#
ID:669989 发表于 2020-1-3 15:32 | 只看该作者
Y_G_G 发表于 2019-12-23 22:26
注释,注释呀,人家写C语言都要有注释的,更不用说汇编了,没有注释,没有分清标号的,哪怕是只有几十行代码,别人 ...

好吧好吧,以后写程序会记得加的
回复

使用道具 举报

6#
ID:669989 发表于 2020-1-3 15:43 | 只看该作者
不会上传图片。。。我自己来阐述一下什么问题吧,在倒计时那段程序显示的时候刚开始因为我只做了个位数的循环,没有把十位和更高位一起放进去循环,所以就会出现只有一个数字稳定显示的问题,其他的要么一秒闪一次,要么闪的频率眼睛看得到,所以我给两个数字放在一起套了一层循环,这样就都能稳定显示了。我师傅也和上面的大佬说了一样的话,说我程序写的太乱了。。。原谅我没学过汇编语言就直接上单片机。。。
回复

使用道具 举报

7#
ID:401564 发表于 2020-1-3 17:29 | 只看该作者
汇编和硬件关系很大的,跟C不一样的
T_0:PUSH PSW
      PUSH ACC
   LJMP MAIN
   POP ACC
   POP PSW
   RETI
像你这个中断程序,进入中断之后, LJMP MAIN就跳到别的地方去了,都不知道跑哪里去了

你这个程序一般人改不了,跳来跳去的,跟不上你的思路
这并不是一个很大程序,你最好是重新写一个,把每个子程序的功能写上,子程序之间加上分割线分好
这样也好找问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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