久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2623|回復: 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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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口。
回復

使用道具 舉報

5#
ID:123289 發表于 2018-1-5 19:49 | 只看該作者
看在你寫匯編的面子上,幫你一下,不懂再來問。
回復

使用道具 舉報

6#
ID:271997 發表于 2018-1-5 20:52 | 只看該作者
yzwzfyz 發表于 2018-1-5 19:49
看在你寫匯編的面子上,幫你一下,不懂再來問。

在代碼開始的定義區,我也定義了你所說的三個存儲區。不過溫度數值的顯示區和時間數值的顯示區分別都放在了溫度和時間存儲定義區了。
剛才問了老師,老師說可能是時鐘中斷程序影響了18B20的延時時序。要我在調用溫度的時候再啟動18B20.
這個18b20程序是老師給我的,我還沒有太理解老師說的啟動18B20,“啟動18B20”這個要求具體我的代碼中的哪一條指令呢?
我的18B20程序在后面,已經標注好了,很容易找到。
高手能幫我看一下嗎?謝謝高手啦
回復

使用道具 舉報

7#
ID:271997 發表于 2018-1-5 21:21 | 只看該作者
真的看了整整一天都沒有發現錯誤。
還有我發現我的程序大多都是分開運行都是正常的,一旦拼接在一起,就不對了。有什么好的建議嗎
回復

使用道具 舉報

8#
ID:271997 發表于 2018-1-6 12:58 | 只看該作者
發現錯了,之前為了使時間顯示快一點,給TH0和TH0了一個比較大的數值,但是調回3CB0之后,就正常顯示了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91新视频| 久草成人 | 日本久久久久久 | 亚洲综合色网站 | 欧美精品片 | 国产欧美精品一区二区三区 | 国产欧美日韩一区二区三区 | 九七午夜剧场福利写真 | 日韩欧美精品 | 一区二区三区欧美在线 | 欧美黑人体内she精在线观看 | 国产精品久久久久久久久久免费 | 天啪| 午夜寂寞福利视频 | 欧美福利| 999热精品视频 | 亚洲精品一二三区 | 天天曰天天干 | 精品91久久 | 91精品国产乱码久久久久久久久 | 国产日韩免费视频 | 涩涩鲁亚洲精品一区二区 | 国产露脸国语对白在线 | 欧美在线免费 | 古装三级在线播放 | 日本午夜网站 | 99热精品在线观看 | 91精品入口蜜桃 | 亚洲一级毛片 | 国产一区二区三区在线免费 | 91精品久久久久久久久久入口 | 免费精品国产 | 亚洲精品一二区 | 一区二区av| 99九九视频 | 亚洲女人天堂网 | 一区二区三区视频 | 国产精品美女久久久久久免费 | 午夜色婷婷 | 成人三级视频在线观看 | 久久婷婷av |