?? 28.asm
字號:
;------------------------------------------------------------------------------------------
;DS18B20實時溫度檢測實驗參考程序(實驗28.asm)
;------------------------------------------------------------------------------------------
LIST P=16F877
INCLUDE"P16F877.INC"
;------------------------------------------------------------------------------------------ ;計數器
FSR_TEP EQU 69H ;FSR保護緩沖器
INF_TEP EQU 6AH ;INDF保護緩沖器
ORG 0000
NOP
BSF STATUS,5 ;轉到體1
CLRF TRISD ;置D口方向控制字
MOVLW B'00010000' ;
MOVWF TRISC ;置C口方向控制字
CLRF SSPSTAT ;清除SMP、CKE位
BCF STATUS,5 ;轉回體0
MOVLW B'00110010' ;設置SSP控制方式:取FOSC/64、SPI主控、CKP=1
MOVWF SSPCON
CLRF PORTD ;D口數據清0
CALL CHUSHIHUA ;調用顯示初始化子程序
TEMPER CLRF 2AH ;清除溫度數據低位存放寄存器
CLRF 2BH ;清除溫度數據高位存放寄存器
CALL INIT18B20 ;調用DS18B20初始化子程序
GOTO GET_TEMPER ;轉跳至獲取溫度子程序
END_TEMP MOVF 2AH,0 ;將溫度數據低位轉入寄存器28H保存
MOVWF 28H
MOVF 2BH,0 ;將溫度數據高位轉入寄存器29H保存
MOVWF 29H
CALL DISPLAY ;調用顯示數據轉換子程序
GOTO TEMPER ;轉跳至溫度檢測程序進行溫度的循環實時檢測
DISPLAY CLRF 20H ;清轉換寄存器
CLRF 21H
CLRF 22H
CLRF 23H
MOVLW 0FH
ANDWF 28H,0 ;采用與方式屏蔽高4位
MOVWF 23H ;取溫度數據低字節中低4位放寄存器23H的低4位
MOVLW 0F0H ;
ANDWF 28H,0 ;采用與方式屏蔽低4位
MOVWF 22H ;取溫度數據低字節中高4位放寄存器22H的高4位
MOVLW 07H
ANDWF 29H,0 ;采用與方式屏蔽低3位
ADDWF 22H,1 ;取溫度數據高字節中低3位放22H低3位,此時bit3=0
SWAPF 22H,1 ;寄存器22H中高4位與低4位互換
MOVF 22H,0
MOVWF PORTD ;將寄存器22H數據送D口顯示
MOVWF S1L ;將寄存器22H數據送S1L
CLRF S1H
CALL BINTOBCD ;調用二進制轉十進制子程序
MOVF R1H,W
MOVWF 38H
MOVF R1Z,W
ANDLW 0FH
MOVWF 38H
MOVF R1L,W
ANDLW 0FH
MOVWF 60H
SWAPF R1L,W
ANDLW 0FH
MOVWF 61H
CALL XSHI
RETLW 0 ;這段程序與之后的有沖突
MOVLW 0F8H
ANDWF 29H,0 ;采用與方式判斷溫度高字節中高5位為全0還是全1
BTFSC STATUS,2 ;判斷狀態寄存器Z位
GOTO TO10 ;全0,直接進行數據的十進制轉換
COMF 22H ;全1,將22H,23H溫度數據取反加1
COMF 23H
INCF 23H,1
BTFSC STATUS,2 ;判斷兩字節溫度數據的低字節是否有向高字節進位
INCF 22H ;是,高字節進位
BCF 22H,7 ;否,將22H中bit7始終置為0
BSF 23H,7 ;置1表示此溫度數據為負數
TO10 CLRF 20H ;將22H中的二進制數轉成十進制,表示溫度的整數部分
CLRF 21H ;清楚轉換寄存器
L0 MOVLW 0AH ;個位轉換f22=f22-10
SUBWF 22H,0
BTFSS STATUS, 0 ;判斷是否減為0
GOTO L10 ;是,轉入十位轉換
MOVWF 22H ;否,將余數存入22H
INCF 21H,1 ;十位加1
GOTO L0
L10 MOVLW 0AH ;十位轉換f21=f21-10
SUBWF 21H,0
BTFSS STATUS, 0 ;判斷是否減為0
GOTO L100 ;是,轉入百位轉換
MOVWF 21H ;否,將余數存入21H
INCF 20H,1 ;百位加1
GOTO L10
L100 BTFSS 23,7 ;判斷溫度正負值
GOTO L1000 ;GOTO L1000;正
MOVF 21, 1 ;負
BTFSS STATUS, 2 ;判十位為0?
GOTO $+4 ;21H不等于0
MOVLW 0AH ;21H等于0十位顯示負號
MOVWF 21
GOTO $+3 ;轉換完畢返回
MOVLW 0AH ;f11不等于0百位顯示負號
MOVWF 20
L1000 RETURN ;轉換完畢返回
INIT18B20 NOP
BSF STATUS,RP0 ;轉到體1
BCF TRISC,7 ;置C口Bit7方向位
BCF STATUS,RP0 ;返回體0
BSF PORTC,7 ;C口Bit7置1
NOP
BCF PORTC,7 ;等待1uS,復位Bit7,發送復位脈沖
MOVLW D'200' ;軟件延時600uS
MOVWF 24H
DECFSZ 24H,1
GOTO $-1
BSF STATUS,RP0 ;置C口Bit7為輸入方式
BSF TRISC,7
BCF STATUS,RP0
RECHECK MOVLW D'20' ;器件響應子程序, 軟件延時60uS
MOVWF 24H
BTFSS PORTC,7 ;延時期間檢測C口Bit7數據
GOTO $+4 ;0,由于上拉電阻使線路常為1,當器件有響應則為0
DECFSZ 24H,1 ;1,進入軟件延時
GOTO $-3
GOTO INIT18B20 ;延時結束,重新進入器件初始化
MOVLW D'80' ;器件有響應,軟件延時240uS
MOVWF 24H
DECFSZ 24H,1
GOTO $-1
BTFSS PORTC,7 ;在240uS后檢測總線是否為高電平
GOTO RECHECK ;若為低電平,重新檢測響應脈沖
RETLW 0 ;檢測到器件響應的存在脈沖
GET_TEMPER
CALL INIT18B20 ;調用器件初始化子程序
MOVLW 0CCH ;發送命令代碼0CCH,針對在線DS18B20操作
CALL WRITEY ;調用寫數據子程序
MOVLW 44H ;發送命令代碼44H,啟動在線DS10B20做溫度A/D轉換
CALL WRITEY ;調用寫數據子程序
MOVLW D'200' ;軟件延時1S以便DS10B20做溫度A/D轉換
MOVWF 26H
S1 MOVLW D'20'
MOVWF 24H
MOVLW D'100'
MOVWF 25H
DECFSZ 25H,1
GOTO $-1
DECFSZ 24H,1
GOTO $-5
DECFSZ 26H,1
GOTO S1
NOP ; DS10B20做溫度A/D轉換完成
CALL INIT18B20 ;調用器件初始化
MOVLW 0CCH ;發送命令代碼0CCH,針對在線DS18B20操作
CALL WRITEY ;調用寫數據子程序
MOVLW 0BEH ;發送命令代碼0BEH,讀取溫度寄存器的溫度值
CALL WRITEY ;調用寫數據子程序
CALL READY ;調用讀數據子程序
GOTO END_TEMP ;轉跳至溫度檢測完畢
WRITEY MOVWF 2DH ;將命令代碼存入發送寄存器2DH
MOVLW 08H ;然后釋放總線,延時2μs。
MOVWF 25H ;發送數據位個數計數器存放08H
BSF STATUS,RP0 ;每次調用結束都會把口置為輸入方式
BSF TRISC,7 ;因此此處不需要置方向
BCF STATUS,RP0
WR1BY NOP
BSF STATUS,RP0 ;將C口Bit7轉為輸出方式
BCF TRISC,7
BCF STATUS,RP0
BCF PORTC,7 ;總線輸出低電平
BTFSC 2DH,0 ;判斷發送寄存器2DH的Bit0
GOTO $+2 ;Bit=1
GOTO $+4 ;Bit=0
BSF STATUS,RP0 ;1,釋放總線,置C口Bit7方向位為輸入
BSF TRISC,7
BCF STATUS,RP0
MOVLW D'40' ;軟件延時60uS
MOVWF 26H
DECFSZ 26H,1
GOTO $-1
BSF STATUS,RP0 ;釋放總線,置C口Bit7方向位為輸入
BSF TRISC,7
BCF STATUS,RP0
RRF 2DH,1 ;將發送寄存器數據右移一位
DECFSZ 25H,1 ;判斷發送完畢?
GOTO WR1BY ;繼續發送其他位的數據
RRF 2DH,1 ;將狀態位C回復原位
RETLW 0 ;帶參數調用返回
READY MOVLW 02H
MOVWF 24H ;讀入字節個數計數器存放02H;然后進入輸入模式延時10μs,
BSF STATUS,RP0 ;釋放總線,置C口Bit7方向位為輸入
BSF TRISC,7
BCF STATUS,RP0
R1BYTE MOVLW 08H
MOVWF 25H ;讀入數據位個數計數器存放08H
R1BIT BSF STATUS,RP0 ;置C口Bit7方向位為輸出
BCF TRISC,7
BCF STATUS,RP0
BCF PORTC,7 ;總線輸出0
NOP ;延時2uS
BSF STATUS,RP0 ;釋放總線,置C口Bit7方向位為輸入
BSF TRISC,7
BCF STATUS,RP0
NOP ;軟件延時10uS
MOVLW 01H
MOVWF 26H
DECFSZ 26H,1
GOTO $-1
BTFSC PORTC,7 ;讀取總線狀態,判斷0? 1?
GOTO $+3 ;
BCF 2BH,0 ;0,置接收寄存器Bit0=0
GOTO $+2
BSF 2BH,0 ;1,置接收寄存器Bit0=1
NOP ;軟件延時60uS
NOP
MOVLW D'20'
MOVWF 26H
DECFSZ 26H,1
GOTO $-1
RRF 2BH,1 ;將接收寄存器數據右移一位
DECFSZ 25H,1 ;判斷一個字節8位是否接收完
GOTO R1BIT ;接收其他位數據
RRF 2BH,1 ;狀態位C回復原位
DECF 24H,1 ;字節計數器減1
BTFSC STATUS,2 ;判斷兩字節數據是否接收完畢
GOTO $+4
MOVF 2BH,0 ;0,將溫度數據的低字節存入2AH
MOVWF 2AH
GOTO R1BYTE ;讀下一字節數據
RETLW 0 ;讀取溫度數據結束返回
;------------------------------------------------------------------------------------------
;編碼查詢
;------------------------------------------------------------------------------------------
BMA ADDWF PCL,F
RETLW 3FH ;"0" 編碼
RETLW 06H ;"1" 編碼
RETLW 5BH ;"2" 編碼
RETLW 4FH ;"3" 編碼
RETLW 66H ;"4" 編碼
RETLW 6DH ;"5" 編碼
RETLW 7DH ;"6" 編碼
RETLW 07H ;"7" 編碼
RETLW 7FH ;"8" 編碼
RETLW 6FH ;"9" 編碼
RETLW 00H ;"暗" 編碼
RETLW 40H ;"-" 編碼
;------------------------------------------------------------------------------------------
;顯示驅動子程序
;------------------------------------------------------------------------------------------
XSHI MOVLW 67H ;設置顯示緩沖器的數據地址
MOVWF FSR
LOOP MOVF INDF,W ;取出數據
CALL BMA ;查詢對應編碼
CALL OUTXSH ;利用SPI方式輸出編碼數據
DECF FSR
BTFSS FSR,4 ;直到8位數碼全部輸出
GOTO LOOP
RETURN
;------------------------------------------------------------------------------------------
;SPI方式輸出編碼數據子程序
;------------------------------------------------------------------------------------------
OUTXSH MOVWF SSPBUF ;送至SSPBUF后開始逐位發送
LOOP1 BSF STATUS,RP0 ;選擇體1
BTFSS SSPSTAT,BF ;是否發送完畢
GOTO LOOP1 ;否,繼續查詢
BCF STATUS,RP0 ;發送完畢,選擇體0
MOVF SSPBUF,W ;移空SSPBUF
RETURN
;------------------------------------------------------------------------------------------
;8位數碼全暗,僅僅最高位給出"-"鍵控提示符
;------------------------------------------------------------------------------------------
SHUAN MOVLW 60H ;除最高位外,均設置為全暗
MOVWF FSR
TUN MOVLW 0AH
MOVWF INDF
INCF FSR
BTFSS FSR,3
GOTO TUN
MOVLW 0BH ;最高位67H單元送"-"編碼
MOVWF 67H
RETURN
;------------------------------------------------------------------------------------------
;初始化子程序(67H-60H緩沖存儲器分別賦值01-07),從數碼最高位67H開始點亮,延時196MS
;------------------------------------------------------------------------------------------
CHUSHIHUA
CALL SHUAN ;首先調用數碼全暗設置
CALL XSHI ;輸出顯示
CALL DELAY10MS ;調用10MS延時
CALL DELAY10MS ;調用10MS延時
CALL DELAY10MS ;調用10MS延時
MOVLW 67H
MOVWF FSR ;從最高位賦值,采用間接尋址
MOVLW 01H
MOVWF COUNTER ;給出賦值數據,從1開始
QT MOVF COUNTER,W
MOVWF INDF
MOVF FSR,W
MOVWF FSR_TEP ;保護FSR
CALL XSHI ;數碼刷新
CALL DELAY10MS ;調用10MS延時
CALL DELAY10MS ;調用10MS延時
CALL DELAY10MS ;調用10MS延時
MOVF FSR_TEP,W ;恢復FSR
MOVWF FSR
DECF FSR ;地址減1
INCF COUNTER ;賦值數據加1
BTFSS COUNTER,3 ;8位賦值是否結束
GOTO QT ;否,繼續
MOVF COUNTER,W ;已結束
MOVWF INDF ;最高為設置"-"監控狀態標志
CALL XSHI ;數碼顯示刷新
CALL DELAY10MS ;調用10MS延時
CALL DELAY10MS ;調用10MS延時
CALL DELAY10MS ;調用10MS延時
CALL SHUAN ;進入監控狀態
CALL XSHI ;數碼顯示刷新
RETURN
;------------------------------------------------------------------------------------------
;10MS軟件延時子程序DELAY10MS
;------------------------------------------------------------------------------------------
DELLAY10MS
MOVLW 0DH ;外循環常數
MOVWF 20H ;外循環寄存器
LOP1 MOVLW 0FFH ;內循環常數
MOVWF 21H ;內循環寄存器
LOP2 DECFSZ 21H ;內循環寄存器遞減
GOTO LOP2 ;繼續內循環
DECFSZ 20H ;外循環寄存器遞減
GOTO LOP1 ;繼續外循環
RETURN ;子程序返回
;------------------------------------------------------------------------------------------
;二進制到BCD碼轉換子程序
;------------------------------------------------------------------------------------------
BINTOBCD MOVLW 10H
MOVWF COUNT
CLRF R1H
CLRF R1Z
CLRF R1L
LOP RLF S1L
RLF S1H
RLF R1L
RLF R1Z
RLF R1H
DECFSZ COUNT
GOTO ADJDET
RETLW 00H
ADJDET MOVLW R1L
MOVWF FSR
CALL ADJBCD
MOVLW R1Z
MOVWF FSR
CALL ADJBCD
MOVLW R1H
MOVWF FSR
CALL ADJBCD
GOTO LOP
ADJBCD MOVLW 03H
ADDWF INDF,W
MOVWF TEMP
BTFSC TEMP,3
MOVWF INDF
MOVLW 30H
ADDWF INDF,W
MOVWF TEMP
BTFSC TEMP,7
MOVWF INDF
RETLW 00H
;------------------------------------------------------------------------------------------
;10MS軟件延時子程序DELAY10MS
;------------------------------------------------------------------------------------------
DELAY10MS
MOVLW 0DH ;外循環常數
MOVWF 20H ;外循環寄存器
LP1 MOVLW 0FFH ;內循環常數
MOVWF 21H ;內循環寄存器
LP2 DECFSZ 21H ;內循環寄存器遞減
GOTO LP2 ;繼續內循環
DECFSZ 20H ;外循環寄存器遞減
GOTO LP1 ;繼續外循環
RETURN ;子程序返回
;------------------------------------------------------------------------------------------
END
;------------------------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -