PIC16F877A+18B10溫度測量+LCD1602顯示溫度
;18B10溫度測量+LCD1602顯示溫度
;實戰(zhàn)目的
;1、學習18B20單總線溫度傳感器的使用。
;2、學習LCD的使用。
;3、學習10進制轉10進制的方法。
;所有資源:
;1、TMRO定時器。產(chǎn)生溫度轉換所需要的延時時間。
;2、PORTA口。即做LCD顯示時可控制端口,RA2同時做18B20的數(shù)據(jù)接口
;3、PORTC口。做LCD顯示時的數(shù)據(jù)口。
;功能說明
;1、通過18B20采集當前環(huán)境
;最高溫度可顯示127.9375,最低溫度可顯示0.0625(無負溫度處理部分)
;2、將溫度在LCD上顯示(3位整數(shù),4位小數(shù))
;硬件連接
;1,在18B20按DEMO板上的標識插在插座U8上
;2,撥碼開關S13第4位置ON
;3,其他所有撥碼開關都置OFF
;源程序如下:
LIST P=PIC16F877
TITLE="LCD DISPLAY"
ERRORLEVEl -302 ;去掉編譯時的302號提示信息
;__CONFIG B'000010010101' ;代碼保護開啟;WRT_ENABLE;CPD_ENABLE;LVP_DISABLE;BODEN_ENABLE
;PWRTE_ENABLE;WDT_ENABLE;OSC_XT
;*****************以下是暫存器的定義*****************************
#INCLUDE
#DEFINE RS PORTA,1 ;LCD控制信號
#DEFINE RW PORTA,2 ;LCD控制信號
#DEFINE E PORTA,3 ;LCD控制信號
#DEFINE DAT PORTC ;LCD數(shù)據(jù)線
#DEFINE DQ PORTA,2 ;18B20數(shù)據(jù)口
CBLOCK 20H
DQ_DELAY1
DQ_DELAY2
TEMP
TEMP1
TEMP2 ;存放采樣到的溫度值
COUNT
COUNT1
ENDC
TMR0_VALUE EQU 0AH ;寄存器初值為6,預分頻比1:4,中斷一次時間為4*(256-6)=1000us
DQ_DELAY_VALUE1 EQU 0FAH
DQ_DELAY_VALUE2 EQU 4H
;***********************以下是宏定義****************************
READ_STATE MACRO ;讀18B20的狀態(tài)
BCF RS
BSF RW
BSF E
ENDM
WRITE_COMMAND MACRO ;寫命令
BCF RS
BCF RW
BCF E
ENDM
WRITE_DATA MACRO ;寫數(shù)據(jù)
BSF RS
BCF RW
BCF E
ENDM
;**********************以下是程序的開始************************
ORG 00H
NOP
GOTO MAIN ;入口地址
ORG 04H
RETFIE ;在中斷入口出放置一條中斷返回指令,防止干擾產(chǎn)生中斷
;***************************主程序*******************************
MAIN
CLRF PORTC
CLRF PORTA
BANKSEL TRISA
CLRF TRISA ;A口所有先設置為輸出
CLRF TRISC
MOVLW 01H
MOVWF OPTION_REG ;分頻比1:4,定時器,內(nèi)部時鐘源
MOVLW 06H
MOVWF ADCON1 ;關閉所有A/D口
BCF STATUS,RP0
MOVLW 00H
MOVWF INTCON ;關閉所有中斷,且同時清零T0IF
CLRF TEMP
CLRF TEMP1
CLRF TEMP2 ;清零臨時寄存器
;****************************循環(huán)處理部分************************
;先啟動18B20溫度轉換程序,在判斷溫度轉換是否完成(需750us)
;未完成則調(diào)用顯示子程序,直到完成溫度轉換
;完成后讀取溫度值
;送LCD顯示
LOOP
CALL RESET_18B20 ;調(diào)用復位18B20子程序
MOVLW 0CCH
MOVWF TEMP
CALL WRITE_18B20 ;SKIP ROM命令
MOVLW 44H
MOVWF TEMP
CALL WRITE_18B20 ;溫度轉換命令
CLRF STATUS
BCF INTCON,T0IF
CALL DELAY_750MS ;調(diào)用溫度轉換所需要的750MS延時
NOP
CALL RESET_18B20
MOVLW 0CCH
MOVWF TEMP
CALL WRITE_18B20 ;SKIP ROM命令
MOVLW 0BEH
MOVWF TEMP
CALL WRITE_18B20 ;讀溫度命令
CALL READ_18B20 ;調(diào)用讀溫度低字節(jié)
MOVFW TEMP
MOVWF TEMP1 ;保存到TEMP1
CALL READ_18B20 ;調(diào)用讀溫度高字節(jié)
MOVFW TEMP
MOVWF TEMP2 ;保存到TMEP2
CALL RESET_18B20
CALL TEMP_CHANGE ;調(diào)用溫度轉換程序
CALL DISPLAY ;調(diào)用LCD顯示程序
GOTO LOOP ;循環(huán)工作
;***************************LCD顯示子程序************************
DISPLAY
;LCD模塊初始化,由廠家提供的資料顯示,其初始化過程為:
;6----寫指令38H,此條指令是將LCD顯示模塊設置為8位數(shù)據(jù)線,雙行,5X7點陣顯示
;7----檢測Busy信號;
;8----寫指令08H,關閉顯示
;9----檢測Busy信號;
;10---寫指令01H,顯示清屏
;以后寫入光標等的控制指令.
BANKSEL TRISA
CLRF TRISA ;A口為LCD控制信號,全輸出
BANKSEL PORTA
NOP
MOVLW 38H
CALL COMMAND_WRITE ;顯示模式設置:16*2顯示,5*7點陣,8位數(shù)碼接口
MOVLW 08H
CALL COMMAND_WRITE ;顯示關閉,不顯示光標
MOVLW 01H
CALL COMMAND_WRITE ;顯示清屏
MOVLW 06H
CALL COMMAND_WRITE ;顯示光標移動設置(右移),整屏顯示不移動
MOVLW 0CH
CALL COMMAND_WRITE ;顯示開及光標設置,不顯示光標
DISPLAY0
MOVLW 84H
CALL COMMAND_WRITE ;設置顯示起始位置
CALL BUSY ;判忙
MOVLW 8H ;共8個數(shù)據(jù)需要顯示
MOVWF COUNT
MOVLW 37H ;取數(shù)地址
MOVWF FSR
DISPLAY1
INCF FSR,1 ;取數(shù)地址加1
MOVFW INDF
CALL DATA_WRITE ;調(diào)用寫數(shù)據(jù)子程序
DECFSZ COUNT,1
GOTO DISPLAY1
RETURN