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

📄 1[1][1].0.asm

📁 温度检测与控制系统源码,千万不要错过哦
💻 ASM
字号:
                ORG 0000H
       TEMPER_L EQU 29H  ;用于保存读出温度的低 8 位
       TEMPER_H EQU 28H  ;用于保存读出温度的高 8 位
	  FLAG1 EQU 38H  ;是否检测到 DS18B20 标志位
          A_BIT EQU 20H  ;数码管个位数存放内存位置
          B_BIT EQU 21H  ;数码管十位数存放内存位置
          C_BIT EQU 22H  ;数码管百位数存放内存位置
            DOT EQU 23H  ;数码管C存放内存位置
         HBJWD  EQU 24H  ;上限报警温度存放内存位置
         LBJWD  EQU 30H  ;下限报警温度存放内存位置
          HLIM  EQU 25H  ;上限温度存放内存位置
          LLIM  EQU 26H  ;下限温度存放内存位置
         CHANGE EQU 27H  ;温度变量存放内存位置
         TRANT  EQU 31H  ;按键显示转移变量
         DIS_1  EQU 32H
         DIS_2  EQU 33H
	 WDDATA BIT P1.0 ;定义DS18B20数据口
         
                MOV P1,#00H
                CLR EA        ;关闭总中断
                MOV SCON,#50H ;设置成串口1方式
                MOV TMOD,#20H ;波特率发生器T1工作在模式2上
                MOV TH1,#0F3H ;预置初值(按照波特率2400BPS预置初值)
                MOV TL1,#0F3H ;预置初值(按照波特率2400BPS预置初值)
                SETB TR1      ;启动定时器T1
                ;以上完成串口2400通讯初始化设置
                LJMP MAIN
                ORG 0100H
MAIN:           MOV P1,#00H
                SETB P1.4
                MOV HBJWD,#102 ;设定初始值
                MOV LBJWD,#8
                MOV HLIM,#100
                MOV LLIM,#10
                MOV CHANGE,#0
                SJMP START1
LOOPA:          LCALL KEYA        ;键1,调用键盘扫描子程序
                LCALL NUM_CODE
                LCALL SHOW
                SJMP LOOPA        ;等待按键
LOOPB:          LCALL KEYB        ;键4,调用键盘扫描子程序
                LCALL NUM_CODE
                LCALL SHOW
                SJMP LOOPB        ;等待按键
;START:          LCALL DY12MS1
START1:         LCALL DISPLAY
                LCALL GET_TEMPER;调用读温度子程序
	        MOV A,29H
	        MOV C,40H;将 28H 中的最低位移入 C
   	        RRC A
	        MOV C,41H
	        RRC A
  	        MOV C,42H
	        RRC A
                MOV C,43H
  	        RRC A
                MOV 29H,A
                LCALL BAOJING;检查是否超温
	        LCALL DISPLAY;调用数码管显示子程序
                LCALL CHUANKOU;调用串口程序
                LCALL RECIEVE
	        AJMP START1
;500毫秒延时子程序,占用R4、R5
DELAY500:MOV R4,#248
DA222:MOV R5,#248
DJNZ R5,$
DJNZ R4,DA222
RET
;报警程序,超过上或低于下限温度则分别关和开继电器,超过上或低于下限报警温度则开蜂鸣器
BAOJING:        CLR C
                MOV A,HBJWD        ;上报警温度值送A
                SUBB A,29H
                JB ACC.7,DONE0
                SJMP DONE1
DONE0:          LCALL MING
                LCALL SHUT
                RET
DONE1:          CLR P1.5
                MOV A,HLIM
                SUBB A,29H
                JB ACC.7,DONE2
                SJMP DONE3
DONE2:          LCALL SHUT
                RET                
DONE3:          MOV A,LBJWD
                SUBB A,29H
                JNB ACC.7,DONE4
                SJMP DONE5
DONE4:          LCALL OPEN
                LCALL MING
                RET                
DONE5:          MOV A,LLIM
                SUBB A,29H
                JNB ACC.7,DONE6
                SJMP DONE7
DONE6:          LCALL OPEN
DONE7:          RET
                
SHUT:           CLR P1.4            ;关继电器
                RET
                
OPEN:           SETB P1.4           ;开继电器
                RET
               
MING:           SETB P1.5           ;开蜂鸣器
                LCALL DY12MS1
                LCALL DY12MS1
                LCALL DY12MS1
                CLR P1.5
                LCALL DY12MS1
                LCALL DY12MS1
                LCALL DY12MS1
                RET
;---------------------------------------------------
;          清零子程序
;---------------------------------------------------
CLEAR:     MOV A_BIT,#0
	   MOV B_BIT,#0
 	   MOV C_BIT,#0
	   MOV DOT,#0
	   RET
;--------------------------------------------------
;          按键扫描子程序
;--------------------------------------------------
KEYA:      JB P2.4,TESTA      ;K1键按下?
           SETB P1.5
           LCALL DY12MS1
           CLR P1.5
           MOV A,HLIM
           MOV B,#100
           DIV AB
           MOV C_BIT,A
           MOV A,B
           MOV B,#10
           DIV AB
           MOV A_BIT,B
	   MOV B_BIT,A
	   MOV DOT,#0
TESTA:     JB P2.5,TEST1      ;K2键按下?
           SETB P1.5
           LCALL DY12MS1
           CLR P1.5
           INC HLIM
           MOV A,HLIM
           MOV B,#100
           DIV AB
           MOV C_BIT,A
           MOV A,B
           MOV B,#10
           DIV AB
           MOV A_BIT,B
	   MOV B_BIT,A
	   MOV DOT,#0
           MOV A,HLIM
           ADD A,#2
           MOV HBJWD,A
TEST1:     JB P2.6,TESTB     ;K3键按下?
           SETB P1.5
           LCALL DY12MS1
           CLR P1.5
           DEC HLIM
           MOV A,HLIM
           MOV B,#100
           DIV AB
           MOV C_BIT,A
           MOV A,B
           MOV B,#10
           DIV AB
           MOV A_BIT,B
	   MOV B_BIT,A
	   MOV DOT,#0
           MOV A,HLIM
           ADD A,#2
           MOV HBJWD,A
TESTB:     JB P2.7,TEST2
           SETB P1.5
           LCALL DY12MS1
           CLR P1.5
           LJMP START1
TEST2:     RET
;---------------------------------------------------------
KEYB:      JB P2.7,TESTC
           SETB P1.5
           LCALL DY12MS1
           CLR P1.5
           MOV A,LLIM
           MOV B,#100
           DIV AB
           MOV C_BIT,A
           MOV A,B
           MOV B,#10
           DIV AB
           MOV A_BIT,B
	   MOV B_BIT,A
	   MOV DOT,#0
TESTC:     JB P2.5,TEST3
           SETB P1.5
           LCALL DY12MS1
           CLR P1.5
           INC LLIM
           MOV A,LLIM
           MOV B,#100
           DIV AB
           MOV C_BIT,A
           MOV A,B
           MOV B,#10
           DIV AB
           MOV A_BIT,B
	   MOV B_BIT,A
	   MOV DOT,#0
           MOV A,LLIM
           SUBB A,#2
           MOV LBJWD,A
TEST3:     JB P2.6,TESTD      ;K3键按下?
           SETB P1.5
           LCALL DY12MS1
           CLR P1.5
           DEC LLIM
           MOV A,LLIM
           MOV B,#100
           DIV AB
           MOV C_BIT,A
           MOV A,B
           MOV B,#10
           DIV AB
           MOV A_BIT,B
	   MOV B_BIT,A
	   MOV DOT,#0
           MOV A,LLIM
           SUBB A,#2
           MOV LBJWD,A
TESTD:     JB P2.4,TEST4
           SETB P1.5
           LCALL DY12MS1
           CLR P1.5
           LJMP START1
TEST4: 	   RET
DY12MS1:   MOV R6,#0D0H
DY12MS2:   MOV R5,#0FFH
DY12MS3:   DJNZ R5,DY12MS3
           DJNZ R6,DY12MS2
	   RET
;--------------------------------------------------
;          取字形码子程序
;--------------------------------------------------
NUM_CODE:  MOV DPTR,#TAB
           MOV A,DOT
	   MOVC A,@A+DPTR      ;取小时高位字形码
           XRL A,#0B0H          ;加小数点
           MOV 50H,A           ;字形码放50H
	   MOV A,A_BIT
	   MOVC A,@A+DPTR      ;取小时低位字形码
           MOV 51H,A           ;字形码放51H
	   MOV A,B_BIT
	   MOVC A,@A+DPTR      ;取分钟高位字形码
	   MOV 52H,A           ;字形码放52H
	   MOV A,C_BIT
	   MOVC A,@A+DPTR      ;取分钟低位字形码
	   MOV 53H,A           ;字形码放53H
	   RET
TAB: 	   DB 0C0H,0CFH,0A4H,086H,08BH ;0--4
	   DB 092H,098H,0C7H,080H,082H ;5--9
;-----------------------------------------------
;          显示子程序
;-----------------------------------------------

SHOW:      MOV R1,#2
SHOW1:     MOV P0,50H
           SETB P2.0
	   ACALL DELAY         ;延时1ms
           CLR P2.0
	   MOV P0,51H
           SETB P2.1
      	   ACALL DELAY
           CLR P2.1
           MOV P0,52H
           SETB P2.2
	   ACALL DELAY
           CLR P2.2
           MOV P0,53H
           SETB P2.3
	   ACALL DELAY
           CLR P2.3
           DJNZ R1,SHOW1
           RET

;-----------------------------------------------
;          延时1ms子程序
;-----------------------------------------------

DELAY:     MOV R7,#02H         ;延时1ms
DELAY1:    MOV R6,#0FFH
DELAY2:    DJNZ R6,DELAY2
           DJNZ R7,DELAY1
	   RET
;---------------------------------------------------------------------------
; 这是 DS18B20 复位初始化子程序
INIT_1820:
 		SETB WDDATA
		NOP
		CLR WDDATA
;主机发出延时 537 微秒的复位低脉冲
		MOV R1,#3
TSR1:		MOV R0,#107
		DJNZ R0,$
		DJNZ R1,TSR1
		SETB WDDATA;然后拉高数据线
		NOP
		NOP
		NOP
		MOV R0,#25H
TSR2:
		JNB WDDATA,TSR3;等待 DS18B20 回应
		DJNZ R0,TSR2
		LJMP TSR4 ; 延时
TSR3:
		SETB FLAG1 ; 置标志位,表示 DS1820 存在
		LJMP TSR5
TSR4:
		CLR FLAG1 ; 清标志位,表示 DS1820 不存在
		LJMP TSR7
TSR5:
		MOV R0,#117
TSR6:
		DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
		SETB WDDATA
		RET
GET_TEMPER:
		SETB WDDATA
		LCALL INIT_1820;先复位 DS18B20
		JB FLAG1,TSS2
		RET ; 判断 DS1820 是否存在?若 DS18B20 不存在则返回
TSS2:
		MOV A,#0CCH ; 跳过 ROM 匹配
		LCALL WRITE_1820
		MOV A,#44H ; 发出温度转换命令
		LCALL WRITE_1820
		LCALL DISPLAY
		LCALL INIT_1820;准备读温度前先复位
		MOV A,#0CCH ; 跳过 ROM 匹配
		LCALL WRITE_1820
		MOV A,#0BEH ; 发出读温度命令
		LCALL WRITE_1820
		LCALL READ_18200; 将读出的温度数据保存到 35H/36H
		RET
WRITE_1820:
		MOV R2,#8;一共 8 位数据
		CLR C
WR1:
		CLR WDDATA
		MOV R3,#6
		DJNZ R3,$
		RRC A
		MOV WDDATA,C
		MOV R3,#23
		DJNZ R3,$
		SETB WDDATA
		NOP
		DJNZ R2,WR1
		SETB WDDATA
		RET
READ_18200:
		MOV R4,#2 ; 将温度高位和低位从 DS18B20 中读出
		MOV R1,#29H ; 低位存入 29H(TEMPER_L),高位存入 28H(TEMPER_H)
RE00:
		MOV R2,#8;数据一共有 8 位
RE01:
		CLR C
		SETB WDDATA
		NOP
		NOP
		CLR WDDATA
		NOP
		NOP
		NOP
		SETB WDDATA
		MOV R3,#9
RE10:
		DJNZ R3,RE10
		MOV C,WDDATA
		MOV R3,#23
RE20:
		DJNZ R3,RE20
		RRC A
		DJNZ R2,RE01
		MOV @R1,A
		DEC R1
		DJNZ R4,RE00
		RET
;---------------------------------------------------------------------------
;显示部分
DISPLAY:        MOV DOT,#0
                MOV A,29H;将 29H 中的十六进制数转换成 10 进制
		MOV B,#100 ;10 进制/100=10 进制
		DIV AB
		MOV C_BIT,A ;百位在 A
		MOV A,B
                MOV B,#10
                DIV AB
                MOV B_BIT,A  ;十位在A
                MOV A_BIT,B  ;个位在B
                LCALL NUM_CODE
                LCALL SHOW
                JB P2.4,KKK      ;判断有无按键1
                LJMP LOOPA
KKK:            JB P2.7,FFF      ;判断有无按键4
                LJMP LOOPB
FFF:		RET
;-----------------------------------------------
;串口发送
CHUANKOU:       CLR TI
                MOV A,29H
                MOV SBUF,A
                JNB TI,$ ;发送给PC
                RET
;------------------------------------------------------------
WAIT:   MOV R3,#0FFH                                                     
WAIT1:	JNB  RI,MAG
	CLR  RI
	MOV  A,SBUF
        RET
MAG:    DJNZ R3,WAIT1        
	RET
;串口接收
RECIEVE:        MOV R2,#0FFH
RECIEVE1:       JNB RI,FLAG
                CLR RI
                MOV A,SBUF   ;接收
                MOV DIS_1,A
                CJNE A,#00H,GO1
                CLR P1.4
                SJMP RECIEVE
GO1:            MOV A,DIS_1
                CJNE A,#01H,GO2
                SETB P1.4
                RET                
GO2:            MOV A,DIS_1
                SETB P1.5
                LCALL DY12MS1
                CLR P1.5
                MOV HLIM,A
                ADD A,#2
                MOV HBJWD,A
                RET
TEMP:           SJMP RECIEVE
FLAG:           DJNZ R2,RECIEVE1
                RET                                
	        END  





⌨️ 快捷键说明

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