|
數字式溫度計實驗(18B20、ZLG7290)
- ; **************主程序(MAIN.ASM)***********************
- ; 向DS18B20發出溫度轉換信號,延時等待,讀出溫度;將溫度值由十六進制轉換成十進制數,使用8155控制LED顯示溫度
- TEMPER_L EQU 29H ;用于保存讀出溫度的低8位
- TEMPER_H EQU 28H ;用于保存讀出溫度的高8位
- TIAO_H EQU 27H ;用于保存設定溫度的數據
- ;FLAG1 EQU 38H ;是否檢測到DS18B20標志位
- buffer EQU 35H ;溫度臨時存放區
- ;a_bit EQU 20H ;數碼管個位數存放內存位置
- ;b_bit EQU 21H ;數碼管十位數存放內存位置
- SL EQU 22H ;設定溫度時數碼管個位數存放內存位置
- SH EQU 23H ;設定溫度時數碼管十位數存放內存位置
- sdwd EQU 24H ;設定溫度壓縮BCD碼位
- DQ BIT P3.0 ;數據輸入/輸出端
- ORG 0000H
- AJMP MAIN0
- ORG 0100H
- MAIN0: MOV SP,#70H
- MOV A,#89H ; ;8155方式控制字0DH(A、C口輸出,B口輸入)送累加器A
- MOV DPTR,#0F003H
- MOVX @DPTR,A
- MOV sdwd, #25H ;設定初始溫度37度,上電后內部設定溫度
- MAIN1: LCALL BH_DISBCD
- LCALL KEY
- JNB 00H,MAIN1
- CLR 00H
- MAIN2: LCALL START_Temperature ;向DS18B20發送讀溫度指令
- LCALL DelayTime
- LCALL RD_Temperature ;讀出溫度值,并轉換為BCD碼
- MOV TEMPER_L,B ;溫度個位,小數位數據
- MOV TEMPER_H,A ;溫度十位數據
- ;LCALL DIS_BCD ;提取溫度數據,轉換為非壓縮型BCD碼,并顯示
- LCALL BH_DISBCD
- LCALL KEY
- LCALL TContral
- AJMP MAIN2
- ;**********************************************************
- ; 判斷DS18B20是否存在,啟動DS18B20 ;CY為判斷標志
- START_Temperature: SETB DQ
- ACALL INIT_18B20 ;先復位DS18B20
- JC GET_T0
- MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE_18B20
- MOV A,#44H ;發出溫度轉換命令
- LCALL WRITE_18B20
- CLR C
- GET_T0: RET
- ;***********************************************************
- ; 讀出轉換后的溫度值,保存于:A-高8位數據,B-低8位數據
- RD_Temperature:LCALL INIT_18B20 ;準備讀溫度前先復位
- JC GET_T1
- MOV A,#0CCH ;跳過ROM匹配
- LCALL WRITE_18B20
- MOV A,#0BEH ;發出讀溫度命令
- LCALL WRITE_18B20
- LCALL READ_18B20 ;讀出溫度
- MOV B,A ;存放到A,B中
- LCALL READ_18B20
- GET_T1: RET
- ;***********************************************************
- ; DS18B20溫度轉換/顯示
- DIS_BCD: MOV R0,#buffer+3 ;設置顯示內容存放區首地址
- MOV @R0,#10H ;正數
- MOV A,TEMPER_H
- JNB ACC.3,DIS_BCD1 ;判斷溫度是否為負
- MOV @R0,#11H ;負數
- CPL A
- XCH A,TEMPER_L
- CPL A
- ADD A,#1
- XCH A,TEMPER_L
- ADDC A,#0
- DIS_BCD1: ANL A,#0FH ;將溫度整數位轉換為ASCII
- MOV B,A
- MOV A,TEMPER_L
- ANL A,#0F0H
- ORL A,B ;將溫度的個位與十位BCD合在一起
- SWAP A
- MOV B,#10
- DIV AB
- JNZ DIS_BCD2 ;判斷溫度的十位是否為0進行相應處理
- MOV A,#10H ;十位為0
- XCH A,@R0
- DEC R0
- MOV @R0,A
- SJMP DIS_BCD3
- DIS_BCD2: DEC R0
- MOV @R0,A
- DIS_BCD3: DEC R0
- MOV A,B
- ;ORL A,#80H ;小數點
- MOV @R0,A
- DEC R0
- MOV A,TEMPER_L ;轉換小數部分
- ANL A,#0FH
- MOV B,A
- CLR A
- JNB B.0, DIS_BCD4
- MOV A,#6
- DIS_BCD4: JNB B.1, DIS_BCD5
- ADD A,#12H
- DA A
- DIS_BCD5: JNB B.2, DIS_BCD6
- ADD A,#25H
- DA A
- DIS_BCD6: JNB B.3, DIS_BCD7
- ADD A,#50H
- DA A
- DIS_BCD7: SWAP A
- ANL A,#0FH
- MOV @R0,A
- MOV R0,#buffer+4 ;顯示數據首地址
- MOV @R0,#10H
- INC R0
- MOV @R0,#10H
- INC R0
- MOV @R0,#10H
- INC R0
- MOV @R0,#10H
- MOV R0,#buffer
- LCALL Display
- RET
- ;***********************************************************
- ;DS18B20溫度轉換/顯示
- BH_DISBCD: MOV A,TEMPER_L ;
- MOV C,40H ;將28H中的最低位移入C(28H.0-C)
- RRC A
- MOV C,41H
- RRC A
- MOV C,42H
- RRC A
- MOV C,43H
- RRC A
- MOV TEMPER_L,A ;新字節29H是實際測量的溫度
- LCALL BCDBHDA
- LCALL Display
- RET
- ;***********************************************************
- TContral: CLR C ;比較轉換值與設定值
- MOV 26H,sdwd ;把溫度設定保存到26H單元后減2度,作為低度的數據
- DEC 26H
- MOV A,TEMPER_L
- CJNE A,26H,LOOP1 ;下限設定溫度,不相等跳LOOP1
- LJMP HOTTING ;與下限值相等跳HOTTING,加熱
- LOOP1: JC HOTTING ;溫度小于下限值跳HOTTING,加熱
- MOV A,TEMPER_L ;溫度大于下限值,與上限值比較
- CLR C
- MOV 27H,sdwd
- INC 27H
- CJNE A,27H,LOOP2 ;上限設定溫度,不相等跳LOOP2
- SJMP STOPHOT ;相等跳STOPHOT,停止加熱
- LOOP2: JNC STOPHOT ;溫度大于上限值跳STOPHOT,停止加熱
- SJMP KEEP ;溫度小于上限且大于下限值跳KEEP,保溫
- HOTTING: CLR P1.0 ;小,加熱器驅動
- SETB P1.1 ;關閉保溫燈
- KEEP: SJMP BACK ;返回,保持原態,保溫
- STOPHOT: SETB P1.0 ;關閉加熱器
- CLR P1.1 ;點亮保溫燈
- BACK: RET
- ;***********************************************************
- ;鍵盤響應子程序
- KEY: MOV DPTR,#0F002H
- MOVX A,@DPTR ;讀列線狀態
- ORL A,#0F0H
- CJNE A,#0FFH,NEXT1
- SS: RET
- NEXT1: LCALL D10ms
- MOV DPTR,#0F002H ;指向8255C口
- MOVX A,@DPTR
- ORL A,#0F0H
- CJNE A,#0FFH,NEXT2
- LJMP SS
- NEXT2: MOV R3,#4
- MOV DPTR,#0F002H
- MOV R4,#00H
- MOVX A,@DPTR
- NEXT3: RRC A
- JNC NEXT4
- INC R4
- DJNZ R3,NEXT3
- LJMP SS
- NEXT4: MOVX A,@DPTR ;等待鍵釋放
- ORL A,#0F0H
- CJNE A,#0FFH,NEXT4
- MOV DPTR,#TAB ;指向按鍵轉移指令表首地址
- MOV A,R4
- RL A
- JMP @A+DPTR
- TAB: AJMP KEY0
- AJMP KEY1
- AJMP KEY2
- AJMP KEY3
- ;AJMP KEY4
- ;AJMP KEY5
- ;AJMP KEY6
- ;AJMP KEY7
- ;*********************************
- ;按下KEY0后轉加1程序
- KEY0: MOV R5,#30H
- LCALL Displa
- MOV A,sdwd ;把設定溫度送累加器判斷
- CJNE A,62H,JIA0 ;比較設定溫度是否到99度,不是則加
- MOV sdwd,#00H
- LJMP JIA1
- JIA0: INC sdwd
- JIA1: LCALL Displa
- DJNZ R5,JIA1
- LJMP SS
- ;*************************
- KEY1: MOV R5,#30H
- LCALL Displa
- MOV A,sdwd ;把設定溫度送累加器判斷
- CJNE A,01H,JIAN0 ;比較設定溫度是否到0度,不是則減
- MOV sdwd,#62H
- LJMP JIAN1
- JIAN0:DEC sdwd
- JIAN1:LCALL Displa
- DJNZ R5,JIAN1
- LJMP SS
- ;*************************
- KEY2: SETB 00H
- LJMP SS
- ;*************************
- KEY3: LJMP SS
- ;***********************************************************
- ;DS18B20復位初始化子程序
- INIT_18B20: SETB DQ
- NOP
- CLR DQ ;主機發出501us的復位低脈沖
- MOV R7,#250
- DJNZ R7,$
- SETB DQ ;拉高數據線
- MOV R7,#30
- TSR: JNB DQ,TSR1 ;等待DS18B20回應
- DJNZ R7,TSR
- SETB C ;置位標志位,表示DS18B20不存在
- RET
- TSR1: CLR C ;復位標志位,表示DS18B20存在
- MOV R7,#250
- DJNZ R7,[ DISCUZ_CODE_2 ]nbsp; ;時序要求延時一段時間
- RET
- ;***************************************************************
- ;DS18B20寫操作
- WRITE_18B20: MOV R7,#8 ;一共8位數據
- CLR C
- WRI: NOP
- CLR DQ
- MOV R6,#3
- DJNZ R6,[ DISCUZ_CODE_2 ]nbsp;
- RRC A
- MOV DQ,C
- MOV R6,#26
- DJNZ R6,[ DISCUZ_CODE_2 ]nbsp;
- SETB DQ
- DJNZ R7,WRI
- SETB DQ
- RET
- ;****************************************************************
- ;DS18B20讀操作
- READ_18B20: MOV R7,#8 ;數據一共有8位
- READ1: CLR DQ
- NOP
- NOP
- SETB DQ
- NOP
- MOV R6,#3
- DJNZ R6,[ DISCUZ_CODE_2 ]nbsp;
- MOV C,DQ
- MOV R6,#26
- DJNZ R6,[ DISCUZ_CODE_2 ]nbsp;
- RRC A
- DJNZ R7,READ1
- RET
-
- ;******************************************************************
- BCDBHDA: MOV R0,#buffer
- MOV A,TEMPER_L ;將29H中的十六進制數轉換成10進制
- MOV B,#10 ;10進制/10=10進制
- DIV AB
- MOV @R0,B ;個位在buffer(35H)
- INC R0
- MOV @R0,A ;十位在buffer+1(36H)
- ;*************************
- INC R0
- MOV A,sdwd
- MOV B,#10 ;10進制/10=10進制
- DIV AB
- MOV @R0,B ;個位在buffer+2(37H)
- INC R0
- MOV @R0,A ;十位在buffer+3(38H)
- RET
- ;******************************************************************
- Display: MOV R0,#buffer
- MOV R7,#04H ;----1顯示子程序開始
- MOV R1,#60H ;60H 61H(62H 63H)存放測量(設定)溫度個位、十位段碼
- DISP0: MOV A,@R0
- MOV DPTR,#TABLE
- MOVC A,@A+DPTR
- MOV @R1,A
- INC R0
- INC R1
- DJNZ R7,DISP0
- ;*****************************
- MOV R7,#04H
- MOV R0,#60H
- MOV R3,#0FEH
- DISP1: MOV DPTR,#0F001H ;指定字位碼入口地址:8155的C口
- MOV A,R3
- MOVX @DPTR,A
- RL A
- MOV R3,A
- MOV DPTR,#0F000H ;指定字型碼入口地址:8155的A口
- MOV A,@R0
- MOVX @DPTR,A
- INC R0
- LCALL DELAY
- DJNZ R7,DISP1
- RET ;----1顯示子程序結束
- ;******************************************************************
- ;;閃爍設定顯示
- Displa: MOV A,sdwd
- MOV B,#10 ;10進制/10=10進制
- DIV AB
- MOV SL,B ;十位在b
- MOV SH,A ;個位在a
- MOV R1,#250 ;顯示250次
- dpl2: MOV A,SL ;取設定溫度個位數
- MOV DPTR,#TABLE ;指定查表啟始地址
- MOVC A,@A+DPTR ;查個位數的7段代碼
- MOV DPTR,#0F000H
- MOVX @DPTR,A ;送出個位的7段代碼
- MOV DPTR,#0F001H
- MOV A,#0FBH
- MOVX @DPTR,A ;開個位顯示
- ACALL D1ms ;顯示1ms
- MOV A,#0FFH
- MOVX @DPTR,A
- MOV A,SH ;取設定溫度十位數
- MOV DPTR,#TABLE ;指定查表啟始地址
- MOVC A,@A+DPTR ;查十位數的7段代碼
- MOV DPTR,#0F000H
- MOVX @DPTR,A ;送出十位的7段代碼
- MOV DPTR,#0F001H
- MOV A,#0F7H
- MOVX @DPTR,A ;開十位顯示
- ACALL D1ms ;顯示1ms
- MOV A,#0FFH
- MOVX @DPTR,A
- DJNZ R1,dpl2 ;250次沒完循環
- RET
- TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
- ;******************************************************************
- ;延時程序
- DelayTime: PUSH 07H
- PUSH 06H
- PUSH 05H
- MOV R7,#1
- DelayTime_1: MOV R6,#1
- DelayTime_2: MOV R5,#0
- DJNZ R5,$
- DJNZ R6,DelayTime_2
- DJNZ R7,DelayTime_1
- POP 05H
- POP 06H
- POP 07H
- RET
- ;*************************************************
- DELAY: NOP
- MOV R6,#2 ;----2延時子程序開始
- DEL2: MOV R5,#0FFH
- DEL1: NOP
- NOP
- DJNZ R5, DEL1
- DJNZ R6, DEL2
- RET
- ;*************************************************
- D10ms: MOV R5,#20
- DL: MOV R6,#0FFH
- DL0: DJNZ R6,DL0
- DJNZ R5,DL
- RET
- ;*************************************************
- D1ms: MOV R7,#1
- DJNZ R7,$
- RET
- ;*************************************************
- END
復制代碼
|
|