📄 success1.asm
字号:
;--------------------------------------------
;变量定义
;--------------------------------------------
DQ BIT P2.4
MSB EQU 30H
LSB EQU 31H
INTEG EQU 32H
DECIM EQU 33H
SEG_S EQU 34H
SEG_I2 EQU 35H
SEG_I1 EQU 36H
SEG_D1 EQU 37H
XIAO EQU 38H
GEW EQU 39H
SHI EQU 40H
FLAG1 BIT 00H
SIGN BIT 01H
;--------------------------------------------
;主程序
;--------------------------------------------
ORG 0000H
LJMP START
START:
;设置堆栈初始地址
MOV SP,#80H
;关总中断
CLR EA
;T1设置(波特率)
MOV TMOD,#20H ;T1工作于方式2,定时功能
MOV TH1, #0FDH
MOV TL1, #0FDH ;波特率为9600
SETB TR1 ;开启T1
;串口设置
MOV PCON, #00H ;SOMD=0
MOV SCON, #50H;串口工作方式1(10位UART,波特率可变),REN=0 禁止接收
;关串口中断
CLR ES
;开总中断
SETB EA ; 总中断开放
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
MOV 34H,#00H
MOV 35H,#00H
MOV 36H,#00H
MOV 37H,#00H
MOV 38H,#00H
MOV 39H,#00H
MOV 40H,#00H
BAI_LOOP:
CLR FLAG1
CLR SIGN
LCALL INIT_1820 ;初始化1820
LCALL GET_TEMPER ;读取转换数据
LCALL DATA_PROC ;数据处理
LCALL SEG_GEN ;生成显示码
LCALL DISPLAY ;数码显示
LCALL SEND ;发送
LCALL DELAY ;延时
SJMP BAI_LOOP
;-------------------------------------------------------------
;子程序 N.
;这是DS18B20复位初始化子程序
;-------------------------------------------------------------
INIT_1820:
CLR EA
SETB DQ
NOP
L0:CLR DQ
MOV R1,#3 ;主机发出延时707.5US的复位低脉冲
TSR1:
MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB DQ
MOV R2,#27
DJNZ R2,$
CLR C
ORL C,DQ
JC L0
MOV R6,#120
L1:ORL C,DQ
JC L3
DJNZ R6,L1
SJMP L0
L3:MOV R2,#221
L2:DJNZ R2,L2
SETB FLAG1
RET
;-------------------------------------------------------------
;子程序 N.
;读出转换后的温度
;-------------------------------------------------------------
GET_TEMPER:
CLR EA ;使用传感器时禁止中断产生
SETB DQ ;拉高数据线
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2 ;如果检测到DS18B20,则跳转到TSS2
CLR DQ
RET ;判断DS1820是否存在?若不存在则返回
TSS2:
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820 ;调用写DS18B20指令,将累加器中的指令写进DS18B20中
MOV A,#44H ;发出温度转换指令
LCALL WRITE_1820 ;调用写DS18B20指令,将累加器中的命令写进DS18B20中
;等待A/D转换结束,12位的话750微秒
LCALL DELAY
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;将读出的温度数据保存到LSB,MSB
SETB EA
RET
;--------------------------------------------------------------
;子程序 N.
;写DS18B20的子程序(有具体的时序要求)
;--------------------------------------------------------------
WRITE_1820:
CLR EA
MOV R2,#8 ;一共8位数据
CLR C ;清除进位标志位
WR1:
CLR DQ
NOP
NOP
NOP
NOP
NOP
RRC A ;将累加器中的数据带进位右移
MOV DQ,C ;将进位位写进DS18B20后,等待
MOV R3,#26
DJNZ R3,$ ;完成1bit的写操作
SETB DQ ;拉高数据线,初始化写
NOP
DJNZ R2,WR1 ;如果一个字节没写完,继续写
SETB DQ ;拉高数据线
SETB EA
RET
;-----------------------------------------------------------------
;子程序 N.
;读DS18B20的子程序(有具体的时序要求)
;-----------------------------------------------------------------
READ_18200:
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
CLR EA
MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#31H ;低位存入LSB,高位存入MSB
RE00:
MOV R2,#8 ;数据一共有8位
RE01:
CLR C ;清除进位标志位
SETB DQ ;拉高数据线后,等待1微秒初始化读
NOP
NOP
NOP
CLR DQ ;拉低数据线后,保持1微秒以上使读初始化有效
NOP
NOP
NOP
SETB DQ ;拉高数据线后,开始读操作
NOP
NOP
MOV C,DQ ;将数据读入累加器
MOV R3,#28
RE20:
DJNZ R3,RE20 ;等待60微秒以上后,进行下一次读操作
RRC A ;将累加器带进位右移
DJNZ R2,RE01 ;如果没读满一个字节,继续读取数据
MOV @R1,A ;将累加器中的数据存储进地址29H
DEC R1
DJNZ R4,RE00 ;继续读取高位
SETB EA
RET
;---------------------------------------------
;子程序 N.
;数据处理子程序,判断正负,并且分离转换值的整数和小数部分
;符号位为SIGN,0为正,1为负
;整数部分存放在INTEG中,小数部分存放在DECIM中(与时序没有关系)
;----------------------------------------------
DATA_PROC:
CLR C
CLR SIGN
MOV A,MSB
RLC A
JC NEG ;判断符号
LJMP PROCE
NEG:CLR C ;负数取补码
SETB SIGN
MOV A,LSB
CPL A
ADD A,#1
MOV LSB,A
MOV A,MSB
CPL A
ADDC A,#0
MOV MSB,A
PROCE: ;分离小数与整数并存储于INTEG和DECIM
MOV A,LSB
ANL A,#0FH
MOV DECIM,A
MOV A,MSB
SWAP A
ANL A,#0F0H
MOV INTEG,A
MOV A,LSB
SWAP A
ANL A,#0FH
MOV R0,INTEG
ORL A,R0
SUBB A,#10
MOV INTEG,A
RET
;----------------------------------------------
;子程序 N.
;生成显示码子程序
;将四个段码分别存于SEG_S SEG_I2 SEG_I1 SEG_D1
;----------------------------------------------
SEG_GEN:
MOV DPTR,#TABLE
JB SIGN,S_NEG
MOV SEG_S,#00H
SJMP S_INT
S_NEG:
MOV SEG_S,#40H ;确定了符号段码
S_INT:
MOV A,INTEG
MOV B,#10
DIV AB
MOV SHI,A
MOV GEW,B
MOVC A,@A+DPTR
MOV SEG_I2,A ;确定了十位段码
MOV A,B
MOVC A,@A+DPTR
ORL A,#80H
MOV SEG_I1,A ;确定了个位段码,并加小数点
MOV DPTR,#FLOAT_TAB
MOV A,DECIM
MOVC A,@A+DPTR
MOV XIAO,A
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV SEG_D1,A ;确定了小数段码
RET
;-------------------------------------------------
;子程序 N.
;发送子程序
;-------------------------------------------------
SEND: MOV 20H,#30H
MOV A,XIAO
MOV DPTR,#ASCII
MOVC A,@A+DPTR
MOV 21H,A
MOV A,GEW
MOV DPTR,#ASCII
MOVC A,@A+DPTR
MOV 22H,A
MOV A,SHI
MOV DPTR,#ASCII
MOVC A,@A+DPTR
MOV 23H,A
MOV A,20H
MOV SBUF, A
JNB TI,$
CLR TI
MOV A,21H
MOV SBUF, A
JNB TI,$
CLR TI
MOV A,22H
MOV SBUF, A
JNB TI,$
CLR TI
MOV A,23H
MOV SBUF, A
JNB TI,$
CLR TI
RET
;-------------------------------------------------
;子程序 N.
;显示子程序,用四位数码管显示
;-------------------------------------------------
DISPLAY:
MOV P0,#0FFH
CLR P0.0
MOV P1,SEG_S
LCALL DELAY
SETB P0.0
CLR P0.1
MOV P1,SEG_I2
LCALL DELAY
SETB P0.1
CLR P0.2
MOV P1,SEG_I1
LCALL DELAY
SETB P0.2
CLR P0.3
MOV P1,SEG_D1
LCALL DELAY
SETB P0.3
RET
;--------------------------------------------------------------
;子程序 N.
;1ms延时子程序
;--------------------------------------------------------------
D1MS:
MOV R5,#2
D1:MOV R6,#229
DJNZ R6,$
DJNZ R5,D1
RET
;--------------------------------------------------------------
;子程序 N.
;5.4ms延时子程序
;--------------------------------------------------------------
DELAY:
MOV R5,#10
D2:MOV R6,#248
DJNZ R6,$
DJNZ R5,D2
RET
TABLE: DB 03FH,06H,5BH,4FH,66H,06DH,07DH,07H,07FH,06FH
FLOAT_TAB: DB 00,01,01,02,03,03,04,04,05,06,06,07,08,08
DB 09,09
ASCII: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -