📄 temperture.asm
字号:
; ---------------------------------------------------------------------------
; Program: " DS18B20"
; Mo ta phan cung: AT89S52 Crystal 11.0592 MHz
;
; ---------------------------------------------------------------------------
; Chu thich:
; BAI TAP LON VI XU LY
; -----------------------------------------------------------------------------
; =======================================================================
; Cac khai bao ban dau
; Cac chan va cong
LCD_DATA EQU P0
LCD_E BIT P1.2
LCD_RW BIT P1.1
LCD_RS BIT P1.0
DQ BIT P1.3
MODE BIT P3.2
UP BIT P2.4
DOWN BIT P2.5
GREEN_LED BIT P3.4
RED_LED BIT P3.5
; Cac bien
T_CHUC EQU 30H
T_DVI EQU 31H
T_LOW EQU 32H
T_HIGH EQU 33H
TH_USER EQU 34H
TL_USER EQU 35H
CONFIG EQU 36H
RESERVED1 EQU 37H
RESERVED2 EQU 38H
RESERVED3 EQU 39H
CRC EQU 3AH
TEMP1 EQU 3BH
TEMP2 EQU 3CH
TEMP3 EQU 45H
TEMP4 EQU 46H
TEST1 EQU 20H
TEST2 EQU 21H
; Cac bit kiem tra trang thai he thong ( nam o thanh ghi 20h)
DS1 BIT 00H
DS2 BIT 01H
DS3 BIT 02H
DS4 BIT 03H
DS5 BIT 08H
DS6 BIT 09H
DS7 BIT 0AH
DS8 BIT 0BH
BLINK BIT 10H
;=========================================================================
; Phan than chuong trinh
ORG 00H
LJMP MAIN
ORG 03H
LJMP INT0ISR
ORG 40H
MAIN:
MOV SP,#80H ; dua con tro Stack toi vi tri 5Fh
SETB EX0 ; cho phep ngat ngoai 0
SETB IT0 ; ngat theo suon xuong
SETB EA ; cho phep ngat toan cuc
SETB BLINK
LCALL LCD_INIT ; khoi tao LCD
LCALL DS_INIT ; khoi tao DS18B20
MOV TEMP2,#20
MOV TEMP1,#20
MAIN_LOOP:
CPL BLINK
LCALL CONVERT_DS1
LCALL CONVERT_DS2
LCALL CONVERT_DS3
LCALL CONVERT_DS4
LCALL DISPLAY
LJMP MAIN_LOOP
;==========================================================================
; CAC HAM SU DUNG TRONG CHUONG TRINH
; Ham cua LCD
; Khoi tao LCD
LCD_INIT:
MOV A,#38H ;init. LCD 2 do`ng, ma tra^.n 5x7
LCALL CSTROBE
MOV A,#0EH ;LCD on, cursor on
LCALL CSTROBE
MOV A,#01H ;clear LCD
LCALL CSTROBE
MOV A,#06H ;cursor di.ch pha?i
LCALL CSTROBE
MOV A,#80H
LCALL CSTROBE
MOV DPTR,#MESSAGE1 ; Hien thi dong chu " T1:" o dong 1
LCALL SEND2LCD
MOV A,#088H
LCALL CSTROBE
MOV DPTR,#MESSAGE4 ; hien thi dong chu " T2:" o dong 2
LCALL SEND2LCD
MOV A,#0C0H
LCALL CSTROBE
MOV DPTR,#MESSAGE5 ; hien thi dong chu " T3:" o dung 3
LCALL SEND2LCD
MOV A,#0C8H
LCALL CSTROBE
MOV DPTR,#MESSAGE6 ; hien thi dong chu " T4:" o dung 4
LCALL SEND2LCD
RET
; Gui 1 lenh vao LCD
CSTROBE: ;command strobe
ACALL READY ;is LCD ready?
MOV LCD_DATA,A ;xua^'t ma~ le^.nh
CLR LCD_RS ;RS=0: le^.nh
CLR LCD_RW ;R/W=0 -> ghi ra LCD
SETB LCD_E ;E=1 -> ta.o ca.nh xuo^'ng
CLR LCD_E ;E=0 ,cho^'t
RET
; Gui 1 ki tu vao LCD
DSTROBE: ;data strobe
ACALL READY ;is LCD ready?
MOV LCD_DATA,A ;xua^'t du+~ lie^.u
SETB LCD_RS ;RS=1 for data
CLR LCD_RW ;R/W=0 to write to LCD
SETB LCD_E ;E=1 -> tao canh xuong
CLR LCD_E ;E=0, cho^'t
RET
; kie^?m tra co+` BF
READY: SETB LCD_DATA.7 ;LCD_DATA.7: input
CLR LCD_RS ;RS=0: thanh ghi le^.nh
SETB LCD_RW ;R/W=1: ddo.c
BACK: CLR LCD_E ;E=0 -> ta.o ca.nh le^n
SETB LCD_E ;E=1
JB LCD_DATA.7,BACK ;cho+` busy flag=0
RET
SEND2LCD: ; gui 1 chuoi ki tu den LCD
CLR A
MOVC A,@A+DPTR
JZ EXIT_SEND
LCALL DSTROBE
INC DPTR
SJMP SEND2LCD
EXIT_SEND:
RET
;------------------------------------------------------------------------
; Cac ham dung voi DS18B20
OW_RESET: ; tao xung reset
CLR DQ ; chan DQ xuong thap bat dau reset
MOV R0,#240 ; tre 480us
DJNZ R0,$
SETB DQ ; DQ len cao tro lai
MOV R0,#35
DJNZ R0,$ ; tre 70us
MOV C,DQ ; Doc du lieu tu chan DQ
MOV R0,#240
DJNZ R0,$ ; tre 480us
SETB DQ
RET
READ_BIT: ; doc tung bit o chan DQ, ket qua C=DQ
CLR DQ ; chan DQ xuong thap bat dau timeslot
NOP
SETB DQ ; chan DQ len cao de doc du lieu
NOP
NOP
NOP
NOP
NOP
MOV C,DQ
MOV R0,#27 ; tre khoang 60us de het timeslot
DJNZ R0,$
SETB DQ
RET
WRITE_BIT: ; ghi tung bit ra DQ, du lieu lay tu co C
CLR DQ ; DQ xuong thap bat dau timeslot
NOP
NOP
MOV DQ,C
EXIT_WRITEBIT:
MOV R0,#30 ; tre khoang 60us
DJNZ R0,$
SETB DQ
RET
READ_BYTE: ; doc 1 byte tu duong truyen, KQ luu vao thanh ghi A
MOV R1,#8 ; vong lap 8 lan
READ_LOOP:
LCALL READ_BIT ; doc tung bit
RRC A ; dich phai dua tung bit vao thanh ghi A
DJNZ R1,READ_LOOP ; lap 8 lan du 1 byte
RET
WRITE_BYTE: ; ghi 1 byte len duong truyen, DL lay tu thanh ghi A
MOV R1,#8 ; vong lap 8 lan
WRITE_LOOP:
RRC A ; dich phai tung bit vao co C
LCALL WRITE_BIT ; dua ra chan DQ
DJNZ R1,WRITE_LOOP ; lap 8 lan
RET
DS_INIT: ; Khoi tao cac IC DS18B20
LCALL MATCH_DS1 ; truy cap IC DS18B20, doc cac gia tri TH,TL
MOV A,#0BEH
LCALL WRITE_BYTE ; read scratchpad
LCALL READ_BYTE
MOV T_LOW,A ; doc LSB
LCALL READ_BYTE
MOV T_HIGH,A ; doc MSB
LCALL READ_BYTE
MOV TH_USER,A ; doc TH_USER
LCALL READ_BYTE
MOV TL_USER,A ; doc TL_USER;
LCALL OW_RESET ; reset pulse
; ghi gia tri TH,TL vua doc va thanh ghi config vao ca 3 IC DS18B20
LCALL MATCH_DS1
MOV A,#4EH ; write Scratchpad
LCALL WRITE_BYTE
MOV A,TH_USER
LCALL WRITE_BYTE
MOV A,TL_USER
LCALL WRITE_BYTE
MOV A,#00H
LCALL WRITE_BYTE
LCALL MATCH_DS1
MOV A,#48H ; copy scratchpad
LCALL DELAY10MS
RET
CONVERT_DS1: ; doc gia tri nhiet do DS18B20 thu1 ( ma 28E5A8C6000000E1H - 0549C23-318AB)
; ket qua luu vao bien TEMP1
LCALL MATCH_DS1 ; truy cap vao DS18B20 thuq1
MOV A,#44h
LCALL WRITE_BYTE ; convertT
LCALL DELAY100MS ; tre 100ms de convert
LCALL OW_RESET ; reset pulse
MOV A,#55H ; match ROM
LCALL WRITE_BYTE
LCALL MATCH_DS1 ; truy cap vao DS18B20 thu 1
LCALL CONVERT
MOV TEMP1,A ; chuyen gia tri do duoc vao thanh ghi TEMP1
RET
CONVERT_DS2: ; doc gia tri nhiet do DS18B20 thu2 ( ma 288077BF000000C3H-0539C2+020AE);
; ket qua luu vao bien TEMP1
LCALL MATCH_DS2 ; truy cap vao DS18B20 thu2
MOV A,#44h
LCALL WRITE_BYTE ; convertT
LCALL DELAY100MS ; tre 100ms de convert
LCALL MATCH_DS2
LCALL CONVERT
MOV TEMP2,A ; chuyen gia tri do duoc vao thanh ghi TEMP1
RET
CONVERT_DS3: ; doc gia tri nhiet do DS18B20 thu3 ( ma 28706B3100000020H-0132R0628AG);
; ket qua luu vao bien TEMP3
LCALL MATCH_DS3 ; truy cap vao DS18B20 thu 3
MOV A,#44h
LCALL WRITE_BYTE ; convertT
LCALL DELAY100MS ; tre 100ms de convert
LCALL MATCH_DS3 ; truy cap vao DS18B20 thu 3
LCALL CONVERT
MOV TEMP3,A ; chuyen gia tri do duoc vao thanh ghi TEMP1
RET
CONVERT_DS4: ; doc gia tri nhiet do DS18B20 thu4 ( ma 28A47131000000F9H-0132B6628AG);
; ket qua luu vao bien TEMP4
LCALL MATCH_DS4 ; truy cap vao DS18B20 thu 4
MOV A,#44h
LCALL WRITE_BYTE ; convertT
LCALL DELAY100MS ; tre 100ms de convert
LCALL MATCH_DS4 ; truy cap vao DS18B20 thu 4
LCALL CONVERT
MOV TEMP4,A ; chuyen gia tri do duoc vao thanh ghi TEMP1
RET
MATCH_DS1:
LCALL OW_RESET
MOV A,#55H ; match ROM
LCALL WRITE_BYTE
MOV A,#28h ; Family code
LCALL WRITE_BYTE
MOV A,#0E5H
LCALL WRITE_BYTE
MOV A,#0A8H
LCALL WRITE_BYTE
MOV A,#0C6H
LCALL WRITE_BYTE
MOV A,#00H
LCALL WRITE_BYTE
MOV A,#00H
LCALL WRITE_BYTE
MOV A,#00H; serial code
LCALL WRITE_BYTE
MOV A,#0E1H
LCALL WRITE_BYTE ; CRC check
RET
MATCH_DS2:
LCALL OW_RESET
MOV A,#55H ; match ROM
LCALL WRITE_BYTE
MOV A,#28h ; Family code
LCALL WRITE_BYTE
MOV A,#80H
LCALL WRITE_BYTE
MOV A,#77H
LCALL WRITE_BYTE
MOV A,#0BFH
LCALL WRITE_BYTE
MOV A,#00H
LCALL WRITE_BYTE
MOV A,#00H
LCALL WRITE_BYTE
MOV A,#00H; serial code
LCALL WRITE_BYTE
MOV A,#0C3H
LCALL WRITE_BYTE ; CRC check
RET
MATCH_DS3:
LCALL OW_RESET
MOV A,#55H ; match ROM
LCALL WRITE_BYTE
MOV A,#28h ; Family code
LCALL WRITE_BYTE
MOV A,#70H
LCALL WRITE_BYTE
MOV A,#6BH
LCALL WRITE_BYTE
MOV A,#31H
LCALL WRITE_BYTE
MOV A,#00H
LCALL WRITE_BYTE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -