⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1

📁 RM51单片机实验板配套实验例程库
💻
📖 第 1 页 / 共 2 页
字号:
;****************************************************************;
;              温度计程序/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			;
		NOP				;
		NOP				;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -