📄 mycom1.asm
字号:
;//----------------------串行通讯模块(zjp伟福仿真环境WAVE+Keil C51+89C51 编译通过\运算逻辑正常 )
;//
;//本模块需要:主程序模块初始化串行中断。
;//这是一个独立通讯模块只需要在工程中包含进去就可以使用。
;//[模块文件]...[加入模块文件 MYCOM.ASM]
;//不要在主程序再出现 ORG 0023H LJMP RS232 的中断程序
;//主程序例如你的去掉原有通讯部分:
; ORG 0000H
; LJMP Main
; ORG 0030H
;Main:
; MOV TMOD,#20H
; MOV TH1,#0f3H
; MOV TL1,#0f3H
; MOV PCON,#80H
; MOV TCON,#40H; SETB TR1
; MOV SCON,#50H
; MOV IE,#90H
;MainLoop:
; LJMP MainLoop
;//常数定义《 接收数据缓冲区BUFF 40-45》 内部RAM地址缓冲区6个字节(如果发送数据太多改为xdata做缓冲)
BUFF_ADR_STR EQU 040H ;
BUFF_ADR_END EQU 045H ;
BUFF_LEN_VAL EQU 06H ;
;//简单处理直接内部定义发送地址
OUT_NOW_PTR EQU 046H ;存放发送数据记数地址单元
OUT_DATA_LEN EQU 047H ;存放发送数据长度地址单元
OUT_DATA_BUFF EQU 048H ;存放发送数据缓冲地址单元
;//定位段地址
CSEG AT 0023H
LJMP MYCOM
;//串口中断程序
?PR?MYCOMUSE?MYCOM SEGMENT CODE ;//声明代码段
PUBLIC MYCOM ;//输出函数名MYCOM(不带参数)
RSEG ?PR?MYCOMUSE?MYCOM ;//这个函数可被连接器放置在MYCOM
USING 0 ;//使用第一组寄存器
MYCOM: PUSH ACC
PUSH PSW
PUSH 00
PUSH 01
JNB RI,RIEXIT
CLR RI
;//------------------通讯接收程序开始() 6字节缓冲区
MOV A,SBUF;接收新数据
MOV R1,#BUFF_LEN_VAL;//移位长度
MOV R0,#BUFF_ADR_STR;//缓冲地址
?LOP1:
XCH A,@R0
INC R0
DJNZ R1,?LOP1
;//------------------通讯接收程序结束
;//接受字符保存在BUFF[内部RAM:BUFF_ADR_STR--BUFF_ADR_END]地址中
;//------------------字符串简单处理开始(注意:是简单不费时的可以放在通讯中断中原因在下面)
;//接收比较程序1 ----》 "OK"->HEX (4F 4B) 比较地址 (41-40)2个字节
MOV R0,#BUFF_ADR_STR+1;//地址送入41
CJNE @R0,#4FH,?COMP1_EXIT
DEC R0
CJNE @R0,#4BH,?COMP1_EXIT
;//收到“OK”处理程序
;OK_SUB1
?COMP1_EXIT:
;//-------------------
;//接收比较程序2 ----》 "OKO"->HEX (4F 4B 4F) 比较地址 (42-40)3个字节
MOV R0,#BUFF_ADR_STR+2;//地址送入42
CJNE @R0,#4FH,?COMP2_EXIT
DEC R0
CJNE @R0,#4BH,?COMP2_EXIT
DEC R0
CJNE @R0,#4FH,?COMP2_EXIT
;//收到“OKO”处理程序
;OK_SUB2
?COMP2_EXIT:
;//------------------字符串简单处理结束
RIEXIT: ;//(接收数据出口)
;//***********************************************************************************
;//***********************************************************************************
;//-------------------中断发送数据程序开始
;//89C51串口为全双工结构表示可以同时发送和接收它还具有接收缓冲在第一个字节从寄存器读出之前
;//可以开始接收第二个字节但是如果第二个字节接收完毕时第一个字节仍未读出其中一个字节将会丢失
;//串口的发送和接收寄存器都是通过SFR SBUF 进行访问的写入SBUF 的数据装入发送寄存器对SBUF
;//的读操作是对物理上分开的接收寄存器进行访问.
;//因此你不能把比较费时的工作放在串行中断内处理,包括你的接收程序部分
;//具体评估方法:可以在仿真环境中查看运行时间是否满足通讯处理时间间隔要求
;//** -------------------------简单发送机制-直接定义发送缓冲地址(全部间接寻址) **
;//** 只需要把发送数据长度填入47H单元 设置46H单元为1 把发送数据地址写入 48H单元 **
;//** 把发送数据的第一个数据写入SBUF 就可以中断自动发送数据 **
;//** 数据发送结束后46H单元变为0 (可以用来检测当前是否正在进行串口发送数据的通讯)**
;//***********************************************************************************
;//***********************************************************************************
JNB TI,TIEXIT ;//通讯发送中断(你要准备好发送缓冲区)
CLR TI
MOV R1,#OUT_DATA_LEN ;//取发送数据长度地址
MOV A,@R1
MOV R1,A
MOV R0,#OUT_NOW_PTR ;//取当前发送记数地址
MOV A,@R0
CLR C
SUBB A,R1
JNC ?C0001 ;//(比较数据SEND_NOW_PTR<SEND_DATA_LEN)
;//************发送数据没有结束--继续发送数据
MOV R1,#OUT_DATA_BUFF ;//取存放发送数据地址单元
MOV A,@R1
MOV R1,A
MOV A,@R0 ;//发送记数
ADD A,R1 ;//获取本次发送地址
MOV R1,A ;//寄存器间接寻址
MOV A,@R1 ;//取发送数据
MOV SBUF,A ;//发送数据
INC @R0 ;//调整发送记数指针
;//************继续发送-》处理数据结束
SJMP TIEXIT
?C0001:
;//发送数据结束
CLR A
MOV R0,#OUT_NOW_PTR ;//取当前发送记数地址
MOV @R0,A ;//清除发送记数
;//退出中断发送数据
TIEXIT:
;//***********************************************************************************
;//** 发送部分软件编译通过+程序逻辑验证通过 2003-11-4 **
;//***********************************************************************************
;//-------------------中断发送数据程序结束
POP 01
POP 00
POP PSW
POP ACC
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -