找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 962|回复: 5
收起左侧

单片机汇编定时不准

[复制链接]
ID:521383 发表于 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
复制代码



回复

使用道具 举报

ID:94031 发表于 2020-2-20 21:28 | 显示全部楼层
MOV TL1,#0B0H;
MOV TH1,#03CH;
这两句是调整定时器快慢,
MOV TH1,#03CH;是高8位,
MOV TL1,#0B0H;是低8位。
回复

使用道具 举报

ID:462827 发表于 2020-2-20 21:52 | 显示全部楼层
进中断最先就要马上重装计数器的值,你却没这么做
回复

使用道具 举报

ID:235200 发表于 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
回复

使用道具 举报

ID:521383 发表于 2020-2-21 15:46 | 显示全部楼层
hantu 发表于 2020-2-20 21:52
进中断最先就要马上重装计数器的值,你却没这么做

谢谢  已经解决了 确实问题太多了
回复

使用道具 举报

ID:521383 发表于 2020-2-21 15:47 | 显示全部楼层
csmyldl 发表于 2020-2-21 01:04
LOOP: SETB TR1
LOOP1:LCALL DISPLAY
SJMP LOOP1

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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