找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2223|回复: 7
收起左侧

求助。温度显示与时钟显示冲突了

[复制链接]
ID:271997 发表于 2018-1-5 15:56 | 显示全部楼层 |阅读模式
在做课程设计,其中有一条是需要时间与温度交替显示。
我写好了温度显示和时间显示,分别测试都已经可以实现功能了。
但是,一旦把温度显示和时间显示合并在一个程序中,时间显示是正常的,但是温度显示为“FE”了。
测试了一下,发现没有加进时间中断程序的时候,温度显示是正常的,加进来时间中断程序之后,温度显示就变成了“EF”。

弄了一天都没有找到哪里错了,请大家指出程序的错误,谢谢啦!
下面是代码
  1.       FLAG1 BIT 00H         ;FLAG1:标志位,为"1"时表示检测到DS18B20
  2.       TEMPER_NUM EQU 38H    ;TEMPER_NUM:保存读出的温度数据
  3.       TEMPER_L EQU 5BH      ;温度的低位
  4.       TEMPER_H EQU 5AH      ;温度的高位
  5.       TEMP EQU 5DH          ;临时存放温度数据的单元
  6.       DIS_TEMP EQU 58H      ;58H存放显示温度的个位数,59H存放显示温度的十位数
  7.                         DIS_C EQU 5CH
  8.       DQ BIT P1.3          ; DQ:DS18B20的数据总线接脚
  9.       ;DS18B20初始化程序
  10.       ;//*****************************************//
  11. ;定义区
  12. ;//===============================
  13. ;//时间计数缓冲区     
  14.                          DIS_MIN EQU 50H   ;50H,51H
  15.        DIS_HOUR EQU 52H  ;52H,53H
  16.        DIS_DAY EQU 54H   ;54H,55H
  17.                          DIS_MON EQU 56H         ;56H,57H
  18. ;//===============================
  19. ;//时间储存单元
  20.        MONTH   EQU 30H
  21.        DAY     EQU 31H
  22.        HOUR    EQU 32H
  23.                          MINUTE  EQU 33H
  24.        COUNT_MIN EQU 4FH
  25.                          DL_2S   EQU 41H

  26.       ORG 0000H
  27.       LJMP  MAIN
  28.                         ORG 000BH
  29.                         LJMP TIMER_T0
  30.       ORG 0030H
  31.                        
  32. MAIN:  MOV R0,#50H
  33.         MOV R2,#8
  34. CLEAR:  MOV @R0,#00
  35.         INC R0
  36.         DJNZ R2,CLEAR   ;缓冲区清0
  37.                                 ACALL INT_TO                ;定时器T0初始化
  38.                                 MOV MONTH,#01H
  39.                                 MOV DAY,#01H
  40.                                 MOV HOUR,#00
  41.                                 MOV MINUTE,#00
  42.                                 MOV DL_2S,#64H
  43.       MOV A,#00
  44.                   MOV TEMPER_NUM,A
  45.       MOV TEMPER_L,#00
  46.       MOV TEMPER_H,#00
  47.                         MOV DIS_C,#0CH
  48.       ACALL INIT_1820
  49. LOOP1:  NOP                               
  50.         CALL DISPLY_CLOCK
  51.                                 CALL DL10MS
  52.                                 DJNZ DL_2S,LOOP1
  53.                                 MOV DL_2S,#64H

  54. LOOP2:  CALL DISPLY_DATE
  55.                                 CALL DL10MS
  56.                                 DJNZ DL_2S,LOOP2
  57.                                 MOV DL_2S,#64H
  58.                                
  59. LOOP3:  CALL TEMPER
  60.                                 CALL DISPLY_TEMP
  61.                                 CALL DL10MS
  62.                                 DJNZ DL_2S,LOOP3
  63.                                 MOV DL_2S,#64H
  64.                                 LJMP LOOP1                       
  65. ;初始化程序
  66. INIT_1820: SETB DQ
  67.        NOP
  68.        CLR DQ       ;主机发出延时540us的复位低脉冲
  69.        MOV R0,#36
  70.        LCALL DELAY
  71.        SETB DQ      ;然后拉高数据线
  72.        NOP
  73.        NOP
  74.        MOV R0,#36
  75. TSR2: JNB DQ,TSR3     ;等待DS18B20的回应
  76.                         DJNZ R0,TSR2
  77.                         LJMP TSR4;     延时
  78. TSR3: SETB FLAG1;     置标志位,表示DS1820存在
  79.       LJMP TSR5
  80. TSR4: CLR FLAG1;      清标志位,表示DS1820不存在
  81.       LJMP TSR7
  82. TSR5: MOV R0,#06BH;   200us
  83. TSR6: DJNZ R0,TSR6;    复位成功!时序要求延时一段时间
  84. TSR7: SETB DQ
  85.           RET
  86. ;//定时器初始化
  87. INT_TO: MOV COUNT_MIN,#20
  88.         MOV TMOD,#01H
  89.         MOV TH0,#0FFH                ;延时50MS,常数3CB0H
  90.         MOV TL0,#0B0H
  91.         SETB EA
  92.         SETB ET0
  93.         SETB TR0
  94.                                 RET       

  95. ;//================================时钟中断程序
  96.         ORG 0200H
  97. TIMER_T0:PUSH ACC
  98.         PUSH PSW
  99.         MOV TH0,#0FFH
  100.         MOV TL0,#0B0H
  101.         DJNZ COUNT_MIN,TINEXT
  102.                                 MOV COUNT_MIN,#20
  103.         MOV A,MINUTE       ;分处理
  104.         ADD A,#01H
  105.         DA A
  106.         MOV MINUTE, A
  107.         CJNE A, #60H,TINEXT;分处理结束
  108.         MOV MINUTE,#00     ;分清零
  109.         MOV A,HOUR                                 ;时处理
  110.         ADD A,#01H
  111.         DA A
  112.         MOV HOUR, A
  113.         CJNE A, #24H,TINEXT;时处理结束
  114.         MOV HOUR,#00                         ;时清零
  115.                                 MOV A,DAY                                   ;日处理
  116.         ADD A,#01H
  117.         DA A
  118.         MOV DAY, A
  119.         CJNE A, #31H,TINEXT;日处理结束
  120.         MOV DAY,#01                                 ;日清零
  121.                                 MOV A,MONTH                                 ;月处理
  122.                                 ADD A,#01H
  123.                                 DA A
  124.                                 MOV MONTH,A
  125.                                 CJNE A, #13,TINEXT ;月处理结束
  126.                                 MOV MONTH,#01                         ;月清零
  127. TINEXT: POP PSW
  128.         POP ACC
  129.         RETI
  130.                                
  131. TEMPER: ACALL RE_CONFIG
  132.       ACALL GET_TEMPER
  133.       CALL TEMPER_COV
  134.       RET
  135.       ;//*****************************************//
  136.       ; 重新写DS18B20暂存存储器设定值
  137.       ;//*****************************************//
  138. RE_CONFIG: JB FLAG1,RE_CONFIG1; 若DS18B20存在,转RE_CONFIG1
  139.            RET
  140. RE_CONFIG1:MOV A,#0CCH;  发SKIP ROM命令
  141.            LCALL WRITE_1820
  142.            MOV A,#4EH;  发写暂存存储器命令
  143.            LCALL WRITE_1820
  144.            MOV A,#00H;  不 TH(报警上限)中写入00H
  145.            LCALL WRITE_1820
  146.            MOV A,#00H;   TL(报警下限)中写入00H
  147.            LCALL WRITE_1820
  148.            MOV A,#1FH;   选择9位温度分辨率
  149.            LCALL WRITE_1820
  150.            RET
  151.       ;//*****************************************//
  152.       ; 读出转换后的温度值
  153.       ;//*****************************************//
  154. GET_TEMPER: SETB DQ; 定时入口
  155.             LCALL INIT_1820
  156.             JB FLAG1,TSS2
  157.             RET; 若DS18B20不存在则返回
  158. TSS2:       MOV A,#0CCH; 跳过ROM匹配
  159.             LCALL WRITE_1820
  160.             MOV A,#44H; 发出温度转换命令
  161.             LCALL WRITE_1820
  162.             MOV R0,#50;等待A/D转换结束,12位的话750us
  163.             LCALL DELAY
  164.             LCALL INIT_1820
  165.             MOV A,#0CCH; 跳过ROM匹配
  166.             LCALL WRITE_1820
  167.             MOV A,#0BEH; 发出读温度命令
  168.             LCALL WRITE_1820
  169.             LCALL READ_18200
  170.             MOV TEMPER_NUM,A; 将读出的温度数据保存
  171.             RET
  172.       ;//*****************************************//
  173.       ; 读DS18B20的程序,从DS18B20中读出一个字节的数据
  174.       ;//*****************************************//
  175.       READ_1820: MOV R2,#8
  176.              RE1: CLR C
  177.                  SETB  DQ
  178.                  NOP
  179.                  NOP
  180.                  CLR DQ
  181.                  NOP
  182.                  NOP
  183.                  NOP
  184.                  SETB DQ
  185.                  MOV R3,#7
  186.                  DJNZ R3,$
  187.                  MOV C,DQ
  188.                  MOV R3,#23
  189.                  DJNZ R3,$
  190.                  RRC A
  191.                  DJNZ R2,RE1
  192.                  RET
  193.       ;//*****************************************//
  194.       ; 写DS18B20的程序
  195.       ;//*****************************************//
  196.       WRITE_1820: MOV R2,#8
  197.                   CLR C
  198.              WR1: CLR DQ
  199.                   MOV R3,#6
  200.                   DJNZ R3,$
  201.                   RRC A
  202.                   MOV DQ,C
  203.                   MOV R3,#23
  204.                   DJNZ R3,$
  205.                   SETB DQ
  206.                   NOP
  207.                                                                         DJNZ R2,WR1
  208.                   SETB DQ
  209.                   RET
  210.       ;//*****************************************//
  211.       ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
  212.       ;//*****************************************//
  213.       READ_18200:MOV R4,#2; 将温度高位和低位从DS18B20中读出
  214.                    MOV R1,#5BH; 低位存入5BH(TEMPER_L),高位存入5AH(TEMPER_H)
  215.             RE00:MOV R2,#8
  216.             RE01:CLR C
  217.                  SETB DQ
  218.                  NOP
  219.                  NOP
  220.                  CLR DQ
  221.                  NOP
  222.                  NOP
  223.                  NOP
  224.                  SETB DQ
  225.                  MOV R3,#7
  226.                  DJNZ R3,$
  227.                  MOV C,DQ
  228.                  MOV R3,#23
  229.                  DJNZ R3,$
  230.                  RRC A
  231.                  DJNZ R2,RE01
  232.                  MOV @R1,A
  233.                  DEC R1
  234.                  DJNZ R4,RE00
  235.                  RET
  236.       ;//*****************************************//
  237.       ; 将从DS18B20中读出的温度数据进行转换
  238.       ;//*****************************************//
  239.       TEMPER_COV:   MOV A,#0F0H
  240.                     ANL A,TEMPER_L; 舍去温度低位中小数点后的四位温度数值
  241.                     SWAP A
  242.                     MOV TEMPER_NUM,A
  243.                     MOV A,TEMPER_L
  244.                     JNB ACC.3,TEMPER_COV1; 四舍五入去温度值
  245.                     INC TEMPER_NUM
  246.       TEMPER_COV1:  MOV A,TEMPER_H
  247.                     ANL A,#07H
  248.                     SWAP A
  249.                     ORL A,TEMPER_NUM
  250.                     MOV TEMPER_NUM,A; 保存变换后的温度数据
  251.                     LCALL BIN_BCD
  252.                     RET
  253.       ;//*****************************************//
  254.       ; 将16进制的温度数据转换成压缩BCD码
  255.       ;//*****************************************//
  256.       BIN_BCD: MOV DPTR,#TEMP_TAB
  257.                MOV A,TEMPER_NUM
  258.                MOVC A,@A+DPTR
  259.                MOV TEMPER_NUM,A
  260.       RET
  261.   TEMP_TAB:   DB 00H,01H,02H,03H,04H,05H,06H,07H
  262.               DB 08H,09H,10H,11H,12H,13H,14H,15H
  263.               DB 16H,17H,18H,19H,20H,21H,22H,23H
  264.               DB 24H,25H,26H,27H,28H,29H,30H,31H
  265.               DB 32H,33H,34H,35H,36H,37H,38H,39H
  266.               DB 40H,41H,42H,43H,44H,45H,46H,47H
  267.               DB 48H,49H,50H,51H,52H,53H,54H,55H
  268.               DB 56H,57H,58H,59H,60H,61H,62H,63H
  269.               DB 64H,65H,66H,67H,68H,69H,70H,71H
  270.                     DB 72H,73H,74H,75H,76H,77H,78H,79H
  271.               DB 80H,81H,82H,83H,84H,85H,86H,87H
  272.               DB 88H,89H,90H,91H,92H,93H,94H,95H
  273.               DB 96H,97H,98H,99H
  274. ;//*****************************************//
  275. ; 延时子程序
  276. ;为保证DS18B20的严格I/O时序,需做较精确的延时
  277. ;在DS18B20操作中,用到的延时有15us、90us、270us、540us、750us
  278. ;因为这些延时均为15us的倍数,因此可编写一个DELAY15(n)函数
  279. ;//*****************************************//
  280. DELAY:
  281. TEMP_LOOP:MOV R1,#06H
  282. TEMP_LOOP1:DJNZ R1,TEMP_LOOP1
  283.        DJNZ R0,TEMP_LOOP
  284.        RET
  285. ;//*****************************************//
  286. ;500毫秒延时子程序和10毫秒延时子程序
  287. ;//*****************************************//
  288. DELAY500:MOV R4,#248
  289. DA222:   MOV R5,#248
  290.                                  DJNZ R5,$
  291.                                  DJNZ R4,DA222
  292.                                  RET
  293.                                                                
  294. DL10MS:  MOV R5,#10
  295. DL1:     MOV R6,#20
  296. DL:      NOP
  297.          NOP
  298.          NOP
  299.          DJNZ R6,DL
  300.          DJNZ R5,DL1
  301.          RET

  302. ;=================================显示一位子程序
  303. ;显示子程序
  304. ;显示缓冲区地址:(R0)
  305. ;位控(R2)
  306. DIS:     MOV DPTR, #SEG_TAB
  307.          MOV A,@R0
  308.          MOVC A,@A+DPTR
  309.          MOV P0,A    ;输出
  310.          NOP
  311.          NOP
  312.          MOV A,R2
  313.          MOV P1,A
  314.          NOP
  315.          NOP
  316.          RET
  317.                                  
  318. SEG_TAB: DB 3FH,06H,5BH,4FH
  319.                                  DB 66H,6DH,7DH,07H
  320.                                  DB 7FH,6FH,77H,7CH
  321.                                  DB 39H,5EH,79H,71H

  322. ;=================================BCD分离子程序
  323. ;  待转换的数放在(R2)中
  324. ;  转换结果放在(R0)指出的单元中

  325. BCDS:  MOV A, R2
  326.        ANL A,#00001111B
  327.        MOV @R0,A
  328.        INC R0
  329.        MOV A,R2
  330.        ANL A,#11110000B
  331.        SWAP A
  332.        MOV @R0,A
  333.        RET
  334. ;================================显示程序

  335. DISPLY_TEMP:
  336.                           MOV R2, TEMPER_NUM; 取温度
  337.         MOV R0, #DIS_TEMP
  338.         CALL BCDS
  339.                                
  340.                                 NOP
  341.                                 MOV R0,#DIS_C
  342.                                 MOV R2,#00000101B
  343.                                 CALL DIS
  344.                                 CALL DL10MS
  345.         MOV R0,#DIS_TEMP
  346.         MOV R2,#00000100B   ;温度个位
  347.         CALL DIS
  348.         CALL DL10MS
  349.         INC R0
  350.         MOV R2,#00000011B   ;温度十位
  351.         CALL DIS
  352.         CALL DL10MS

  353.         RET
  354. DISPLY_CLOCK:
  355.                                 MOV R2, MINUTE; 取分值
  356.         MOV R0, #DIS_MIN
  357.         CALL BCDS
  358.         MOV R2, HOUR;   取时值
  359.         MOV R0, #DIS_HOUR
  360.         CALL BCDS
  361.                                
  362.                                 NOP
  363.         MOV R0,#DIS_MIN
  364.         MOV R2,#00000101B   ;分个位
  365.         CALL DIS
  366.         CALL DL10MS
  367.         INC R0
  368.         MOV R2,#00000100B   ;分十位
  369.         CALL DIS
  370.         CALL DL10MS
  371.         INC R0

  372.         MOV R2,#00000010B   ;时个位
  373.         CALL DIS
  374.         CALL DL10MS
  375.         INC R0
  376.         MOV R2,#00000001B   ;时十位
  377.         CALL DIS
  378.         CALL DL10MS
  379.         RET

  380. DISPLY_DATE:
  381.                                 MOV R2, DAY;    取日值
  382.         MOV R0, #DIS_DAY
  383.         CALL BCDS
  384.                                 MOV R2,MONTH;   取月值
  385.         MOV R0, #DIS_MON
  386.                                 CALL BCDS
  387.                                
  388.                                 NOP
  389.         MOV R0,#DIS_DAY
  390.         MOV R2,#00000101B   ;日个位
  391.         CALL DIS
  392.         CALL DL10MS
  393.         INC R0
  394.         MOV R2,#00000100B   ;日十位
  395.         CALL DIS
  396.         CALL DL10MS
  397.         INC R0

  398.         MOV R2,#00000010B   ;月个位
  399.         CALL DIS
  400.         CALL DL10MS
  401.         INC R0
  402.         MOV R2,#00000001B   ;月十位
  403.         CALL DIS
  404.         CALL DL10MS
  405.         INC R0
  406.         RET

  407. END
复制代码



评分

参与人数 1黑币 +1 收起 理由
梅花三弄 + 1

查看全部评分

回复

使用道具 举报

ID:123289 发表于 2018-1-5 19:41 | 显示全部楼层
设置三个存储区:
区1:放时间,当时间有改变时,改变一下。
区2:放温度,当温度有新采样值时,改变一下。
区3:是显示区,显示程序从区3取数据显示!
当需要显示时间时,做个区3=区1的动作。
当需要显示温度时,做个区3=区2的动作。
简简单单!
回复

使用道具 举报

ID:123289 发表于 2018-1-5 19:45 | 显示全部楼层
对于显示程序来说,它只从区3取出数值→解码→放入扫描显示区,不存在时间!也不存在温度!只有字节中的二进制数,也只做:解码→放入扫描显示区。
你说是不是。
回复

使用道具 举报

ID:123289 发表于 2018-1-5 19:48 | 显示全部楼层
对于扫描程序来说,它只依扫描的时序,从与时序对应的扫描区单元中取字节送至IO口。
回复

使用道具 举报

ID:123289 发表于 2018-1-5 19:49 | 显示全部楼层
看在你写汇编的面子上,帮你一下,不懂再来问。
回复

使用道具 举报

ID:271997 发表于 2018-1-5 20:52 | 显示全部楼层
yzwzfyz 发表于 2018-1-5 19:49
看在你写汇编的面子上,帮你一下,不懂再来问。

在代码开始的定义区,我也定义了你所说的三个存储区。不过温度数值的显示区和时间数值的显示区分别都放在了温度和时间存储定义区了。
刚才问了老师,老师说可能是时钟中断程序影响了18B20的延时时序。要我在调用温度的时候再启动18B20.
这个18b20程序是老师给我的,我还没有太理解老师说的启动18B20,“启动18B20”这个要求具体我的代码中的哪一条指令呢?
我的18B20程序在后面,已经标注好了,很容易找到。
高手能帮我看一下吗?谢谢高手啦
回复

使用道具 举报

ID:271997 发表于 2018-1-5 21:21 | 显示全部楼层
真的看了整整一天都没有发现错误。
还有我发现我的程序大多都是分开运行都是正常的,一旦拼接在一起,就不对了。有什么好的建议吗
回复

使用道具 举报

ID:271997 发表于 2018-1-6 12:58 | 显示全部楼层
发现错了,之前为了使时间显示快一点,给TH0和TH0了一个比较大的数值,但是调回3CB0之后,就正常显示了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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