?? at89c5218b2012232f.txt.txt
字號:
;****************************************************************;
; 溫度計程序/18B20\12232F顯示) ;
; ;
; AT89C52/12M晶振/編寫者LRM/2005.07.10 ;
; ;
;****************************************************************;
;
; 溫度顯示緩沖單元:60H-67H: :\空\百\十\個\小數點\小數位\空\℃
; 顯示式樣第二行為: 溫度: 100.5 ℃
;*****************定義*********************;
PLAYFLG EQU P3.4 ; 主程序運行指示燈用
SPEAK BIT P0.2 ;
KEY2 BIT P3.2
KEYSW0 EQU P2.6 ;
KEYSW1 EQU P2.7 ;
CON1S DATA 3BH ; 1秒計時用,溫度1-2秒測量一次
CON1S_DATA DATA 0FH ; 測溫間隔定時值65*15ms
FLG1S EQU 07H ; 1秒到標志
;************LCD定義***********************;
LAMPBLAK EQU P1.4 ;背光燈控制,=0時開,=1時關.
CS EQU P1.5 ;液晶使能,=1操作,=0禁止.
SID EQU P1.6 ;液晶串行數據輸入口
CLK EQU P1.7 ;液晶串行操作時鐘口
;溫度部分定義
TEMPHEAD EQU 30H ;
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
TEMPDIN BIT P1.3
;
VSDA BIT P3.6 ; EEPROM數據傳送口,24C16的5腳
VSCL BIT P3.5 ; EEPROM時鐘傳送口 ,24C16的6腳
BDATA DATA 2AH ;百十個小數位比較用
SDATA DATA 2BH
GDATA DATA 2CH
XSDATA DATA 2DH
;
;*********************程序入口*********************;
;
ORG 0000H
LJMP START
ORG 0003H
RETI
ORG 000BH
LJMP INTT0
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH
RETI
;
;*****************;主程序;*********************;
;
START:
CLR CS ;液晶操作禁止
mov SP, #80H ;堆棧在80H上
LCALL READTEMP ;上電時先溫度轉換一次
MOV TMOD,#11H ;計數器1,方式1
MOV TL0,#00H ;1秒定時用
MOV TH0,#00H
CLR A ;
MOV R0, A ;從24C16中 0000H開始讀出4個字節放在40H始單元
MOV R1, #BDATA ;
MOV R7, #04H ;
LCALL C16SERD ;
SETB EA
;
LCALL SETUP ;LCD初始化
LCALL LOGON ;開機顯示畫面
LCALL TEMPP ;下行顯示“溫度:
SETB ET0
SETB TR0
CLR FLG1S
MOV CON1S,#CON1S_DATA
AJMP MAIN11
;以下主程序
MAIN1:
JNB KEY2,BAOJSET ;設置溫度報警
JBC FLG1S,MAIN11
AJMP MAIN1
MAIN11:
LCALL READTEMP1 ;讀出溫度值子程序
LCALL CONVTEMP ;溫度BCD 碼計算處理子程序
LCALL DISPTEMP ;溫度值顯示涮新子程序
LCALL BAOJ ; 報警處理
LCALL READTEMP ;再發一次轉換溫度命令
SETB TR0
SETB ET0
CPL PLAYFLG ;程序運行指示燈
LJMP MAIN1
;
BAOJSET: LCALL DELAY1
JNB KEY2,BAOJSET
CLR ET0
CLR EA
CLR TR0
MOV A,#90H ;第二行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE4 ;16*16點陣“報警-----”
LCALL WRITE_HZ
MOV 66H,XSDATA
MOV 64H,GDATA
MOV 63H,SDATA
MOV 62H,BDATA
MOV 60H,#0AH ; :
MOV 61H,#0FH ; 空
MOV 65H,#11H ; 小數點.
MOV 67H,#0FH ; 空
LCALL TEMPUP ;顯示報警溫度
MOV R0,#62H
SET10:
JNB KEY2,SET2
JNB KEYSW0,SAFEADD1
JNB KEYSW1,SAFESUBB1
LCALL TEMPUP ;顯示報警溫度
LJMP SET10
SET2: LCALL DELAY1
JNB KEY2,SET2
INC R0
MOV A,R0
CLR C
CJNE A,#65H,SET101
SET101: JC SET10
AJMP SETOUT
;
SAFEADD1: LCALL DELAY1
JNB KEYSW0,SAFEADD1
MOV A,@R0
LCALL ADD11
MOV @R0,A
LJMP SET10
SAFESUBB1: LCALL DELAY1
JNB KEYSW1,SAFESUBB1
MOV A,@R0
LCALL SUBB11
MOV @R0,A
LJMP SET10
;
SETOUT: MOV BDATA,62H
MOV SDATA,63H
MOV GDATA,64H
MOV XSDATA,66H
CLR A ; 把4 字節寫入24C16的0000H開始地址中
MOV R0, A ;
MOV R1, #BDATA ;
MOV R7, #4 ;R7中的最大數據在1-16
LCALL C16PAWR ;
LCALL TEMPP
SETB ET0
SETB EA
SETB TR0
MAIN111: LJMP MAIN1
;
ADD11:
ADD A,#01H
CJNE A,#0AH,OLOOP
OLOOP: JC OUTT
MOV A,#00H
OUTT: RET
;
SUBB11:
JZ PPP1
DEC A
OUTP: RET
PPP1: MOV A,#09H
AJMP OUTP
;以下中斷程序用于1秒定時用
INTT0:
DJNZ CON1S,INTOUT
CLR TR0
CLR ET0
MOV CON1S,#CON1S_DATA
SETB FLG1S
INTOUT: RETI
;
BAOJ: SETB SPEAK
MOV A,62H
CJNE A,#0FH,BB3
MOV A,#00H
CLR C
BB3: CJNE A,BDATA,BAO1
MOV A,63H
CJNE A,#0FH,BB2
MOV A,#00H
CLR C
BB2: CJNE A,SDATA,BAO1
MOV A,64H
CLR C
CJNE A,GDATA,BAO1
MOV A,66H
CLR C
CJNE A,XSDATA,BAO1
BAOJING: CLR SPEAK
BBAO: RET
;
BAO1: JC BBAO
LJMP BAOJING
;
;***************開機顯示畫面***********************
LOGON: MOV A,#80H ;第一行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE ;WORD 16*16點陣TEST
LCALL WRITE_HZ
MOV A,#90H ;第二行左第一個字開始
LCALL WRITE_COM
MOV DPTR,#CHINESE1 ;WORD 16*16點陣TEST
LCALL WRITE_HZ
CLR LAMPBLAK ;開背光燈
LCALL DELAY5S ;顯示5秒
SETB LAMPBLAK ;關背光燈
RET
;**********初始化程序*************
SETUP: LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
MOV A,#01H ;CLEAR DISPLAY
LCALL WRITE_COM
MOV A,#00110000B ;FUNCTION SETTING
LCALL WRITE_COM
MOV A,#00000010B ;DDRAM SET TO '00H'
LCALL WRITE_COM
MOV A,#00000100B ;
LCALL WRITE_COM
MOV A,#00001100B ;DISPLAY ON
LCALL WRITE_COM
MOV A,#00000001B ;CLEARING SCREEN
LCALL WRITE_COM
MOV A,#10000000B ;SET DDRAM ADDRESS
LCALL WRITE_COM
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
RET
;************串行命令寫入子程序****************
;寫入命令字在A中
WRITE_COM:
LCALL DELAY1 ;
SETB CS
PUSH ACC
MOV R0,#8
MOV A,#11111000B
COMM1:
CLR C
RLC A
MOV SID,C
CLR CLK
SETB CLK
DJNZ R0,COMM1
POP ACC
MOV R5,A
ANL A,#0F0H
MOV R0,#8
COMM2: CLR C
RLC A
MOV SID,C
CLR CLK
SETB CLK
DJNZ R0,COMM2
MOV A,R5
SWAP A
ANL A,#0F0H
MOV R0,#8
COMM3: CLR C
RLC A
MOV SID,C
CLR CLK
SETB CLK
DJNZ R0,COMM3
CLR CS
RET
;
;***********串行數據寫入子程序****************
;寫入數據字在A中
WRITE_DAT:
LCALL DELAY1
SETB CS
PUSH ACC
MOV R0,#8
MOV A,#11111010B
DATA1: CLR C
RLC A
MOV SID,C
CLR CLK
SETB CLK
DJNZ R0,DATA1
POP ACC
MOV R5,A
ANL A,#0F0H
MOV R0,#8
DATA2: CLR C
RLC A
MOV SID,C
CLR CLK
SETB CLK
DJNZ R0,DATA2
MOV A,R5
SWAP A
ANL A,#0F0H
MOV R0,#8
DATA3: CLR C
RLC A
MOV SID,C
CLR CLK
SETB CLK
DJNZ R0,DATA3
CLR CS
RET
;
;**************延時子程序**********************
;0.544ms
DELAY1:
MOV R7,#010H
D11: MOV R6,#010H
DJNZ R6,$
DJNZ R7,D11
RET
;0.13s
DELAY:
MOV R1,#00H
D2: MOV R2,#00H
DJNZ R2,$
DJNZ R1,D2
RET
;5.2s
DELAY5S:MOV R3,#28H
DE5S: LCALL DELAY
DJNZ R3,DE5S
RET
;
;************16*16點陣漢字寫入子程序共7個***********
WRITE_HZ: ;WRITE 7 CHINESE TO LCD
MOV R4,#7
DD: CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
DJNZ R4,DD
RET
;************16*16點陣漢字寫入子程序共2個***********
WRITE_HZ2: ;WRITE 8 CHINESE TO LCD
MOV R4,#2
DD4: CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
CLR A
MOVC A,@A+DPTR
INC DPTR
LCALL WRITE_DAT
DJNZ R4,DD4
RET
;
;*****************************16*8點陣的字符代碼表**********************************
TABLE1: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH,20H,2DH,2EH
; 0 1 2 3 4 5 6 7 8 9 : ; < = > "不顯"'-''.'
;**********************************自造字符地址表***********************************
CGRAM1: DB 000H,000H
CGRAM2: DB 000H,002H
CGRAM3: DB 000H,004H
CGRAM4: DB 000H,006H
;******************"這里是16*16點陣的漢字代碼表"************************************
CHINESE: DW 0DBA0H,0D5E3H,0BDADH,0BAA3H,0D1F3H,0D1A7H,0D4BAH,0DBA0H;—浙江海洋學院—
CHINESE1: DW 0C2A5H,0C8BBH,0C3E7H,0B1CFH,0D2B5H,0C9E8H,0BCC6H,0DBA0H;樓然苗畢業設計—
CHINESE2: DW 0CAB1H,0BCE4H ;時間
CHINESE3: DW 0CEC2H,0B6C8H,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0A1E6H ;溫度----℃
CHINESE4: DW 0B1A8H,0BEAFH,0DBA0H,0DBA0H,0DBA0H,0DBA0H,0A1E6H ;報警----℃ ;℃
;
;********************************************************************************
;
;
;**********************************************************
;以下溫度測量子程序區
;
;**********************************************************
; RESET DS18B20
;**********************************************************
INITDS1820: SETB TEMPDIN ;
NOP ;
NOP ;
CLR TEMPDIN ;
MOV R6, #0A0H ; DELAY 480us
DJNZ R6, $
MOV R6, #0A0H
DJNZ R6, $ ;
SETB TEMPDIN ;
MOV R6, #32H ; DELAY 70us
DJNZ R6, $ ;
MOV R6,#3CH
LOOP1820: MOV C, TEMPDIN ;
JC INITDS1820OUT ;
DJNZ R6,LOOP1820
MOV R6, #064H ; DELAY 200us
DJNZ R6, $ ;
SJMP INITDS1820 ;
RET ;
;
INITDS1820OUT: SETB TEMPDIN ;
RET ;
;
;
;**********************************************************
; 讀DS18B20的程序, 從DS18B20中讀出一個字節的數據
;**********************************************************
READDS1820: MOV R7, #08H ;
SETB TEMPDIN ;
NOP ;
NOP ;
READDS1820LOOP: CLR TEMPDIN ;
NOP ;
NOP ;
NOP ;
SETB TEMPDIN ;
MOV R6, #07H ; DELAY 15us
DJNZ R6, $ ;
MOV C, TEMPDIN ;
MOV R6, #3CH ; DELAY 120us
DJNZ R6, $ ;
RRC A ;
SETB TEMPDIN ;
DJNZ R7, READDS1820LOOP ;
MOV R6, #3CH ; DELAY 120us
DJNZ R6, $ ;
RET ;
;
;
;**********************************************************
; 寫DS18B20的程序, 從DS18B20中寫一個字節的數據
;**********************************************************
WRITEDS1820: MOV R7, #08H ;
SETB TEMPDIN ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -