📄 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 + -