?? wrs485r.asm
字號:
;參考程序D://文件名:WRS485R.asm接收對方發來的字符(ASCII),LCD顯示R>abcd
;實驗儀通過UART1實現RS-485通信,運行前應將TX1和P00 短 接,RX1和P01短接.
;當接收到數據后,再將接收到的數據送出。
;WRS485.ASM 用UART1外擴MAX485實現RS-485通信,運行前將TX1和P00 短接,
;RX1和 P01短接,當接收到一個數據后,再將接收到的數據送出。
;WRS485R.ASM
$include (c8051f020.inc) ;SFR declarations
SYSCLK EQU 11059200 ; SYSCLK frequency in Hz
BAUDRATE EQU 9600 ;Baud rate of UART in bps
BUZ EQU P3.5
P32 EQU P3.2 ;接收/發送控制
TIMER1 EQU SYSCLK/BAUDRATE/16
ReceiveBit EQU 20H.0
ORG 0
AJMP main
ORG 0A3H
AJMP UART1_ISR
ORG 0100H
main:
MOV WDTCN,#0deH ;關看門狗
MOV WDTCN,#0adH
CLR ReceiveBit
LCALL SYSCLK_Init ;初始化晶體
LCALL PORT_Init ;初始化交叉開關和I/O口
LCALL UART1_Init ;初始化UART0
LCALL LCD_Init ;LCD初始化
SETB EA ;使能總中斷標志
ORL EIE2,#40H ;使能UART1中斷
CLR P32 ;接收模式
MOV P7,#52H ;顯示R>
MOV P6,#0CH
MOV P6,#0DH
LCALL Delay
MOV P7,#3EH
MOV P6,#0CH
MOV P6,#0DH
LCALL Delay
LOOP:
JNB ReceiveBit,LOOP ;接收到一個數據
CLR ReceiveBit ;清接收位
MOV A,R1 ;接收空字符不顯示
JZ LOOP
MOV P7,A ;顯示接收字符
MOV P6,#0CH
MOV P6,#0DH
MOV SBUF1,R1
LJMP LOOP
RET
;使能外部11.0592MHz晶體作為系統時鐘
SYSCLK_Init:
MOV OSCXCN, #67h ;使能外部晶體
CLR A ;等待最少1ms
DJNZ acc, $ ;等待512us
DJNZ acc, $ ;等待512us
osc_wait: ;查詢XTLVLD-->1
MOV a, OSCXCN
JNB acc.7, osc_wait
ORL OSCICN, #08h ;選擇外部晶體作為系統時鐘
RET
;初始化I/O口
PORT_Init:
ORL XBR2,#44H ;使能UART1,交叉開關和弱上拉
ORL P0MDOUT,#01H ;使能TX1作為推挽輸出
ORL P1MDOUT,#40H ;使能LED作為推挽輸出
ORL P3MDOUT,#0dfH
MOV P74OUT,#0FFH ;P4-P7口設為推挽方式
RET
UART1_Init:
MOV SCON1,#50H ;SCON1: 模式1, 8位UART,使能RX
MOV TMOD,#20H ;TMOD: 定時器1, 模式2, 8位重載
MOV TH1,#0B8H ;設置作為波特率定時器1的重載值
;TH1=256-11059200/9600/16=256-72=184=0B8H
SETB TR1 ;開定定時器1
ORL CKCON,#10H ;定時器1用系統時鐘作為時基
ORL PCON,#10H ;SMOD1 = 1
RET
;UART1的中斷服務子程序
UART1_ISR:
MOV A,SCON1
ANL A,#01
CJNE A,#01H,U_I
ANL SCON1,#NOT(01H) ;請接收標志位
MOV A,SBUF1; ;保存接收數據
MOV R1,A
SETB ReceiveBit ;置接收位
U_I:
ANL SCON1,#NOT(02H) ;清發送標志位
RETI
;延時子程序
Delay: MOV R7, #08h
Delay1: MOV R6, #80h
Delay0: MOV R5, #00h
DJNZ R5, $
DJNZ R6, Delay0
DJNZ R7, Delay1
RET
;LCD初始化
LCD_Init:
MOV P6,#09H
LCALL Delay
MOV P7,#038H ;兩行顯示
MOV P6,#08H
MOV P6,#09H
LCALL Delay
MOV P7,#0EH ;開顯示,開光標,字符不閃爍
MOV P6,#08H
MOV P6,#09H
LCALL Delay
MOV P7,#06H ;I/D=1,AC自動增1;S=0,整體顯示不移動
MOV P6,#08H
MOV P6,#09H
LCALL Delay
MOV P7,#01H ;清除DDRAM,置AC=0
MOV P6,#08H
MOV P6,#09H
LCALL Delay
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -