?? wlm74uart0.asm
字號:
;參考程序; WLM74UART0.ASM 程序功能: 采用UART方式0與LM74通信。
;用P0.7作片選,主機(jī)通過TXD發(fā)送時(shí)鐘信號,實(shí)現(xiàn)同步通信,半雙工.RXD
;作雙向數(shù)據(jù)線.用六位數(shù)碼管顯示LM74采集的溫度值:029.5C
$include (c8051f020.inc) // SFR declarations
PPA EQU 8000H ;8255的端口地址,8255驅(qū)動數(shù)碼管顯示溫度值
PPB EQU 8001H ;8255驅(qū)動數(shù)碼管顯示LM74測量出的溫度值
PPC EQU 8002H ;LM74是高精度數(shù)字式溫度傳感器
CWR EQU 8003H
ORG 0
CS EQU P0.7
MAIN: MOV WDTCN,#0DEH ;關(guān)看門狗
MOV WDTCN,#0ADH
LCALL PORT_Init ;初始化I/O口
ACALL INIT74 ;初始化LM74
TES: ACALL READLM74 ;從LM74中讀出當(dāng)前溫度值,并加以整理
LCALL DISPLED ;成為LED數(shù)碼管可顯示的格式
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 ;加上小數(shù)點(diǎn).
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 ;負(fù)號: 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 ;讀出的原始數(shù)據(jù)在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 ;初步整理(倒置)后的數(shù)據(jù)存放在42H,43H中。
MOV 43H,A
MOV B,A
MOV A,40H
ACALL EXCHG0
MOV 42H,A
RET
EXCHG0: RRC A ;因從LM74讀出數(shù)據(jù)的順序?yàn)椋篋15,D14。。。D0,故應(yīng)倒置。
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位數(shù)據(jù)到LM74
JNB TI,$
CLR TI
MOV SBUF0,#0h
JNB TI,$
CLR TI
RET
EXCH : MOV B,#10 ;化為四位十進(jìn)制數(shù)
DIV AB
MOV 7CH,B ; 7AH存百位數(shù)
MOV B,#10
DIV AB
MOV 7AH,A ; 7BH存十位數(shù)
MOV A,B
MOV 7BH,A
MOV A,7CH ; 7CH存?zhèn)€位數(shù)
MOV 7CH,A
RET
DEL0:MOV R6,#0FH
TM: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,TM
RET
;長延時(shí)子程序
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 ;交叉開關(guān)使能TXD,RXD
MOV XBR2,#40H ;使能交叉開關(guān)和弱上拉
MOV P0MDOUT ,#01 ;選擇P0.0為推拉方式,P0.1為漏極開路
MOV 0E3H,#40H ; 使能交叉開關(guān),弱上拉
MOV P74OUT,#3FH ;設(shè)置P7為漏極開路P4,P5,P6為推拉模式.
MOV EMI0CF,#2CH ;EMIF工作在地址/數(shù)據(jù)復(fù)用方式,只用外部存儲器,
; ALE高/低脈寬占1個(gè)SYSCLK周期(EMIOCF)
MOV EMI0TC,#6DH ;地址建立/保持時(shí)間占1個(gè)SYSCLK周期,/WR和/RD占12個(gè)SYSCLK周期(EMIOTC)
MOV SCON0,#0 ;設(shè)定串口方式0(UART為同步移位方式 )
RET
;顯示功能子程序:被顯示的數(shù)據(jù)在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 ;顯示數(shù)值,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(xiàn)
DB 73H,3EH,31H,6EH ;P,U,Z,Y
DB 0FFH,00H ;8,滅
C8255: MOV A,#80H ; 設(shè)置PC口,PB口為輸出,PA口為輸入
MOV DPTR,#CWR ;#8003H為8255的控制寄存器地址
MOVX @DPTR,A
RET
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -