?? wrs232c.asm
字號:
;參考程序A: ;WRS232C.ASM 程序?qū)崿F(xiàn)RS-232通信,運行前將TX0和P00 短接,RX0和
;P01短接,當(dāng)接收到一個數(shù)據(jù)后,再將接收到的數(shù)據(jù)送出。
$include (c8051f020.inc) ;SFR declarations
BAUDRATE EQU 9600 ;UART0的波特率
SYSCLK EQU 11059200 ;系統(tǒng)時鐘頻率
BUZ EQU P3.5 ;P3.5=0,響蜂鳴器
ReceiveBit EQU 20H.0 ;接收標(biāo)志位
ORG 0
LJMP main
ORG 23H ; UART0中斷入口
AJMP UART0_ISR
ORG 0100H
main: MOV WDTCN,#0deH ;關(guān)看門狗
MOV WDTCN,#0adH
CLR ReceiveBit ;清除標(biāo)志位
LCALL SYSCLK_IniT ;初始化外部晶體
LCALL PORT_Init ;初始化交叉開關(guān)和I/O口
LCALL UART0_Init ;初始化UART0
SETB EA
SETB ES
LOOP: JNB ReceiveBit,LOOP ;是否接收到一個數(shù)據(jù)
CLR ES ;關(guān)串口中斷0
CLR EA ;關(guān)總中斷
CLR ReceiveBit ;清接收標(biāo)志位
LCALL Delay ;延時
MOV A,R1
MOV SBUF0,A ;將接收到數(shù)據(jù)送出
TINT: JNB TI,TINT ;發(fā)送標(biāo)志位是否產(chǎn)生
CLR TI ;清發(fā)送標(biāo)志位
CLR BUZ ;蜂鳴器響
LCALL Delay ;延時
SETB BUZ ;蜂鳴器滅
SETB ES ;開中斷標(biāo)志
SETB EA
LJMP LOOP
RET
;用外部晶體11.0592MHz作為系統(tǒng)時鐘
SYSCLK_Init:
MOV OSCXCN, #67h ;使能外部晶體 ,11.0592MHZ 不分頻
CLR A ;等待至少1ms
DJNZ acc, $ ;等待512us
DJNZ acc, $ ;等待512us
osc_wait: ;查詢XTLVLD-->1?
MOV a, OSCXCN
JNB acc.7, osc_wait
ORL OSCICN, #08h ;選擇外部晶體作為系統(tǒng)時鐘
RET
;初始化交叉開關(guān)和I/O口
PORT_Init:
MOV XBR0,#04H ;使能UART0
MOV XBR1,#00H
MOV XBR2,#40H ;使能交叉開關(guān)和弱上拉
ORL P0MDOUT,#01H ;使能TX0作為推挽輸出
ORL P3MDOUT,#0H ;使能P3.5 作為推挽輸出,驅(qū)動蜂鳴器.
RET
;UART0 用T1作波特率發(fā)生器
UART0_Init:
MOV SCON0,#50H ;SCON0: 模式1, 10-bit UART, 使能RX
MOV TMOD,#20H ;TMOD: 定時器T1, 模式2, 8-bit 自動重載
MOV TH1,#0B8H ;設(shè)置定時器1作為波特率的重載值
;TH1=256-11059200/9600/16=256-72=184=0B8H
SETB TR1 ;打開定時器1
ORL CKCON,#10H ;定時器1用系統(tǒng)時鐘作為它的時基
ORL PCON,#80H ;SMOD0 = 1;波特效率加倍
RET
;串口中斷0服務(wù)子程序
UART0_ISR:
JB TI,SENDINT ;是發(fā)送中斷還是接收中斷
CLR RI ;清接收標(biāo)志位
MOV A,SBUF0
MOV R1,A ;保存接收到的數(shù)據(jù)
SETB ReceiveBit ;置接收標(biāo)志
SENDINT:
CLR TI ;清發(fā)送標(biāo)志位
RETI
;延時子程序
Delay:
MOV R7, #18h
Delay1:
MOV R6, #80h
Delay0:
MOV R5, #00h
DJNZ R5, $
DJNZ R6, Delay0
DJNZ R7, Delay1
RET
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -