DS18B20 칩을 사용하여 51 마이크로 컨트롤러로 구현된 온도 제어 프로그램을 찾고 있습니다.
AT89S51 마이크로컨트롤러를 기반으로 한 디지털 온도 측정 및 디스플레이 시스템 설계
프로그램
DI EQU P3.3
DO EQU P3.4
CLK EQU P3.5
CS EQU P3.6, LCD 포트 정의
D2RS EQU P2.7
D2RW EQU P2 .6
D2E EQU P2.5
KEYPORT EQU P1; 포트 정의
TEMPER_L EQU 36H
TEMPER_H EQU 35H p> p>
TEMPER_NUM EQU 38H
FLAG1 BIT 00H
DQ BIT P2.4
ORG 0000H
LJMP MAIN p>
ORG 0003H
JMP INT00
ORG 0038H
MAIN: MOV SP,#60H
SETB P2 .0
SETB P2.1
SETB P2.2
SETB EA
SETB EX0
SETB P2.0
SEETB P2.1
SETB P2.2
MOV R0,#01H ;화면을 지우고 주소 카운터 AC를 0으로 설정합니다
LCALL DIS_CMD _WRT
MOV R0,#38H ;8비트 데이터 인터페이스, 이중 라인 디스플레이, 5*7 도트 매트릭스
LCALL DIS_CMD _WRT
CALL DIS_CUR_OFF
MOV 42H,#20
MOV 43H,#32
XIAN: LCALL GET_TEMPER
LCALL DISP
LCALL DELAY43MS
MOV A,TEMPER_NUM
SUBB A,42H
JC ZZZL
MOV A, TEMPER_NUM
SUBB A,43H
JNC ZZZ2
SETB P2.0
SETB P2.1
SETB P2.2
JMP XIAN
ZZZL: CLR P2.0
CLR P2.2
JMP XIAN
ZZZ2: CLR P2.0
CLR P2.1
JMP XIAN
INT0:
;키보드 프로그램 스캔
LCALL ASK
SAO: CLR 01H
LCALL KEY
JNB 01H,SAO
CJNE A,#10,PAN
LCALL ANSW
RETI
PAN: CJNE A,#12,SAO
RETI; 호출 가능한 표시 기능 부분
DIS_CUR_OFF: MOV R0,#0CH
LCALL DIS_CMD_WRT
RET
DIS_CUR_ON: MOV R0, #0EH
LCALL DIS_CMD_WRT
RET
CHK_BUSY_FLG: MOV P0,#0FFH
CLR D2RS
NOP
NOP
NOP
LCALL DISPLAY_RD
JB ACC.7,CHK_BUSY_FLG
RET
CLEAR_DIS: MOV R0,#01H
LCALL DIS_CMD_WRT
RET
DIS_CMD_WRT: LCALL CHK_BUSY_FLG
MOV P0,R0
CLR D2RS
NOP
NOP
NOP
LCALL DISPLAY_WRT
RET
DIS_DATA_WRT: LCALL CHK_BUSY_FLG
CJNE A,#10H,DIS_DAT_WRT1
MOV P0,#0C0H ;라인 1100,00000의 시작 주소는 40입니다.
CLR D2RS
NOP
NOP
NOP
LCALL DISPLAY_WRT
DIS_DAT_WRT1: MOV P0 , R0
D2RS 설정
NOP
NOP
NOP
LCALL DISPLAY_WRT
RET
DISPLAY_WRT: CLR D2RW
NOP
NOP
NOP
SETB D2E
안돼
안돼
안돼
CLR D2E
NOP
NOP
NOP
RET
DISPLAY_RD: SETB D2RW
아니요
아니요
아니요
D2E 설정
아니요
아니요
NOP
MOV A,P0
NOP
NOP
NOP
CLR D2E
NOP
NOP
NOP
RET
DIS_DATA_RD: LCALL CHK_BUSY_FLG
MOV P0,# 0FFH
SETB D2RS
LCALL DISPLAY_RD
RET ;키보드 프로그램, 내보내기: A는 키 값입니다. 01H: 0 키를 누르지 않았습니다. 1 키를 눌렀습니다.< /p >
키: MOV KEYPORT,#0FH
MOV A,KEYPOR
CJNE A,#0FH,KEYDOWN
MOV A,#0FFH
p>RET
키다운: LCALL DELAY43MS
MOV KEYPORT,#0FH
MOV A,KEYPORT
CJNE A, #0FH,KEYDOWN_YES
MOV A,#0FFH
RET
KEYDOWN _YES: MOV B,A
MOV 키포트, #0F0H
MOV A,KEYPORT
ORL A,B
PUSH 30H
MOV 30H,A
MOV R3,#10H
MOV DPTR,#KEYVALUE
NEXT_KEY: MOV A,R3
MOVC A,@a+dptr
CJNE A,30h,NEXTKEYVALUE
DEC R3
POP 30H
WAITKEY_F: MOV KEYPORT,#0FH
MOV A, KEYPORT
CJNE A,#0FH, WAITKEY_F
MOV A,R3
SETB 01H
RET
NEXTKEYVALUE: DJNZ R3,NEXT_KEY
12월 R3
POP 30H
WAITKEY_FREE: MOV KEYPORT,#0FH
MOV A,KEYPORT
CJNE A,#0FH, WAITKEY_FREE
MOV A,R3
SETB 01H
RET
키값: DB 0FFH,7EH,7DH,7BH,77H,0BEH, 0BDH,0BBH,0B7H,0DEH,0DDH,0DBH,0D7H,0EEH,0EDH,0EBH,0E7H
DELAY43MS: A 푸시
MOV A,R3
푸시 A
MOV A,R2
푸시 A
MOV R3,#43
지연: MOV R2,#0FAH
p>LOOP: NOP; 내부 루프는 1MS
NOP
DJNZ R2, LOOP
DJNZ R3, DELAY
POP A
MOV R2,A
POP A
MOV R3,A
POP A
RET ;온도 설정 수정 여부 확인
ASK: MOV R0,#01H ;화면을 지우고 주소 카운터 AC를 0으로 설정
LCALL DIS_CMD_WRT
MOV 40H ,#0
ZDZ: MOV DPTR,#LINE
MOV A,40H
MOVC A,@A+DPTR
MOV R0,A
LCALL DIS_DATA_WRT
INC 40H
MOV A,40H
MOVC A,@A+DPTR p>
CJNE A,#00H,ZDZ
RET
라인: DB " 정말로
T(Y/N)를 변경하시겠습니까?" ,00H
답변: MOV R6,42H
MOV R7,43H
MOV R0,#01H
LCALL DIS_CMD_WRT
MOV R0,#44H
CALL DIS_DATA_WRT
MOV R0,#6FH
CALL DIS_DATA_WRT
MOV R0,# 77H
DIS_DATA_WRT 호출
MOV R0,#6EH
DIS_DATA_WRT 호출
MOV R0,#3AH
DIS_DATA_WRT 호출
MOV 40H,#0
CLR 00H
JMP SAO1
GAI: MOV R0,#0FEH
DIS_DATA_WRT 호출
MOV R0,#55H
DIS_DATA_WRT 호출
MOV R0,#70H
CALL DIS_DATA_WRT
MOV R0,#3AH
CALL DIS_DATA_WRT
MOV 40H,#0
SAO1: CLR 01H
LCALL 키
JNB 01H,SAO1
MOV R1,A
MOV B,#10
DIV AB
JZ NEXT2
MOV A,A1
CJNE A,#11, XU
JB 00H,DOWN
MOV 42H,40H
CPL 00H
JMP GAI
DOWN: MOV 43H,40H
RETI
XU: CJNE A,#12,SAO1
MOV 42H,R6
MOV 43H,R7
RETI
NEXT2: MOV A,R1
ADD A,#30H
MOV R0,A
LCALL DIS_DATA_WRT
MOV A,R1
XCH A,40H
MOV B,#10
MUL AB
NOP
CLR DQ
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RR
R4, #2 R1, #36H; 낮은 비트는 36H(TEMPER_L)에 저장되고, 높은 비트는 35H(TEMPER_
NOP
NOP
<에 저장됩니다. p> SETB DQ p>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에서 읽은 온도 데이터를 변환합니다.
TEMPER_COV: MOV A,#0f0H
ANL A ,TEMPER_L ; 저온 자리 소수점 이하 4자리 온도 값을 버립니다.
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
p>SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A 변환된 온도 데이터 저장
RET ;
SETB DI
SETB DO
SETB CLK
CLR CS
NOP
SETB CS
CLR CLK
CLR CS
CALL DELAY1
SETB DI
세트 CLK
NOP
CLR CLK
세트 DI
세트 CLK
NOP
CLR
CLK
CLR DI
SETB CLK
NOP
CLR CLK
NOP
설정 CLK
NOP
해제 CLK
해제
설정 CLK
MOV C,DO p>
CLR CLK
RLC A;7
SETB CLK
MOV C,DO
CLR CLK
RLC A 6
SETB CLK
MOV C,DO
CLR CLK
RLC A ;5
SETB CLK
MOV C,DO
CLR CLK
RLC A ;4
SETB CLK
MOV C,DO
CLR CLK
RLC A ;3
SETB CLK
MOV C,DO
CLR CLK
RLC A ;2
SETB CLK
MOV C,DO
CLR CLK
RLC A ;1
SETB CLK
MOV C,DO
CLR CLK
RLC A ;0
세트 CLK
NOP
CLR CLK ;1
NOP
세트 CLK
NOP
CLR CLK ;2
NOP
SETB CLK
NOP
CLR CLK ;3
NOP
SETB CLK
NOP
CLK ;4
NOP
SETB CLK
NOP
CLR CLK ;5
NOP
SETB CLK
NOP
CLR CLK ;6
NOP
SETB CLK
NOP
CLR CLK ;7
NOP
세트 클클
NOP
CLR CLK
NOP
세트 CLK
NOP
CLR CLK
NOP
통화 지연1
SETB CS
RET
DELAY1: MOV R7,#10
DELAY2: NOP
NOP
DJNZ R7,DELAY2
RET