?? irdacom.asm
字號:
; **************************************************************
; IrDA Data Communication Test Procedure
; **************************************************************
; PCON EQU 87H
; 定義端口
DOUT BIT P1.0 ; 數據輸出
DIN BIT P1.1 ; 數據輸入
SCLK BIT P1.2 ; 串行時鐘
CS BIT P1.3 ; 片選信號-低電平有效
IRQ BIT P3.2 ; 紅外通信中斷信號,在程序中輪詢
; RAM地址分配
TX1 EQU 10H ; 發送寄存器
TX2 EQU 11H ; 發送寄存器
RX1 EQU 12H ; 接收寄存器
RX2 EQU 13H ; 接收寄存器
; **************************************************************
ORG 00H
BEGIN:
MOV SP, #70H ; 堆棧初始化
CLR SCLK ; 清空時鐘線信號
; 初始化89C52的串口: 紅外方式工作在9600波特率
MOV TMOD, #20H ; T1的波特率
MOV TH1, #253 ; 重裝數值
MOV SCON, #50H
MOV PCON, #80H ; 波特率加倍
MOV TCON, #40H ; 計數器開始工作
; 初始化MAX3100串口--紅外方式工作在9600波特率
MOV TX1, #0E4H
MOV TX2, #0CAH ; 9600波特率,兩個停止位
CALL UTLK ; 串口寫
; ************************* 主程序循環 ***************************
LOOP:
JNB IRQ, URCV ; 判斷有數據
NRECV:
JBC RI, RCV51
JMP LOOP
; 從MAX3100接收,從8951發送
URCV:
MOV TX1, #0 ; 讀數據
MOV TX2, #0
CALL UTLK ; 將數據發送到RX
MOV A, RX2 ; 將數據送入累加器
MOV SBUF, A ; 發送RS-232信號
JMP LOOP
; 從MAX3100發送,從8951接收
RCV51:
MOV A, SBUF ; 從8951獲得數據
MOV TX1, #80H
MOV TX2, A ; 準備紅外數據
CALL UTLK ; 從紅外端口發送數據
JMP LOOP
; **************************************************************
; 子程序
; 完成16位數據的收發
; 從TX1、TX2發送16位比特;從RX1、RX2接收16位比特
UTLK:
CLR CS ; 片選工作
MOV A, TX1
CALL BYT8 ; 發送
MOV RX1, A ; 從RX1獲得數據
MOV A, TX2 ; 獲得高位字節
CALL BYT8 ; 發送
MOV RX2, A ; 從RX2獲得數據
SETB CS ; 關閉片選
RET
; **************************************************************
; 字節的移位
BYT8:
MOV R4, #8 ; 8位數據
SETB DIN
B8LP:
RLC A ; 載入高位字節
MOV DOUT, C ; 輸出
SETB SCLK ; 時鐘高電平
MOV C, DIN ; 獲得數據
CLR SCLK ; 時鐘低電平
MOV ACC.0, C ; 向ACC中放入第一個bit
DJNZ R4, B8LP ; 循環8bit
RET
; 代碼結束
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -