找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2923|回復(fù): 1
收起左側(cè)

匯編51單片機DS18B20數(shù)碼管顯示溫度時間

[復(fù)制鏈接]
ID:763147 發(fā)表于 2020-5-28 15:50 | 顯示全部樓層 |閱讀模式
本文為通過51單片機進行DS18B20的溫度采集,在6位數(shù)碼管上顯示時間與溫度,并通過掃描方式輸入9位按鍵,已封裝好了各個按鍵的功能區(qū)。
1.jpg

右側(cè)為設(shè)定溫度,可通過按鍵進行設(shè)置,左側(cè)27為檢測溫度,為DS18B20實測數(shù)據(jù)
23.jpg

時間顯示,為2時3分13秒,各個時間也可通過按鍵設(shè)置
程序內(nèi)有詳細注釋

單片機源程序如下:
  1. ;*************************************************
  2. ;***************溫度時間顯示模板.HUI**************
  3. ;*************************************************

  4.                         KEY                        EQU                40H                ;存放鍵值
  5.                         SECOND                EQU                37H
  6.                         MINUTE                EQU                38H
  7.                         HOUR                EQU                32H
  8.                         TCNT                EQU                34H                ;時間計數(shù)
  9.                         FLAG1                 BIT         00H     ; FLAG1:標志位,為"1"時表示檢測到DS18B20
  10.                         TEMPER_NUM         EQU         50H         ; TEMPER_NUM:保存讀出的溫度數(shù)據(jù)
  11.                         TEMPER_L         EQU         36H           ;溫度的低位
  12.                         TEMPER_H         EQU         35H            ;溫度的高位
  13.                         TEMP                 EQU         34H     ;臨時存放溫度數(shù)據(jù)的單元
  14.                         SJGW                 EQU         30H     ;存放顯示溫度的個位數(shù)
  15.                         SJSW                 EQU         31H     ;存放顯示溫度的十位數(shù)
  16.                         DQ                         BIT         P1.3    ;DQ:DS18B20的數(shù)據(jù)總線接腳
  17.                         DIS_FLAG        BIT                01H                ;顯示標志,為1時顯示溫度

  18.                         ORG                00H
  19.                         AJMP        MAIN
  20.                         ORG                0BH
  21.                         LJMP        INT_T0
  22.                        
  23.                        
  24. ;*********************子程序*********************

  25. ;**************中斷子程序************************
  26. INT_T0:                PUSH ACC
  27.                         PUSH PSW
  28.                         MOV        TH0,#(65536-50000)/256
  29.                         MOV        TL0,#(65536-50000);MOD 256
  30.                         INC        TCNT
  31.                         MOV        A,TCNT
  32.                         CJNE A,#20,RETUNE        ;計時1秒
  33.                         INC        SECOND
  34.                         MOV        TCNT,#0
  35.                         MOV        A,SECOND
  36.                         CJNE A,#60,RETUNE
  37.                         INC        MINUTE
  38.                         MOV        SECOND,#0
  39.                         MOV        A,MINUTE
  40.                         CJNE A,#60,RETUNE
  41.                         INC        HOUR
  42.                         MOV        MINUTE,#0
  43.                         MOV        A,HOUR
  44.                         CJNE A,#24,RETUNE
  45.                         MOV        HOUR,#0
  46. RETUNE:                POP PSW
  47.                         POP ACC
  48.                         RETI               


  49. ;*****************顯示子程序*********************
  50. DISPLAY1:        MOV        A,SECOND        ;顯示秒
  51.                         MOV        B,#10
  52.                         DIV        AB
  53.                         MOV DPTR,#TABLE
  54.                         MOVC A,@A+DPTR
  55.                         MOV P1,#00000100B
  56.                         MOV        P0,A
  57.                         LCALL        DELAY1
  58.                         MOV        A,B
  59.                         MOVC A,@A+DPTR
  60.                         MOV P1,#00000101B
  61.                         MOV        P0,A
  62.                         LCALL DELAY1
  63.                         MOV                A,MINUTE        ;顯示分鐘
  64.                         MOV                B,#10
  65.                         DIV                AB
  66.                         MOVC        A,@A+DPTR
  67.                         MOV P1,#00000010B
  68.                         MOV                P0,A
  69.                         LCALL        DELAY1
  70.                         MOV                A,B
  71.                         MOVC        A,@A+DPTR
  72.                         MOV P1,#00000011B
  73.                         MOV                P0,A
  74.                         LCALL        DELAY1
  75.                         MOV                A,HOUR                ;顯示小時
  76.                         MOV                B,#10
  77.                         DIV                AB
  78.                         MOVC        A,@A+DPTR
  79.                         MOV                P0,A
  80.                         MOV P1,#00000000B
  81.                         LCALL        DELAY1
  82.                         MOV                A,B
  83.                         MOVC        A,@A+DPTR
  84.                         MOV                P0,A
  85.                         MOV P1,#00000001B
  86.                         LCALL        DELAY1
  87.                         RET
  88. TABLE:                 DB 3FH,06H,5BH,4FH
  89.                         DB 66H,6DH,7DH,07H
  90.                         DB 7FH,6FH
  91. ;*****************DS18B20***********************
  92. ;*****************DS18B20***********************
  93. ;*****************DS18B20***********************
  94. DS18B20:        MOV TEMPER_NUM,A
  95.                         MOV TEMPER_L,#00
  96.                         MOV TEMPER_H,#00
  97.                         ACALL INIT_1820
  98.                         ACALL TEMPER
  99.                         RET

  100. TEMPER:         ACALL RE_CONFIG
  101.                         ACALL GET_TEMPER
  102.                         ACALL TEMPER_COV
  103.                         ACALL DISPLAY
  104.                         RET

  105. INIT_1820:         SETB DQ                        ;初始化程序
  106.                         NOP
  107.                         CLR DQ       ;主機發(fā)出延時540us的復(fù)位低脈沖
  108.                         MOV R0,#36
  109.                         LCALL DELAY
  110.                         SETB DQ      ;然后拉高數(shù)據(jù)線
  111.                         NOP
  112.                         NOP
  113.                         MOV R0,#36
  114. TSR2:                 JNB DQ,TSR3     ;等待DS18B20的回應(yīng)
  115.                         DJNZ R0,TSR2
  116.                         LJMP TSR4;     延時
  117. TSR3:                SETB FLAG1;     置標志位,表示DS1820存在
  118.                         LJMP TSR5
  119. TSR4:                CLR FLAG1;      清標志位,表示DS1820不存在
  120.                         LJMP TSR7
  121. TSR5:                MOV R0,#06BH;   200us
  122. TSR6:                DJNZ R0,TSR6;    復(fù)位成功!時序要求延時一段時間
  123. TSR7:                SETB DQ
  124.                         RET
  125.                        
  126. ; 重新寫DS18B20暫存存儲器設(shè)定值
  127. RE_CONFIG: JB FLAG1,RE_CONFIG1; 若DS18B20存在,轉(zhuǎn)RE_CONFIG1
  128.            RET
  129. RE_CONFIG1:MOV A,#0CCH;  發(fā)SKIP ROM命令
  130.            LCALL WRITE_1820
  131.            MOV A,#4EH;  發(fā)寫暫存存儲器命令
  132.            LCALL WRITE_1820
  133.            MOV A,#00H;  不 TH(報警上限)中寫入00H
  134.            LCALL WRITE_1820
  135.            MOV A,#00H;   TL(報警下限)中寫入00H
  136.            LCALL WRITE_1820
  137.            MOV A,#1FH;   選擇9位溫度分辨率
  138.            LCALL WRITE_1820
  139.            RET

  140. ; 讀出轉(zhuǎn)換后的溫度值
  141. GET_TEMPER: SETB DQ; 定時入口
  142.             LCALL INIT_1820
  143.             JB FLAG1,TSS2
  144.             RET; 若DS18B20不存在則返回
  145. TSS2:       MOV A,#0CCH; 跳過ROM匹配
  146.             LCALL WRITE_1820
  147.             MOV A,#44H; 發(fā)出溫度轉(zhuǎn)換命令
  148.             LCALL WRITE_1820
  149.             MOV R0,#50;等待A/D轉(zhuǎn)換結(jié)束,12位的話750us
  150.             LCALL DELAY
  151.             LCALL INIT_1820
  152.             MOV A,#0CCH; 跳過ROM匹配
  153.             LCALL WRITE_1820
  154.             MOV A,#0BEH; 發(fā)出讀溫度命令
  155.             LCALL WRITE_1820
  156.             LCALL READ_18200
  157.             MOV TEMPER_NUM,A; 將讀出的溫度數(shù)據(jù)保存
  158.             RET
  159.                        
  160. ; 讀DS18B20的程序,從DS18B20中讀出一個字節(jié)的數(shù)據(jù)
  161. READ_1820:         MOV R2,#8
  162. RE1:                 CLR C
  163.             SETB  DQ
  164.             NOP
  165.             NOP
  166.             CLR DQ
  167.             NOP
  168.             NOP
  169.             NOP
  170.             SETB DQ
  171.             MOV R3,#7
  172.             DJNZ R3,$
  173.             MOV C,DQ
  174.             MOV R3,#23
  175.             DJNZ R3,$
  176.             RRC A
  177.             DJNZ R2,RE1
  178.             RET
  179.                        
  180. ; 寫DS18B20的程序                       
  181. WRITE_1820: MOV R2,#8
  182.             CLR C
  183. WR1:                 CLR DQ
  184.             MOV R3,#6
  185.             DJNZ R3,$
  186.             RRC A
  187.             MOV DQ,C
  188.             MOV R3,#23
  189.             DJNZ R3,$
  190.             SETB DQ
  191.             NOP
  192.             DJNZ R2,WR1
  193.             SETB DQ
  194.             RET
  195.                        
  196. ; 讀DS18B20的程序,從DS18B20中讀出兩個字節(jié)的溫度數(shù)據(jù)
  197. READ_18200:        MOV R4,#2; 將溫度高位和低位從DS18B20中讀出
  198.             MOV R1,#36H; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
  199. RE00:                MOV R2,#8
  200. RE01:                CLR C
  201.             SETB DQ
  202.             NOP
  203.             NOP
  204.             CLR DQ
  205.             NOP
  206.             NOP
  207.             NOP
  208.             SETB DQ
  209.             MOV R3,#7
  210.             DJNZ R3,$
  211.             MOV C,DQ
  212.             MOV R3,#23
  213.             DJNZ R3,$
  214.             RRC A
  215.             DJNZ R2,RE01
  216.             MOV @R1,A
  217.             DEC R1
  218.             DJNZ R4,RE00
  219.             RET
  220.                        
  221. ; 將從DS18B20中讀出的溫度數(shù)據(jù)進行轉(zhuǎn)換
  222. TEMPER_COV: MOV A,#0F0H
  223.             ANL A,TEMPER_L; 舍去溫度低位中小數(shù)點后的四位溫度數(shù)值
  224.             SWAP A
  225.             MOV TEMPER_NUM,A
  226.             MOV A,TEMPER_L
  227.             JNB ACC.3,TEMPER_COV1; 四舍五入去溫度值
  228.             INC TEMPER_NUM
  229. TEMPER_COV1:MOV A,TEMPER_H
  230.             ANL A,#07H
  231.             SWAP A
  232.             ORL A,TEMPER_NUM
  233.             MOV TEMPER_NUM,A; 保存變換后的溫度數(shù)據(jù)
  234.             LCALL BIN_BCD
  235.             RET
  236. ; 將16進制的溫度數(shù)據(jù)轉(zhuǎn)換成壓縮BCD碼
  237. BIN_BCD:         MOV DPTR,#TEMP_TAB
  238.             MOV A,TEMPER_NUM
  239.             MOVC A,@A+DPTR
  240.             MOV TEMPER_NUM,A
  241.                         RET
  242. TEMP_TAB:        DB 00H,01H,02H,03H,04H,05H,06H,07H
  243.             DB 08H,09H,10H,11H,12H,13H,14H,15H
  244.             DB 16H,17H,18H,19H,20H,21H,22H,23H
  245.             DB 24H,25H,26H,27H,28H,29H,30H,31H
  246.             DB 32H,33H,34H,35H,36H,37H,38H,39H
  247.             DB 40H,41H,42H,43H,44H,45H,46H,47H
  248.             DB 48H,49H,50H,51H,52H,53H,54H,55H
  249.             DB 56H,57H,58H,59H,60H,61H,62H,63H
  250.             DB 64H,65H,66H,67H,68H,69H,70H,71H
  251.                         DB 72H,73H,74H,75H,76H,77H,78H,79H
  252.             DB 80H,81H,82H,83H,84H,85H,86H,87H
  253.             DB 88H,89H,90H,91H,92H,93H,94H,95H
  254.             DB 96H,97H,98H,99H
  255.                                
  256. T2_10:      MOV B,#16
  257.             DIV AB
  258.             MOV SJSW,A;SJSW中存放溫度的十位數(shù)
  259.             MOV SJGW,B;SJGW中存放溫度的個位數(shù)
  260.             RET
  261.     DISPLAY:PUSH ACC              ;保存ACC
  262.             PUSH PSW
  263.             MOV A, TEMPER_NUM
  264.             LCALL T2_10
  265.                          
  266.             MOV A, SJGW
  267.             MOV DPTR,# XSTAB     ;取得數(shù)據(jù)
  268.             MOVC A, @A+DPTR     ;提取字模
  269.             MOV P0,A              ;顯示溫度的個位數(shù)
  270.                    SETB P1.0
  271.                         CLR P1.1
  272.                         CLR P1.2
  273.             ACALL DS1MS         ;調(diào)用顯示1ms延時程序
  274.             
  275.             MOV A,SJSW
  276.             MOVC A, @A+DPTR    ;提取字模
  277.             MOV P0,A             ;顯示溫度的十位數(shù)
  278.                    CLR P1.0
  279.                         CLR P1.1
  280.                         CLR P1.2
  281.             CALL DS1MS           ;顯示1ms
  282.             
  283.             POP PSW
  284.             POP ACC              ;出棧
  285.             RET                  ;返回調(diào)用
  286. XSTAB:                 DB 3FH,06H,5BH,4FH
  287.             DB 66H,6DH,7DH,07H
  288.             DB 7FH,6FH,77H,7CH
  289.                 DB 39H,5EH,79H,71H
  290. ;//*****************************************//
  291.                        
  292.                        
  293.                        


  294. SCAN_KEY:
  295.                         MOV P2,#0EH
  296.                         MOV A,P2
  297.                         ANL A,#0EH
  298.                         XRL A,#0EH
  299.                         JZ NO_KEY
  300.                         ACALL DELAY1
  301.                         MOV P2,#0EH
  302.                         MOV A,P2
  303.                         ANL A,#0EH
  304.                         XRL A,#0EH
  305.                         JZ NO_KEY
  306.                         MOV R2,#11011111B
  307. SCAN:                MOV A,R2
  308.                         MOV P2,A
  309.                         MOV A,P2
  310.                         ANL A,#00001110B
  311.                         MOV R3,A
  312.                         CJNE A,#0EH,KEY_PRSD
  313.                         MOV A,R2
  314.                         RL A
  315.                         MOV R2,A
  316.                         XRL A,#11111110B
  317.                         JNZ SCAN
  318. NO_KEY:                MOV KEY,#0FFH
  319.                         RET
  320. KEY_PRSD:        MOV A,R2
  321.                         ANL A,#11100000B
  322.                         ORL A,R3
  323.                         MOV R4,A
  324.                         MOV KEY,#00H
  325.                         MOV DPTR,#KEY_TAB
  326. CAL_VAL:        MOV A,KEY
  327.                         MOVC A,@A+DPTR
  328.                         XRL A,R4
  329.                         JZ FIXED
  330.                         INC KEY
  331.                         SJMP CAL_VAL
  332. FIXED:                MOV A,P2
  333.                         ANL A,#0EH
  334.                         XRL A,#0EH
  335.                         JNZ FIXED
  336.                         ACALL DELAY1
  337.                         MOV A,P2
  338.                         ANL A,#0EH
  339.                         XRL A,#0EH
  340.                         JNZ FIXED                       
  341. KEY_TAB:        DB 66H,6AH,6CH,0A6H,0AAH,0ACH,0C6H,0CAH,0CCH


  342. ;延時1ms
  343. DELAY1:                MOV        R6,#10
  344. D10:                MOV        R7,#100
  345.                         DJNZ        R7,$
  346.                         DJNZ        R6,D10
  347.                         RET
  348. DS1MS:                 MOV R1,#10
  349. DSLLO:                 MOV R2,#100
  350.             DJNZ R2,$
  351.             DJNZ R1,DSLLO
  352.             RET                  ;延時返回

  353.                                
  354. DELAY:
  355. LOOP:                MOV R1,#06H
  356. LOOP1:                DJNZ R1,LOOP1
  357.                         DJNZ R0,LOOP
  358.                         RET

  359. ;500毫秒延時子程序
  360. DELAY500:        MOV R4,#248
  361. DA222:                MOV R5,#248
  362.             DJNZ R5,$
  363.             DJNZ R4,DA222
  364.             RET
  365. ;顯示程序
  366. ;*********************主函數(shù)*********************
  367. MAIN:                CLR                DIS_FLAG
  368.                         MOV                DPTR,#TABLE
  369.                         MOV                HOUR,#0                                                ;初始化
  370.                         MOV                MINUTE,#0
  371.                         MOV                SECOND,#0
  372.                         MOV                TCNT,#0
  373.                         MOV                TMOD,#01H
  374.                         MOV                TH0,#(65536-50000)/256                ;定時50毫秒
  375.                         MOV                TL0,#(65536-50000);MOD 256
  376.                         MOV                IE,#82H
  377.                         SETB        TR0
  378.                         ACALL        DS18B20
  379. MAIN_LOOP:        ACALL        SCAN_KEY
  380.                         MOV                R0,KEY
  381.                        
  382. ;按鍵處理程序,所有的都加載這下面
  383.                         CJNE        R0,#0FFH,NEXT0
  384.                         AJMP        NEXT10
  385.                        
  386. NEXT0:                CJNE        R0,#0,NEXT1
  387.                         CPL                DIS_FLAG
  388.                         AJMP        NEXT10
  389.                        
  390. NEXT1:                CJNE        R0,#1,NEXT2
  391.                         INC                HOUR
  392.                         MOV                A,HOUR
  393.                         CJNE        A,#24,BACK1       
  394.                         MOV                HOUR,#0
  395. BACK1:                AJMP        NEXT10
  396.                        
  397. NEXT2:                CJNE        R0,#2,NEXT3
  398.                         INC                MINUTE
  399.                         MOV                A,MINUTE
  400.                         CJNE        A,#60,BACK2
  401.                         MOV                MINUTE,#0
  402. BACK2:                AJMP        NEXT10
  403.                        
  404. NEXT3:                CJNE        R0,#3,NEXT4

  405. NEXT4:                CJNE        R0,#4,NEXT5

  406. NEXT5:                CJNE        R0,#5,NEXT6

  407. NEXT6:                CJNE        R0,#6,NEXT7

  408. NEXT7:                CJNE        R0,#7,NEXT8

  409. NEXT8:                CJNE        R0,#8,NEXT9

  410. NEXT9:                CJNE        R0,#9,NEXT10


  411. NEXT10:                JB                DIS_FLAG,TEM;什么都沒按下
  412.                         ACALL        DISPLAY1;顯示時間
  413.                         AJMP        MAIN_LOOP
  414. TEM:                ACALL        TEMPER        ;顯示溫度
  415.                         AJMP        MAIN_LOOP
  416.                         END
復(fù)制代碼

程序51hei提供下載:
溫度+時間程序模板.zip (33.57 KB, 下載次數(shù): 23)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:763147 發(fā)表于 2020-5-28 15:51 | 顯示全部樓層
這相當于一個框架,只需要在框架內(nèi)加入自己的程序就可以,有較好的擴展性
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表