📄 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 + -