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

📄 zhuchengxu.asm

📁 温度监视器
💻 ASM
字号:
/************************************************************************************/
;COPYRIGHT BELONG TO 贵鹏斐(用查询方法)(动态显示必须让程序不断循环)
/*存在问题:1.按键设置上下限的时候,减法只能从9减到0
;			2.蜂鸣器,红灯,绿灯没加限流电阻,上电时红灯微亮,蜂鸣器微鸣
;			3.上电时DB18B20显示初始温度85,引起误操作,再一次上电恢复正常*/
;        信电学院
;        2008.9.16
/************************************************************************************/
/***实现功能:通过按键设置温度上下限范围,并用数码管显示温度,越限红灯亮,蜂鸣器响***/
P0MDOUT   DATA  0A4H                   ; Port 0 Output Mode Configuration
P1MDOUT   DATA  0A5H                   ; Port 1 Output Mode Configuration
P2MDOUT   DATA  0A6H				   ; Port 2 Output Mode Configuration
P3MDOUT   DATA  0A7H                   ; Port 3 Output Mode Configuration
XBR1      DATA  0E2H                   ; Port I/O Crossbar Control 1
PCA0MD    DATA  0D9H                   ; PCA Mode
OSCICN    DATA  0B2H                   ; Internal Oscillator Control
DQ        EQU   P3.2
;============================================================================================
ORG 0000H
	LJMP MAIN
;==================主程序初始化==============================================================
ORG 00B3H
MAIN:
MOV SP,#60H
MOV  P0MDOUT,   #0FFh		   ;P2口默认为漏极开路,用于按键,P2.0为+P2.1为-P2.7为确定
MOV  P1MDOUT,   #0FFh		   ;P1口输出段码		   
MOV  P3MDOUT,   #0FFh		   ;P3口输出位码,P3.0,P3.1,对应2个数码管,P3.3对应红灯(上限),
                               ;P3.4对应绿灯(下限),P3.5对应蜂鸣器
MOV  XBR1,      #0C0h 
MOV  OSCICN,    #081h		   
ANL  PCA0MD,    #0BFh
MOV  PCA0MD,    #000h
MOV  R0,        #00H		   ;段码(个位数)
MOV  R4,        #00H		   ;存十六进制温度
MOV  R2,        #00H           ;计按键数
MOV  R3,        #02H		   ;确定键按下的次数为2
MOV  R1,        #70H		   ;上限温度值放在71H,下限放在70H
MOV  R5,        #00H		   ;段码(十位数)
MOV  70H,#00H
MOV  71H,#00H
MOV DPTR,#TABLE				   ;显示2个0
MOV  A,R0				   
MOVC A,@A+DPTR
MOV P1,A
MOV A,#0FCH
/**************************按键设置上下限******************************************************/
MOV P3,A
M1:
LCALL DISPLAY
JNB P2.0,JIAFA				   ;P2.0为0,数码管加1
JNB P2.1,JIANFA				   ;P2.1为0,数码管减1
JB  P2.7,M1
JNB P2.7,$					   ;等待确定键(P2.7)松开,先存下限数值于80H,后存上限数值于81H
MOV  A,R2
MOV  @R1,A
INC R1
DJNZ R3,M1
SJMP M2
JIAFA:
JNB P2.0,$
INC R2					       ;等待按键(P2.0)松开
INC R0
LCALL DISPLAY
SJMP M1 
JIANFA:
JNB P2.1,$
DEC R2					        ;等待按键(P2.1)松开
DEC R0
LCALL DISPLAY
SJMP M1
/*****************************开始温度转换*********************************************/
M2:
LCALL GET_TEMP				   ;调用温度转换子程序
LCALL ZHUANHUAN				   ;温度转换成十六进制,总温度值存在R4中,个位存在R0,十位存在R5中
LCALL DISPLAY				   ;调用数码管显示子程序
CLR C
DEC R1						   ;清标志位
MOV A,R4
SUBB A,@R1
JNC ALARM_UP				   ;上限报警
DEC R1
CLR C
MOV A,R4
SUBB A,@R1					   
JC ALARM_DOWN				   ;下限报警
SJMP M3
ALARM_DOWN:
CLR P3.4					   ;绿灯亮
CLR P3.5					   ;蜂鸣器响
SJMP M3
ALARM_UP:
CLR P3.3					   ;红灯亮
CLR P3.5					   ;蜂鸣器响
SJMP M4
M3:
LCALL DELAY750MS			   ;两次转换需间隔750MS,并且在延时里还要调用显示子程序
INC R1
M4:
INC R1
SJMP M2
;===========================================================================================
/***温度转换子程序**********************************************************************/
GET_TEMP: 
        ;CLR PSW.4 

        ;SETB PSW.3      				;设置工作寄存器当前所在的区域,1区
        CLR EA          				;使用 ds1820 一定要禁止任何中断产生 
        lcall DS18B20_INIT				;调用初始化子程序
        MOV A,#0CCH      
        LCALL write     				;送入跳过 ROM 命令 
        MOV A, #44H 
        LCALL write     				;送入温度转换命令
		lcall DS18B20_INIT 				;温度转换完全再次初始化ds18b20
		MOV A,#0CCH      
        LCALL write     				;送入跳过 ROM 命令 
        MOV A,#0BEH 
        LCALL write     				;送入读温度暂存器命令 
        LCALL read       
        MOV R7,A        				;读出温度值低字节存入 R7 
        LCALL read 
        MOV R6,A        				;读出谩度值高字节存入 R6 
        SETB EA 
        RET

DS18B20_INIT:						   ;初始化子程序
  		 CLR EA						   ;使用ds18b20一定要禁止任何中断的产生
		 SETB DQ
		 nop
         nop
      L0:CLR  DQ					   ;总线为低复位电平
		 call delay500us			   ;总线复位电平保持500us
		 setb DQ					   ;释放总线
		 mov R2,#50
      L1:djnz R2,L1					   ;延时25us
		 clr C						   ;清存在标志
		 orl C,DQ					   
		 jc L0 						   ;存在?不存在则从来
		 mov R3,#80
      L5:orl C,DQ
		 jc L3
		 nop
		 djnz R3,L5
		 sjmp L0
      L3:mov R2,#240
      L2:nop
		 djnz R2,L2
		 ret
;==========================================================
delay500us:
		mov r6,#200
lpr6:
		nop
		nop
		djnz r6,lpr6

		ret
;==========================================================
write:								    ;向DS18B20写操作命令子程序
    	CLR EA
		MOV R3,#8						;写入DS18B20的bit数,一个字节8个bit
   WR1:	SETB DQ
        MOV R4,#8
		RRC A							;把一个字节分成8个位循环移给C
		CLR DQ							;开始写入ds18b20要求处于复位低电平
   WRR2:nop
      	djnz R4,WRR2 	
		MOV DQ,C						;写入一个位
        MOV R4,#40
    WR3:nop
  		DJNZ R4,WR3
		DJNZ R3,WR1						;写入下一位
		SETB DQ
		ret
read:
		CLR EA
		MOV R3,#8						;连续读8个BIT
    RE1:CLR DQ							;读前总线保持为低
		NOP
		NOP
		SETB DQ							;开始读,总线释放
        MOV R4,#4
    RE2:NOP
		DJNZ R4,RE2
		MOV C,DQ						;从ds18b20总线读一个位
		RRC A							;把读到的位循环位移给A
		MOV R4,#45
    RE3:NOP
		DJNZ R4,RE3
		DJNZ R3,RE1						;读下一位
		SETB DQ
		ret
;==============================================================================================
/********数码显示子程序***********************************************************************/
DISPLAY:
CJNE R0,#0AH,D0
INC R5
MOV R0,#00H
D0:
MOV DPTR,#TABLE
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
CLR  P3.0								;显示个位数
SETB P3.1
LCALL DELAY2MS
MOV P1,#00H                            ;全部熄灭
MOV DPTR,#TABLE
MOV A,R5
MOVC A,@A+DPTR
MOV P1,A
CLR P3.1								;显示十位数
SETB P3.0
LCALL DELAY2MS
MOV P1,#00H
CJNE R5,#0AH,D1
MOV R5,#00H
D1:
RET
;=========延时2毫秒===================================================================
DELAY2MS:
          MOV A,R2
		  MOV B,R3
		  PUSH ACC
		  PUSH B
          MOV R3,#4
D2:       MOV R2,#250
		  DJNZ R2,$
		  DJNZ R3,D2
		  POP B
		  MOV R3,B
		  POP ACC
		  MOV R2,A 
		  RET
;=========延时750毫秒=================================================================
DELAY750MS:
          MOV A,R4
		  PUSH ACC
          LCALL DISPLAY
          MOV R2,#75
D4:		  MOV R3,#20
D3:		  MOV R4,#250
		  DJNZ R4,$
		  DJNZ R3,D3
		  LCALL DISPLAY
		  DJNZ R2,D4
		  POP ACC
		  MOV R4,A
		  RET
;=====================================================================================
ZHUANHUAN:
MOV A,R6
ANL A,#0FH                                 ;屏蔽R6的高4位,只保留低四位
SWAP A
MOV B,A
MOV A,R7
ANL A,#0F0H                                ;屏蔽R7的低四位即去掉小数部分
SWAP A
ORL A,B									    ;十六进制温度存在A中
MOV R4,A									;十六进制温度存在R4中 
MOV B,#0AH
DIV AB									   ;十位数在A中,个位在B中
MOV R0,B
MOV R5,A
RET
;============================================================================================
TABLE:    DB 3FH,03H,6DH,67H,53H,76H,7EH,23H,7FH,73H
END

⌨️ 快捷键说明

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