此程序通过RS232接口完成PC机和单片机通信
----------------------------------------------------------------
寄存器定义
RX_Reg
D1 最终数据保存寄存器1
D2 最终数据保存寄存器2
D3 最终数据保存寄存器3
A
A1
A2
A3 最终地址保存寄存器
C
C1
B 存储区选择(0-F)
E 寄存器下移计数
S 发送前临时寄存器
S1
F 发送校验累加寄存器
-----------------------------------------------------
org 0x00
goto main
org 0x08
goto intserve
org 0x30
------------------
初始化
initial nop
clrf F
movlw 0x19 ; 选择传输波特率为9600
movwf spbrg
movlw 0x04 ; 选择异步高速传输8位数据
movwf txsta
movlw 0x80 ; 允许串行口工作
movwf rcsta
bcf trisg, 1 ; 将RG1,RG2设置为输出、入口
bsf trisg, 2
bsf txsta, txen ;发送允许
bsf rcsta, cren ;接收数据允许
bsf pie1, rcie ;接受中断使能
movlw 0xc0 ;总中断和外围中断允许
movwf intcon
return
-------------------------------
主程序
main nop
call initial
loop goto loop
end
-------------------------------------------------------------------
中断服务子程序
intserve btfss pir1, rcif ; 接受中断标志为1
goto err_re ; 误操作,返回
movff rcreg, RX_Reg ; 否则,将接受的数据送到W寄存器
movff RX_Reg, A ; 将接受的字符数据(十六进制)送至寄存器A,以便相加
X movlw 58H
subwf RX_Reg,w
btfss status,Z ;判断所接受的字符是否为“X”
goto Y
call RX.P
call RX.A
movff A2, A3
call RX.J
call TX.8X
Y movlw 59H
subwf RX_Reg,w
btfss status,Z ;判断所接受的字符是否为“Y”
goto R
call RX.P
call RX.A
movff A2, A3
call RX.A ;接受第一字节8位数据
movff A2, D1
call RX.J
call TX.8Y
R movlw 52H
subwf RX_Reg,w
btfss status,Z ;判断所接受的字符是否为“R”
goto W
call RX.P
call RX.A
movff A2, A3
call RX.J
call TX.16R
W movlw 57H
subwf RX_Reg,w
btfss status,Z ;判断所接受的字符是否为“W”
goto L
call RX.P ; 接受存储区选择位数据
call RX.A ;接受存储区地址数据
movff A2, A3
call RX.A ;接受第一字节8位数据
movff A2, D1
call RX.A ;接受第二字节8位数据
movff A2, D2
call RX.J ;接受校验数据
call TX.16W
L movlw 4CH
subwf RX_Reg,w
btfss status,Z ;判断所接受的字符是否为“L”
goto M
call RX.P
call RX.A
movff A2, A3
call RX.J
call TX.32L
M movlw 4DH
subwf RX_Reg,w
btfss status,Z ;判断所接受的字符是否为“M”
goto err_re
call RX.P
call RX.A
movff A2, A3
call RX.A ;接受第一字节8位数据
movff A2, D1
call RX.A ;接受第二字节8位数据
movff A2, D2
call RX.A ;接受第三字节8位数据
movff A2, D3
call RX.J
call TX.32M
err_re nop
retfie
---------------------------------------------------------------------------------------------------------------------------
RX.P btfss pir1, rcif
goto RX.P ; 误操作,等待
movff rcreg, B ; 否则,将接受的存储区选择位送到B寄存器
movff B , A ;将接受的数据(H)送到A寄存器,以便相加
btfss B, 6 ; 判断存储区(0-9)和(A-F)
call 0-9
call A-F
movff B,B1
return
RX.A btfss pir1, rcif
goto RX.A ; 误操作,等待
movff rcreg, B ; 否则,将接受的数据(H)送到B寄存器
movf B, w ;将接受的数据(H)送到A寄存器,以便相加
addwf A, 1,0
btfss B, 6 ; 判断存储区(0-9)和(A-F)
call 0-9
call A-F
movff B, A1
RX.A0 btfss pir1, rcif
goto RX.A0 ; 误操作,等待
movff rcreg, B ; 否则,将接受的数据(L)送到B寄存器
movf B, w ;将接受的数据(L)送到A寄存器相加,保存至W寄存器
addwf A, 1,0
btfss B, 6 ; 判断存储区(0-9)和(A-F)
call 0-9
call A-F
movff B, A2
swapf A1, w ;将接受的数据(H)高4位与低4位互换,以便与数据(L)组成完整8位数据
addwf A2, 1,0 ; 将完整数据保存至A2寄存器
return
RX.J btfss pir1, rcif
goto RX.J ; 误操作,等待
movff rcreg, C ; 否则,将接受的检验数据(H)送到C寄存器
RX.J0 btfss pir1, rcif
goto RX.J0 ; 误操作,等待
movf rcreg, w ; 否则,将接受的检验数据(l)送到w寄存器
addwf C,w ; 组成完整的校验数据
subwf A ;判断是否传送正确
return
0-9 movlw 30H ;将字符代码变为表示0-9的十六进制代码
subwf B
return
A-F movlw 31H ;将字符代码变为表示A-F的十六进制代码
subwf B
return
----------------------------------------------------------------------------------------------
TX.8X btfsc status, Z ;判断,发送相应字符“!”
call 8.0
call TX.D
movlw 21H
movwf txreg
return
8.0 movlw 25H ;发送“%”
movwf txreg
movwf F
movlw 01H
movwf E
return
-------------------------------------------------------------------------------------
TX.16R btfsc status, Z ;判断,发送相应字符“!”
call 16.0
call TX.D
movlw 21H
movwf txreg
return
16.0 movlw 25H ;发送“%”
movwf txreg
movwf F
movlw 02H
movwf E
return
------------------------------------------------------------------------------------------------------
TX.32L
RS232中断通信.rar_232_RS232 ASM_rs232
版权申诉
160 浏览量
2022-09-14
13:52:21
上传
评论
收藏 2KB RAR 举报
JaniceLu
- 粉丝: 78
- 资源: 1万+
最新资源
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
- 以下是一个简化的示例,它使用pygame库来模拟烟花动画的框架.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈