📄 wlm74uart0.asm
字号:
;参考程序; WLM74UART0.ASM 程序功能: 采用UART方式0与LM74通信。
;用P0.7作片选,主机通过TXD发送时钟信号,实现同步通信,半双工.RXD
;作双向数据线.用六位数码管显示LM74采集的温度值:029.5C
$include (c8051f020.inc) // SFR declarations
PPA EQU 8000H ;8255的端口地址,8255驱动数码管显示温度值
PPB EQU 8001H ;8255驱动数码管显示LM74测量出的温度值
PPC EQU 8002H ;LM74是高精度数字式温度传感器
CWR EQU 8003H
ORG 0
CS EQU P0.7
MAIN: MOV WDTCN,#0DEH ;关看门狗
MOV WDTCN,#0ADH
LCALL PORT_Init ;初始化I/O口
ACALL INIT74 ;初始化LM74
TES: ACALL READLM74 ;从LM74中读出当前温度值,并加以整理
LCALL DISPLED ;成为LED数码管可显示的格式
AJMP TES
INIT74 : CLR CS
MOV A,#0h ;CONTINUE MODE
ACALL WR_16BIT
SETB CS
RET
READLM74: CLR CS
ACALL IN_16BIT ;READ TEMPERATURE
SETB CS
MOV A,43H ; 2x(41h)+2x(42h)
RLC A
MOV A,42H
RL A
ADDC A,#0
ACALL EXCH
MOV 7DH,#0 ;
MOV A,43H
ANL A,#40H
CJNE A,#40H,PP1 ;加上小数点.
MOV 7DH,#5H
PP1: MOV 7EH,#0CH
MOV 79H,#0
MOV A,42H ;从42H最高位位符号判别位,
ANL A,#80H
CJNE A,#80H,PP2 ; 正号:79H<--#0
MOV 79H,#40H ;负号: 79H<--#40H ("-")
PP2: RET
WR_8BIT:MOV SBUF0,A
JNB TI,$
CLR TI
RET
IN_8BIT: SETB REN
JNB RI,$
CLR REN
CLR RI
MOV A,SBUF0
RET
IN_16BIT:SETB REN ;读出的原始数据在40H,41H中。
JNB RI,$
CLR REN
CLR RI
MOV A,SBUF0
MOV 40h,A
SETB REN
JNB RI,$
CLR REN
CLR RI
MOV A,SBUF0
MOV 41H,A
ACALL EXCHG0 ;初步整理(倒置)后的数据存放在42H,43H中。
MOV 43H,A
MOV B,A
MOV A,40H
ACALL EXCHG0
MOV 42H,A
RET
EXCHG0: RRC A ;因从LM74读出数据的顺序为:D15,D14。。。D0,故应倒置。
MOV 7H,C
RRC A
MOV 6H,C
RRC A
MOV 5H,C
RRC A
MOV 4H,C
RRC A
MOV 3H,C
RRC A
MOV 2H,C
RRC A
MOV 1H,C
RRC A
MOV 0H,C
MOV A,20H
RET
WR_16BIT: MOV SBUF0,A ;CPU写入16位数据到LM74
JNB TI,$
CLR TI
MOV SBUF0,#0h
JNB TI,$
CLR TI
RET
EXCH : MOV B,#10 ;化为四位十进制数
DIV AB
MOV 7CH,B ; 7AH存百位数
MOV B,#10
DIV AB
MOV 7AH,A ; 7BH存十位数
MOV A,B
MOV 7BH,A
MOV A,7CH ; 7CH存个位数
MOV 7CH,A
RET
DEL0:MOV R6,#0FH
TM: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,TM
RET
;长延时子程序
DELY:MOV R5,#0FFH
TTM1: ACALL DEL0
DJNZ R5,TTM1
RET
DELYL:MOV R5,#0FFH
TTM2:CALL DEL0
DJNZ R5,TTM2
RET
;TEMP: DB 54H,45H,4DH,50H,3AH,20H
PORT_Init: ;初始化I/O口
MOV XBR0,#04H ;交叉开关使能TXD,RXD
MOV XBR2,#40H ;使能交叉开关和弱上拉
MOV P0MDOUT ,#01 ;选择P0.0为推拉方式,P0.1为漏极开路
MOV 0E3H,#40H ; 使能交叉开关,弱上拉
MOV P74OUT,#3FH ;设置P7为漏极开路P4,P5,P6为推拉模式.
MOV EMI0CF,#2CH ;EMIF工作在地址/数据复用方式,只用外部存储器,
; ALE高/低脉宽占1个SYSCLK周期(EMIOCF)
MOV EMI0TC,#6DH ;地址建立/保持时间占1个SYSCLK周期,/WR和/RD占12个SYSCLK周期(EMIOTC)
MOV SCON0,#0 ;设定串口方式0(UART为同步移位方式 )
RET
;显示功能子程序:被显示的数据在79H,7AH,7BH,7CH,7DH,7EH中
DISPLED: ACALL C8255 ;格式样品: +/-029.5C
MOV R2,#01H
MOV R5,#6
MOV R0,#79H
DSP1: MOV DPTR,#PPB
MOV A,R2
MOVX @DPTR,A
MOV A,@R0
ANL A,#0FH
DSP2: MOV DPTR,#BCD
MOVC A,@A+DPTR
MOV B,A
MOV DPTR,#PPC
MOV A,R5
CJNE A,#3,SS0
MOV A,B
ADD A,#80H
AJMP SS1
SS0: MOV A,B
SS1: MOVX @DPTR,A
ACALL DEL0
MOV A,R2
RL A
MOV R2,A
INC R0
DJNZ R5,DSP1
RET
BCD: DB 3FH,06H,5BH,4FH ;显示数值,0,1,2,3
DB 66H,6DH,7DH,07H ;4,5,6,7
DB 7FH,6FH,77H,7CH ;8,9,A,B
DB 39H,5EH,79H,71H ;C,D,E,F
DB 73H,3EH,31H,6EH ;P,U,Z,Y
DB 0FFH,00H ;8,灭
C8255: MOV A,#80H ; 设置PC口,PB口为输出,PA口为输入
MOV DPTR,#CWR ;#8003H为8255的控制寄存器地址
MOVX @DPTR,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -