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

📄 1602_lcd at89s52.txt

📁 使用1602_LCD AT89S52 18B20实现的温度报警
💻 TXT
📖 第 1 页 / 共 4 页
字号:
MOV A,#48H ;将高低温限值寄存器数据送18B20-EPROM保存.
LCALL WRITE
A_END:

RET







;***************18b20指令子程序**********************
READ_TEMP:  ;读1820内部温度子程序.
     LCALL RESET
     JB 70h,EXT1 
     LCALL SKIP_ROM 
     LCALL TEMP_CONV ;温度AD变换
     LCALL DELAY_600MS  ;时........
     LCALL RESET
     LCALL SKIP_ROM 
     LCALL TEMP_GET ;发取温度的命令
     LCALL READ ;接收...
	  EXT1:
     RET 

SKIP_ROM:;跳过ROM检测
    MOV A,#0CCH ;#0CCH为跳过rom命令
    LCALL WRITE
    RET 

RELCALL_EPROM:;重调Eprom的值到18B20的暂存RAM中去,,这样一上电18B20中RAM就有数据了
    MOV A,#0B8H;在重调之前有配置或设定好下上限温度值吗?看看按键程序处有什么?
    LCALL WRITE
    RET 

 
TEMP_CONV:
    MOV A,#44H ;AD变换
	 LCALL WRITE
	 RET

TEMP_GET:
    MOV A ,#0BEH;读18b20命令
    LCALL WRITE
    RET 


;****************************18B20基本时序子程序*********************************
RESET:  ;初始化子程序    同时也检测18B20是否存在,,,
   SETB P0.0 
   NOP 
   CLR P0.0    ;拉低
   MOV R3,#150 ; *4=600US
   LCALL DELAY_BY_R3
   SETB P0.0    ;拉高
   MOV R3,#15  ; 60US
   LCALL DELAY_BY_R3
   MOV R3,#60 ;4个周期*60=240US内检测 
A1: JNB P0.0,A2 ;检测到低平信号
    DJNZ R3,A1 ;如果没有应答的低电平信号,返回A1重新检测,超时后下一行,
    SETB 70h ;DS1820不存在.
    JMP A3
A2: CLR 70h
    MOV R3,120;240US;等恢复时间2*120=240us
    DJNZ R3, $
A3: 
   RET
;------------------------

WRITE:
    MOV R2,#8;一个字节为8位
    CLR C ;C位清0 C位用来放A的一位数据,用移位的方法放入C
B1: SETB P0.0
	 NOP 
    CLR P0.0
	 MOV R3,#4 ;16US
	 LCALL DELAY_BY_R3
	 RRC A        ;把A中的数送入C
	 MOV P0.0,C   ;把C送入总线
    MOV R3,#12    ;48US(一位数据的发送:60us<tx<120us)
	 LCALL DELAY_BY_R3
	 SETB P0.0  ;拉高1us结束一位
	 NOP 
	 DJNZ R2,B1
         RET

READ:
MOV R1,#9 ;接收4个字节数据依次是1.低位 2.高位. 3.高限 4.低限
MOV R0,#TEMPHEAD;低位放28H;高位放29h (1. 28H,2. 29H 3. 2AH 4. 2BH )
MOV B,#00H
READTEMP2:LCALL READDS1820
MOV @R0,A
INC R0
READTEMP21:LCALL CRC8CAL
DJNZ R1,READTEMP2
MOV A,B
JNZ READTEMPOUT
MOV A,TEMPHEAD
MOV TMP_L,A
MOV A,TEMPHEAD+1
MOV TMP_H,A
MOV	A,TEMPHEAD+2
MOV 2AH,A
MOV A,TEMPHEAD+3
MOV 2BH,A
READTEMPOUT:RET

CRC8CAL:PUSH ACC
        MOV R7,#08H
CRCLOOP1:XRL A,B
         RRC A
		 MOV A,B
		 JNC CRCLOOP2
		 XRL A,#18H
CRCLOOP2:RRC A
         MOV B,A
		 POP ACC
		 RR A
		 PUSH ACC
		 DJNZ R7,CRCLOOP1
		 POP ACC
		 RET


READDS1820:
 MOV R2,#8;一字节数据8位
C11: CLR C ;清除C
SETB P0.0
NOP 
NOP 
CLR P0.0 ;拉低.
NOP ;1us秒后拉高?
NOP 
NOP
SETB P0.0
MOV R6,#07H
DJNZ R6,$
MOV C,P0.0 ;读出18b20的数据
RRC  A ;移入A
MOV R6,#3CH
DJNZ R6,$
SETB P0.0
DJNZ R2,C11 ;一个字节收完
MOV R6,#3CH
DJNZ R6,$
RET 
;*********************************************************************************



;*****************LCD_控制命令***************
DISPLAY: MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
LCALL WRITE_DATA_TO_LCD
INC R1
DJNZ R0,DISPLAY
RET 


WRITE_NOT_CHECK_BUSY:
SETB E 
NOP
NOP 
CLR RS ;写入控制命令的子程序
CLR RW 
CLR E 
RET 


ENABLE:	;只要先将命令数据或地址先送P1,再调用ENABLE就可以写入哦
SETB E
NOP
NOP
CLR RS ;写入控制命令的子程序
CLR RW 
CLR E 
LCALL TEST_BUSY
SETB E 
RET


TEST_BUSY:
SETB E 
NOP
NOP 
MOV P1,#0FFH ;判断液晶显示器是否忙的子程序
CLR RS 
SETB RW
CLR E 
NOP 
SETB E 
JB P1.7,TEST_BUSY ;如果P1.7为高电平表示忙就循环等待 
RET


WRITE_DATA_TO_LCD:
SETB E 
NOP
NOP
SETB RS ;RS=1 
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL TEST_BUSY ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
RET 




;***************************数据转换***************************
DATA_CONV:  ;数据转换

   MOV A,24H
SWAP A
ANL A,#0FH
MOV 46H,A
MOV A,24H
ANL A,#0FH
MOV 47H,A

MOV A,23H
SWAP A
ANL A,#0FH
MOV 48H,A
MOV A,23H
ANL A,#0FH
MOV 49H,A

MOV A,22H
SWAP A
ANL A,#0FH
MOV 4AH,A
MOV A,22H
ANL A,#0FH
MOV 4BH,A


MOV A,28H ;低字节
ANL A,#0FH;去除高位
MOV B,#6;乘6得到实际数值的100倍.
MUL AB
MOV B,#10
DIV AB
MOV 33H,A;小数位高
MOV 32H,B; 小数位低
MOV A,28H
MOV C,29H.0 ;29h高位的低4字节
RRC A 
MOV C,29H.1
RRC A 
MOV C,29H.2
RRC A 
MOV C,29H.3
RRC A 
MOV 28H,A ;重新合成.结果存在28H.
MOV A,28H
MOV B,#10
DIV AB 
MOV 26H,A ;整数位高
MOV 25H,B ;整数位低 
;-------------------------
MOV A,2AH
MOV B,#10
DIV AB
MOV 40H,B ;高温限值个位 
MOV B,#10
DIV AB
MOV 41H,B;十位
MOV 42H,A;百位
;----------------------------
MOV A,2BH
MOV B,#10
DIV AB
MOV 43H,B ;低温限值位个位 
MOV B,#10
DIV AB
MOV 44H,B ;十位
MOV 45H,A ;百位

CLR C ;只在下上限两温度之间才能正常工作
MOV A,28H;现温度值与高温限值比较
SUBB A,2AH
JC BIG ;如果高.则关机器

CLR K_ON
AJMP CONVERT_END
BIG:CLR C 
MOV A,2BH;现温度与低温限值比较
SUBB A,28H
JC X_BIG ;低温限值比现温高,则开机器

CLR K_ON
AJMP CONVERT_END

X_BIG:
   SETB K_ON


CONVERT_END:
   RET 


DATA_CONV1 :
   MOV A,24H
SWAP A
ANL A,#0FH
MOV 46H,A
MOV A,24H
ANL A,#0FH
MOV 47H,A

MOV A,23H
SWAP A
ANL A,#0FH
MOV 48H,A
MOV A,23H
ANL A,#0FH
MOV 49H,A

MOV A,22H
SWAP A
ANL A,#0FH
MOV 4AH,A
MOV A,22H
ANL A,#0FH
MOV 4BH,A
RET
/*********显示时间TIME字符串及时间值***************/
DISPLAY_TIME: PUSH PSW
MOV P1,#11000000B
LCALL ENABLE
MOV DPTR,#TIME
MOV R1,#0
MOV R0,#6
LCALL DISPLAY
/***************/
MOV DPTR,#LED_DATA
MOV R1,46H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY


MOV DPTR,#LED_DATA
MOV R1,47H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,48H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,49H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,4AH //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,4BH //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY
POP PSW
RET



;********************显示温度*************************
DISPLAY_18B20_TEMP: ;LCD_显示子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB3;显示'WENDU:'
MOV R1,#0 ;码表初值
MOV R0,#7;字数
LCALL DISPLAY
;---------------显示温度值高位
MOV DPTR,#LED_DATA
MOV R1,26H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示温度值低位
MOV DPTR,#LED_DATA
MOV R1,25H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示小数点
MOV DPTR,#DOT
MOV R1,#0 ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示温度值小数高位
MOV DPTR,#LED_DATA
MOV R1,33H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示温度值小数低位
MOV DPTR,#LED_DATA
MOV R1,32H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示单位度
MOV DPTR,#SIGN
MOV R1,#0 ;码表初值
MOV R0,#2;字数
LCALL DISPLAY
RET 



;******************显示限值.*****************
DISPLAY_18B20_TEMP_XZ:
MOV P1,#11000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_L ; 显示'L:'
MOV R1,#0 ;码表初值
MOV R0,#2;字数
LCALL DISPLAY

;---------------显示温度限值高位
MOV DPTR,#LED_DATA
MOV R1,45H ;码表初值(45H中存的是十进制值)只是一位数百位,通过查表可找出相应ASCII值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示温度限值低位
MOV DPTR,#LED_DATA
MOV R1,44H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;-----------------
MOV DPTR,#LED_DATA
MOV R1,43H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY

MOV P1,#11000111B; 显示位置
LCALL ENABLE 
;----
MOV DPTR,#TAB_H ; 显示'H:'
MOV R1,#0 ;码表初值
MOV R0,#2;字数
LCALL DISPLAY
;---------------显示高温度限值高位
MOV DPTR,#LED_DATA
MOV R1,42H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;---------------显示高温度限值低位
MOV DPTR,#LED_DATA
MOV R1,41H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
;-------------------
MOV DPTR,#LED_DATA
MOV R1,40H ;码表初值
MOV R0,#1;字数
LCALL DISPLAY
RET 



      
;**********************提示语**********************
DISPLAY_18B20_HELLO:
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_HELLO
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
RET 

/*
DISPLAY_18B20_TESTING:
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB_TESTING
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
RET 
*/


DISPLAY_18B20_ERROR:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE
MOV DPTR,#TAB1
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
RET 



DISPLAY_WATING: 
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#TAB2
MOV R1,#0 ;码表初值
MOV R0,#13;字数
LCALL DISPLAy
RET 
DISPLAYINT_MUSIC:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#MUSICSTRING
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
DISPLAY_NAME:
MOV P1,#11000000B; 显示位置
LCALL ENABLE ;执行指令

MOV R1,#0 ;码表初值
MOV R0,#15;字数
LCALL DISPLAy
RET

STOPWATCH:DB '   STOPWATCH    '
STOPWATCH_INIT:DB '--00:00:00:00---'
DISPLAYINT_STOPWATCH_000000:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
MOV P1,#10000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#STOPWATCH
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
MOV P1,#11000000B; 显示位置
LCALL ENABLE ;执行指令
MOV DPTR,#STOPWATCH_INIT
MOV R1,#0 ;码表初值
MOV R0,#16;字数
LCALL DISPLAy
RET
 

MUSICSTRING:DB 'PLAYING... MUSIC'
MUSIC_NAME_15: DB '<JUST LOVE YOU>'
MUSIC_NAME_8: DB 'ZHOU_ZAI_XIANG_X'
MUSIC_NAME_9: DB 'SHUI_SHANG_PU_DE'
MUSIC_NAME_10: DB ' SHANG-HAI-TAN  '
MUSIC_NAME_11: DB 'GU-DAN-BEI-P-QIU'
MUSIC_NAME_12: DB 'TAO-HUA-DUO.-KAI'
MUSIC_NAME_13: DB 'DA-CHENG-XIAO_AI'

⌨️ 快捷键说明

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