标题: 单片机汇编定时不准 [打印本页]

作者: qcw729    时间: 2020-2-20 17:19
标题: 单片机汇编定时不准
主要想练习中断的使用,但是使用的是否发现与我预期的相差很多,一分钟差了几秒钟,不知道什么原因 希望有的大佬给出答案
  1. ORG 000H
  2. MOV R7,#000H;不初始化的时候,会乱码 我也不知道为什么
  3. MOV R1,#000H
  4. MOV R2,#000H
  5. MOV R3,#000H
  6. MOV R4,#000H
  7. MOV R0,#000H
  8. MOV DPTR,#TIME
  9. LJMP MAIN
  10. ORG 01BH;中断入口
  11. CLR TR1
  12. LJMP SU
  13. MAIN:;主函数
  14. MOV TMOD,#10H;设置TMOD
  15. MOV TL1,#0B0H;
  16. MOV TH1,#03CH;
  17. SETB EA
  18. SETB ET1
  19. LOOP: SETB TR1
  20. LOOP1:LCALL DISPLAY
  21. SJMP LOOP1

  22. SU:;中断后函数
  23. INC R7;判断是否够20次
  24. CJNE R7,#20,LOOP_END;不够20此直接返回
  25. MOV R7,#00H
  26. INC R4
  27. CJNE R4,#0AH,LOOP_END;判断是否够10秒,进1
  28. MOV R4,#00H
  29. INC R3
  30. CJNE R3,#0AH,LOOP_END
  31. MOV R3,#00H
  32. INC R2
  33. CJNE R2,#0AH,LOOP_END
  34. MOV R2,#00H
  35. INC R1
  36. CJNE R1,#9,LOOP_END
  37. MOV R1,#00H
  38. LOOP_END:
  39. MOV TL1,#0B0H
  40. MOV TH1,#03CH
  41. SETB TR1
  42. RETI

  43. DISPLAY:;数码管显示
  44. MOV A,R1
  45. MOVC A,@A+DPTR
  46. MOV P2,#0FEH
  47. MOV P0,A
  48. ACALL D10MS
  49. MOV A,R2
  50. MOVC A,@A+DPTR
  51. MOV P2,#0FDH
  52. MOV P0,A
  53. ACALL D10MS
  54. MOV A,R3
  55. MOVC A,@A+DPTR
  56. MOV P2,#0FBH
  57. MOV P0,A
  58. ACALL D10MS
  59. MOV A,R4
  60. MOVC A,@A+DPTR
  61. MOV P2,#0F7H
  62. MOV P0,A
  63. ACALL D10MS
  64. RET

  65. D10MS:;延时函数
  66. MOV R5,#10
  67. DY1:
  68. MOV R6,#75
  69. DY2:
  70. DJNZ R6,$
  71. DJNZ R5,DY1
  72. RET
  73. TIME:
  74. DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
  75. END
复制代码




作者: xuyaqi    时间: 2020-2-20 21:28
MOV TL1,#0B0H;
MOV TH1,#03CH;
这两句是调整定时器快慢,
MOV TH1,#03CH;是高8位,
MOV TL1,#0B0H;是低8位。
作者: hantu    时间: 2020-2-20 21:52
进中断最先就要马上重装计数器的值,你却没这么做
作者: csmyldl    时间: 2020-2-21 01:04
LOOP: SETB TR1
LOOP1:LCALL DISPLAY
SJMP LOOP1
主程序中不要反复开启TR1,中断程序也不要TR1
中断处理放在主程序:(下面的程序)
MOV R7,#00H
INC R4
CJNE R4,#0AH,LOOP_END;判断是否够10秒,进1
MOV R4,#00H
INC R3
CJNE R3,#0AH,LOOP_END
MOV R3,#00H
INC R2
CJNE R2,#0AH,LOOP_END
MOV R2,#00H
INC R1
CJNE R1,#9,LOOP_END
MOV R1,#00H

中断程序改为:
SU:   MOV  TL0,#0B0H
        MOV  TH0,#03CH
        INC    R7
        MOV   A,#20
        XRL    A,R7
        JNZ    SU1
        MOV  R7,#0
        SETB  FLAG            ;这是1秒的标记,在主程序去判断并处理,处理完后CLR   FLAG
SU1: RETI
改了之后,若还有误差,把TL0适当改大一点点,如MOV   TL0,#0B6H

作者: qcw729    时间: 2020-2-21 15:46
hantu 发表于 2020-2-20 21:52
进中断最先就要马上重装计数器的值,你却没这么做

谢谢  已经解决了 确实问题太多了
作者: qcw729    时间: 2020-2-21 15:47
csmyldl 发表于 2020-2-21 01:04
LOOP: SETB TR1
LOOP1:LCALL DISPLAY
SJMP LOOP1

谢谢 已经解决了 确实问题很大 代码 都是自己慢慢想出来的




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1