本文為通過51單片機(jī)進(jìn)行DS18B20的溫度采集,在6位數(shù)碼管上顯示時(shí)間與溫度,并通過掃描方式輸入9位按鍵,已封裝好了各個(gè)按鍵的功能區(qū)。
1.jpg (99.75 KB, 下載次數(shù): 25)
下載附件
2020-5-28 15:46 上傳
右側(cè)為設(shè)定溫度,可通過按鍵進(jìn)行設(shè)置,左側(cè)27為檢測(cè)溫度,為DS18B20實(shí)測(cè)數(shù)據(jù)
23.jpg (96.37 KB, 下載次數(shù): 27)
下載附件
2020-5-28 15:49 上傳
時(shí)間顯示,為2時(shí)3分13秒,各個(gè)時(shí)間也可通過按鍵設(shè)置
程序內(nèi)有詳細(xì)注釋
單片機(jī)源程序如下:
- ;*************************************************
- ;***************溫度時(shí)間顯示模板.HUI**************
- ;*************************************************
- KEY EQU 40H ;存放鍵值
- SECOND EQU 37H
- MINUTE EQU 38H
- HOUR EQU 32H
- TCNT EQU 34H ;時(shí)間計(jì)數(shù)
- FLAG1 BIT 00H ; FLAG1:標(biāo)志位,為"1"時(shí)表示檢測(cè)到DS18B20
- TEMPER_NUM EQU 50H ; TEMPER_NUM:保存讀出的溫度數(shù)據(jù)
- TEMPER_L EQU 36H ;溫度的低位
- TEMPER_H EQU 35H ;溫度的高位
- TEMP EQU 34H ;臨時(shí)存放溫度數(shù)據(jù)的單元
- SJGW EQU 30H ;存放顯示溫度的個(gè)位數(shù)
- SJSW EQU 31H ;存放顯示溫度的十位數(shù)
- DQ BIT P1.3 ;DQ:DS18B20的數(shù)據(jù)總線接腳
- DIS_FLAG BIT 01H ;顯示標(biāo)志,為1時(shí)顯示溫度
- ORG 00H
- AJMP MAIN
- ORG 0BH
- LJMP INT_T0
-
-
- ;*********************子程序*********************
- ;**************中斷子程序************************
- INT_T0: PUSH ACC
- PUSH PSW
- MOV TH0,#(65536-50000)/256
- MOV TL0,#(65536-50000);MOD 256
- INC TCNT
- MOV A,TCNT
- CJNE A,#20,RETUNE ;計(jì)時(shí)1秒
- INC SECOND
- MOV TCNT,#0
- MOV A,SECOND
- CJNE A,#60,RETUNE
- INC MINUTE
- MOV SECOND,#0
- MOV A,MINUTE
- CJNE A,#60,RETUNE
- INC HOUR
- MOV MINUTE,#0
- MOV A,HOUR
- CJNE A,#24,RETUNE
- MOV HOUR,#0
- RETUNE: POP PSW
- POP ACC
- RETI
- ;*****************顯示子程序*********************
- DISPLAY1: MOV A,SECOND ;顯示秒
- MOV B,#10
- DIV AB
- MOV DPTR,#TABLE
- MOVC A,@A+DPTR
- MOV P1,#00000100B
- MOV P0,A
- LCALL DELAY1
- MOV A,B
- MOVC A,@A+DPTR
- MOV P1,#00000101B
- MOV P0,A
- LCALL DELAY1
- MOV A,MINUTE ;顯示分鐘
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR
- MOV P1,#00000010B
- MOV P0,A
- LCALL DELAY1
- MOV A,B
- MOVC A,@A+DPTR
- MOV P1,#00000011B
- MOV P0,A
- LCALL DELAY1
- MOV A,HOUR ;顯示小時(shí)
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR
- MOV P0,A
- MOV P1,#00000000B
- LCALL DELAY1
- MOV A,B
- MOVC A,@A+DPTR
- MOV P0,A
- MOV P1,#00000001B
- LCALL DELAY1
- RET
- TABLE: DB 3FH,06H,5BH,4FH
- DB 66H,6DH,7DH,07H
- DB 7FH,6FH
- ;*****************DS18B20***********************
- ;*****************DS18B20***********************
- ;*****************DS18B20***********************
- DS18B20: MOV TEMPER_NUM,A
- MOV TEMPER_L,#00
- MOV TEMPER_H,#00
- ACALL INIT_1820
- ACALL TEMPER
- RET
- TEMPER: ACALL RE_CONFIG
- ACALL GET_TEMPER
- ACALL TEMPER_COV
- ACALL DISPLAY
- RET
- INIT_1820: SETB DQ ;初始化程序
- NOP
- CLR DQ ;主機(jī)發(fā)出延時(shí)540us的復(fù)位低脈沖
- MOV R0,#36
- LCALL DELAY
- SETB DQ ;然后拉高數(shù)據(jù)線
- NOP
- NOP
- MOV R0,#36
- TSR2: JNB DQ,TSR3 ;等待DS18B20的回應(yīng)
- DJNZ R0,TSR2
- LJMP TSR4; 延時(shí)
- TSR3: SETB FLAG1; 置標(biāo)志位,表示DS1820存在
- LJMP TSR5
- TSR4: CLR FLAG1; 清標(biāo)志位,表示DS1820不存在
- LJMP TSR7
- TSR5: MOV R0,#06BH; 200us
- TSR6: DJNZ R0,TSR6; 復(fù)位成功!時(shí)序要求延時(shí)一段時(shí)間
- TSR7: SETB DQ
- RET
-
- ; 重新寫DS18B20暫存存儲(chǔ)器設(shè)定值
- RE_CONFIG: JB FLAG1,RE_CONFIG1; 若DS18B20存在,轉(zhuǎn)RE_CONFIG1
- RET
- RE_CONFIG1:MOV A,#0CCH; 發(fā)SKIP ROM命令
- LCALL WRITE_1820
- MOV A,#4EH; 發(fā)寫暫存存儲(chǔ)器命令
- LCALL WRITE_1820
- MOV A,#00H; 不 TH(報(bào)警上限)中寫入00H
- LCALL WRITE_1820
- MOV A,#00H; TL(報(bào)警下限)中寫入00H
- LCALL WRITE_1820
- MOV A,#1FH; 選擇9位溫度分辨率
- LCALL WRITE_1820
- RET
- ; 讀出轉(zhuǎn)換后的溫度值
- GET_TEMPER: SETB DQ; 定時(shí)入口
- LCALL INIT_1820
- JB FLAG1,TSS2
- RET; 若DS18B20不存在則返回
- TSS2: MOV A,#0CCH; 跳過ROM匹配
- LCALL WRITE_1820
- MOV A,#44H; 發(fā)出溫度轉(zhuǎn)換命令
- LCALL WRITE_1820
- MOV R0,#50;等待A/D轉(zhuǎn)換結(jié)束,12位的話750us
- LCALL DELAY
- LCALL INIT_1820
- MOV A,#0CCH; 跳過ROM匹配
- LCALL WRITE_1820
- MOV A,#0BEH; 發(fā)出讀溫度命令
- LCALL WRITE_1820
- LCALL READ_18200
- MOV TEMPER_NUM,A; 將讀出的溫度數(shù)據(jù)保存
- RET
-
- ; 讀DS18B20的程序,從DS18B20中讀出一個(gè)字節(jié)的數(shù)據(jù)
- READ_1820: MOV R2,#8
- RE1: CLR C
- SETB DQ
- NOP
- NOP
- CLR DQ
- NOP
- NOP
- NOP
- SETB DQ
- MOV R3,#7
- DJNZ R3,$
- MOV C,DQ
- MOV R3,#23
- DJNZ R3,$
- RRC A
- DJNZ R2,RE1
- RET
-
- ; 寫DS18B20的程序
- WRITE_1820: MOV R2,#8
- CLR C
- WR1: CLR DQ
- MOV R3,#6
- DJNZ R3,$
- RRC A
- MOV DQ,C
- MOV R3,#23
- DJNZ R3,$
- SETB DQ
- NOP
- DJNZ R2,WR1
- SETB DQ
- RET
-
- ; 讀DS18B20的程序,從DS18B20中讀出兩個(gè)字節(jié)的溫度數(shù)據(jù)
- READ_18200: MOV R4,#2; 將溫度高位和低位從DS18B20中讀出
- MOV R1,#36H; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
- RE00: MOV R2,#8
- RE01: CLR C
- SETB DQ
- NOP
- NOP
- CLR DQ
- NOP
- NOP
- NOP
- SETB DQ
- MOV R3,#7
- DJNZ R3,$
- MOV C,DQ
- MOV R3,#23
- DJNZ R3,$
- RRC A
- DJNZ R2,RE01
- MOV @R1,A
- DEC R1
- DJNZ R4,RE00
- RET
-
- ; 將從DS18B20中讀出的溫度數(shù)據(jù)進(jìn)行轉(zhuǎn)換
- TEMPER_COV: MOV A,#0F0H
- ANL A,TEMPER_L; 舍去溫度低位中小數(shù)點(diǎn)后的四位溫度數(shù)值
- SWAP A
- MOV TEMPER_NUM,A
- MOV A,TEMPER_L
- JNB ACC.3,TEMPER_COV1; 四舍五入去溫度值
- INC TEMPER_NUM
- TEMPER_COV1:MOV A,TEMPER_H
- ANL A,#07H
- SWAP A
- ORL A,TEMPER_NUM
- MOV TEMPER_NUM,A; 保存變換后的溫度數(shù)據(jù)
- LCALL BIN_BCD
- RET
- ; 將16進(jìn)制的溫度數(shù)據(jù)轉(zhuǎn)換成壓縮BCD碼
- BIN_BCD: MOV DPTR,#TEMP_TAB
- MOV A,TEMPER_NUM
- MOVC A,@A+DPTR
- MOV TEMPER_NUM,A
- RET
- TEMP_TAB: DB 00H,01H,02H,03H,04H,05H,06H,07H
- DB 08H,09H,10H,11H,12H,13H,14H,15H
- DB 16H,17H,18H,19H,20H,21H,22H,23H
- DB 24H,25H,26H,27H,28H,29H,30H,31H
- DB 32H,33H,34H,35H,36H,37H,38H,39H
- DB 40H,41H,42H,43H,44H,45H,46H,47H
- DB 48H,49H,50H,51H,52H,53H,54H,55H
- DB 56H,57H,58H,59H,60H,61H,62H,63H
- DB 64H,65H,66H,67H,68H,69H,70H,71H
- DB 72H,73H,74H,75H,76H,77H,78H,79H
- DB 80H,81H,82H,83H,84H,85H,86H,87H
- DB 88H,89H,90H,91H,92H,93H,94H,95H
- DB 96H,97H,98H,99H
-
- T2_10: MOV B,#16
- DIV AB
- MOV SJSW,A;SJSW中存放溫度的十位數(shù)
- MOV SJGW,B;SJGW中存放溫度的個(gè)位數(shù)
- RET
- DISPLAY:PUSH ACC ;保存ACC
- PUSH PSW
- MOV A, TEMPER_NUM
- LCALL T2_10
-
- MOV A, SJGW
- MOV DPTR,# XSTAB ;取得數(shù)據(jù)
- MOVC A, @A+DPTR ;提取字模
- MOV P0,A ;顯示溫度的個(gè)位數(shù)
- SETB P1.0
- CLR P1.1
- CLR P1.2
- ACALL DS1MS ;調(diào)用顯示1ms延時(shí)程序
-
- MOV A,SJSW
- MOVC A, @A+DPTR ;提取字模
- MOV P0,A ;顯示溫度的十位數(shù)
- CLR P1.0
- CLR P1.1
- CLR P1.2
- CALL DS1MS ;顯示1ms
-
- POP PSW
- POP ACC ;出棧
- RET ;返回調(diào)用
- XSTAB: DB 3FH,06H,5BH,4FH
- DB 66H,6DH,7DH,07H
- DB 7FH,6FH,77H,7CH
- DB 39H,5EH,79H,71H
- ;//*****************************************//
-
-
-
- SCAN_KEY:
- MOV P2,#0EH
- MOV A,P2
- ANL A,#0EH
- XRL A,#0EH
- JZ NO_KEY
- ACALL DELAY1
- MOV P2,#0EH
- MOV A,P2
- ANL A,#0EH
- XRL A,#0EH
- JZ NO_KEY
- MOV R2,#11011111B
- SCAN: MOV A,R2
- MOV P2,A
- MOV A,P2
- ANL A,#00001110B
- MOV R3,A
- CJNE A,#0EH,KEY_PRSD
- MOV A,R2
- RL A
- MOV R2,A
- XRL A,#11111110B
- JNZ SCAN
- NO_KEY: MOV KEY,#0FFH
- RET
- KEY_PRSD: MOV A,R2
- ANL A,#11100000B
- ORL A,R3
- MOV R4,A
- MOV KEY,#00H
- MOV DPTR,#KEY_TAB
- CAL_VAL: MOV A,KEY
- MOVC A,@A+DPTR
- XRL A,R4
- JZ FIXED
- INC KEY
- SJMP CAL_VAL
- FIXED: MOV A,P2
- ANL A,#0EH
- XRL A,#0EH
- JNZ FIXED
- ACALL DELAY1
- MOV A,P2
- ANL A,#0EH
- XRL A,#0EH
- JNZ FIXED
- KEY_TAB: DB 66H,6AH,6CH,0A6H,0AAH,0ACH,0C6H,0CAH,0CCH
- ;延時(shí)1ms
- DELAY1: MOV R6,#10
- D10: MOV R7,#100
- DJNZ R7,$
- DJNZ R6,D10
- RET
- DS1MS: MOV R1,#10
- DSLLO: MOV R2,#100
- DJNZ R2,$
- DJNZ R1,DSLLO
- RET ;延時(shí)返回
-
- DELAY:
- LOOP: MOV R1,#06H
- LOOP1: DJNZ R1,LOOP1
- DJNZ R0,LOOP
- RET
- ;500毫秒延時(shí)子程序
- DELAY500: MOV R4,#248
- DA222: MOV R5,#248
- DJNZ R5,$
- DJNZ R4,DA222
- RET
- ;顯示程序
- ;*********************主函數(shù)*********************
- MAIN: CLR DIS_FLAG
- MOV DPTR,#TABLE
- MOV HOUR,#0 ;初始化
- MOV MINUTE,#0
- MOV SECOND,#0
- MOV TCNT,#0
- MOV TMOD,#01H
- MOV TH0,#(65536-50000)/256 ;定時(shí)50毫秒
- MOV TL0,#(65536-50000);MOD 256
- MOV IE,#82H
- SETB TR0
- ACALL DS18B20
- MAIN_LOOP: ACALL SCAN_KEY
- MOV R0,KEY
-
- ;按鍵處理程序,所有的都加載這下面
- CJNE R0,#0FFH,NEXT0
- AJMP NEXT10
-
- NEXT0: CJNE R0,#0,NEXT1
- CPL DIS_FLAG
- AJMP NEXT10
-
- NEXT1: CJNE R0,#1,NEXT2
- INC HOUR
- MOV A,HOUR
- CJNE A,#24,BACK1
- MOV HOUR,#0
- BACK1: AJMP NEXT10
-
- NEXT2: CJNE R0,#2,NEXT3
- INC MINUTE
- MOV A,MINUTE
- CJNE A,#60,BACK2
- MOV MINUTE,#0
- BACK2: AJMP NEXT10
-
- NEXT3: CJNE R0,#3,NEXT4
- NEXT4: CJNE R0,#4,NEXT5
- NEXT5: CJNE R0,#5,NEXT6
- NEXT6: CJNE R0,#6,NEXT7
- NEXT7: CJNE R0,#7,NEXT8
- NEXT8: CJNE R0,#8,NEXT9
- NEXT9: CJNE R0,#9,NEXT10
- NEXT10: JB DIS_FLAG,TEM;什么都沒按下
- ACALL DISPLAY1;顯示時(shí)間
- AJMP MAIN_LOOP
- TEM: ACALL TEMPER ;顯示溫度
- AJMP MAIN_LOOP
- END
復(fù)制代碼
程序51hei提供下載:
溫度+時(shí)間程序模板.zip
(33.57 KB, 下載次數(shù): 23)
2020-5-28 15:50 上傳
點(diǎn)擊文件名下載附件
注意:匯編 下載積分: 黑幣 -5
|