?? 51_asm_dht21.asm
字號:
;*********************************************;
; DHT21使用范例
;單片機 : AT89S52或 STC89C52RC
;功能 ; 串口發(fā)送溫濕度數(shù)據(jù) 波特率 9600
;硬件連接: P2.0口為通訊口連接DHT11,DHT11的電源和
; 地連接單片機的電源和地,單片機串口加
; MAX232連接電腦
;公司 ; 廣州奧松電子
;*********************************************;
;--------------------
;----變量定義區(qū)------
;--------------------
FLAG EQU 30H
U8comdata EQU 31H
U8T_data_H EQU 32H
U8T_data_L EQU 33H
U8RH_data_H EQU 34H
U8RH_data_L EQU 35H
U8checkdata EQU 36H
U8temp EQU 37H
temp EQU 38H
;--------------------
;--------------------
;--------------------
ORG 0000H
AJMP START
ORG 0023H
AJMP SET_INT
START:
MOV P0,#0FFH
MOV TMOD,#20H ;T1工作方式2
MOV TH1,#0FDH ;串口波特率為9600
MOV SCON,#50H ;串口工作于方式1并允許接受
SETB TR1 ;啟動T1
SETB ES ;允許串口中斷
SETB EA ;允許全部外設(shè)中斷
MAIN:
;---------------------------
;-----調(diào)用濕度讀取子程序----
;---------------------------
LCALL RH
;---------------------------
;------串口發(fā)送程序 --------
;---------------------------
TT:
MOV A,U8RH_data_H
LCALL TX_DATA
MOV A,U8RH_data_L
LCALL TX_DATA
MOV A,U8T_data_H
LCALL TX_DATA
MOV A,U8T_data_L
LCALL TX_DATA
MOV A,U8checkdata
LCALL TX_DATA
;--------延時兩秒------------
LCALL Delay_2S
LJMP MAIN
;--------------------------------
;-----濕度讀取子程序 ------------
;--------------------------------
;----以下變量均為全局變量--------
;----溫度高8位== U8T_data_H------
;----溫度低8位== U8T_data_L------
;----濕度高8位== U8RH_data_H-----
;----濕度低8位== U8RH_data_L-----
;----校驗 8位 == U8checkdata-----
;----調(diào)用相關(guān)子程序如下----------
;---- Read,Delay_10us , Delay
;--------------------------------
RH:
;----主機拉低總線,延時500us
CLR P2.0
MOV A,#36
LCALL Delay
SETB P2.0
;----延時40us
LCALL Delay_10us
LCALL Delay_10us
LCALL Delay_10us
LCALL Delay_10us
;-----檢測從機是否響應,無響應則跳出
JB P2.0,RH_END
MOV FLAG,#0
LOOP1:
INC FLAG
MOV A,FLAG
JB P2.0,LOOP1_END ;為高電平則跳出
CJNE A,#0,LOOP1
LJMP RH_END
LOOP1_END:
MOV FLAG,#0
LOOP2:
INC FLAG
MOV A,FLAG
JNB P2.0,LOOP2_END ;為低電平則跳出
CJNE A,#0,LOOP2
LJMP RH_END
LOOP2_END:
;------進入數(shù)據(jù)接收階段
LCALL Read
MOV U8RH_data_H,U8comdata;
LCALL Read
MOV U8RH_data_L,U8comdata;
LCALL Read
MOV U8T_data_H,U8comdata;
LCALL Read
MOV U8T_data_L,U8comdata;
LCALL Read
MOV U8checkdata,U8comdata;
SETB P2.0
;----------------------------------------------------------------------------
;----注意:本程序沒有加校驗程序 如果用戶需要校驗請安以下說明編寫校驗程序-----
;----------------------------------------------------------------------------
; 數(shù)據(jù)傳送正確時校驗和U8checkdata的值等于
; "8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)"所得結(jié)果的末8位
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
RH_END:
RET
;--------------------------------
;---------讀數(shù)子程序-------------
;--------------------------------
Read:
MOV temp,#8
MOV U8comdata,#0
LOOP_COM:
;判斷低電平是否結(jié)束
MOV FLAG,#0
LOOP3:
INC FLAG
MOV A,FLAG
JB P2.0,LOOP3_END ;為高電平則跳出
CJNE A,#0,LOOP3
LJMP COM_END
LOOP3_END:
;----------------------
; CLR P2.1
; SETB P2.1
;----------------------
LCALL Delay_10us
LCALL Delay_10us
LCALL Delay_10us
;----------------------
; CLR P2.1
; SETB P2.1
;----------------------
MOV U8temp,#0
JNB P2.0,HIGH_END
MOV U8temp,#1
HIGH_END:
MOV FLAG,#0
LOOP4:
INC FLAG
MOV A,FLAG
JNB P2.0,LOOP4_END ;為低電平則跳出
CJNE A,#0,LOOP4
LJMP COM_END
LOOP4_END:
MOV A,FLAG
CJNE A,#0,NO_FLAG
LJMP COM_END
NO_FLAG:
MOV A,U8comdata
RL A
ORL A,U8temp
MOV U8comdata,A
;--------判斷高電平是否結(jié)束
DJNZ temp,LOOP_COM
COM_END:
RET
;--------------------------------
;------延時函數(shù) -----------------
;--------------------------------
Delay: MOV R4,A ;2.5ms
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,D1
RET
;--------------------------------
;------延時10us函數(shù) -----------------
;--------------------------------
Delay_10us: ;10us
NOP
NOP
NOP
NOP
NOP
NOP
RET
;--------------------------------
;------延時2S函數(shù) -----------------
;--------------------------------
Delay_2S:
MOV A,#250
LCALL Delay
MOV A,#250
LCALL Delay
MOV A,#250
LCALL Delay
MOV A,#250
LCALL Delay
MOV A,#250
LCALL Delay
MOV A,#250
LCALL Delay
MOV A,#250
LCALL Delay
MOV A,#250
LCALL Delay
RET
;--------------------------------
;------串口數(shù)據(jù)發(fā)送函數(shù) ---------
;--------------------------------
TX_DATA:
CLR ES ;禁止串口中斷
MOV SBUF,A
JNB TI,$
CLR TI ;將同一數(shù)據(jù)發(fā)送到串口
SETB ES ;允許串口中斷
RET
;--------------------------------
;------串口中斷函數(shù) -------------
;--------------------------------
SET_INT:
CLR ES ;禁止串口中斷
JNB RI,$
CLR RI
MOV A,SBUF ;接受串口數(shù)據(jù)
MOV P0,A ;將串口數(shù)據(jù)送往P0
MOV SBUF,A
JNB TI,$
CLR TI ;將同一數(shù)據(jù)發(fā)送到串口
SETB ES ;允許串口中斷
RETI
END
;--------------------------------
;----------結(jié)束------------------
;--------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -