一个单片程序修改!!麻烦高手指点

来源:百度知道 编辑:UC知道 时间:2024/06/08 09:32:41
这个程序我这次是真的头疼了,不太会编啊!但还是硬着编了!但肯定是必错的程序!书本上的例子都是SM2有关的,老师说不要求掌握,说这题用不到。。。。。我也没什么参考的。说实话这个题目都不太理解,它要求我们收发写在一个程序里,我就理解为,收部分数据,发部分数据,两个没什么关系,是两个程序,以下是题目要求,比较长:
80C51串口以方式3进行串行通信,第9个数据作为奇校验位,要求以中断方式(这个地方就头晕了),设波特率1200bps
假设:1.fosc=11.0592
2.收发数据以 $为结束符号
3.发送的数据存放在内部RAM 20H为首地址的区域,收到的数据存放在内部RAM以40H为首的地址区域
4.若收到的数据出错,则PSW中的F0标志位为1
5.当收到$时,数据已经发送完

ORG 0000H
SJMP MAIN
ORG 0050H
SJMP WAIT
ORG 0030H
MAIN:
MOV PCON ,#0
MOV TH1, #0E8H
MOV TL1, #0E8H
MOV TMOD ,#20H
MOV R0,#20H
MOV R1 ,#40H
SETB ES
SETB EA
SETB TR1
WAIT : AJMP WAIT
SINT1: MOV SCON ,#11001000 ;接受子程序
MOV A,@R0
MOV C,P
CPL C ;PSW实际是偶校验
MOV PSW.0 ,C
MOV SBUF, A
JNB T1,$ ;一帧是否传送完
CLR T1
CJNE A,$,SINT2 ;看末尾是不是$结束了,继续接收

;-------------------------------本程序,既有发送能力,也有接收能力。
ORG 0000H
SJMP MAIN

ORG 0023H
SJMP RECE_S

ORG 0030H
MAIN:
LCALL INI_S_T1 ;调用初始化子程序
;串行口工作在方式3,允许接收,允许中断;T1控制波特率。
;-----------------------下面写些数据,准备发送
MOV A, #88H
MOV R1, #18
MOV R0, #20H
INI_LOOP:
MOV @R0, A
INC R0
DEC A
DJNZ R1, INI_LOOP
MOV @R0, '$'
;-----------------------发送程序
CLR PSW.5
MOV R0, #20H
MOV R1, #40H
FA_LOOP:
MOV A, @R0 ;第一个,取自20H单元
MOV C, P
MOV TB8, C
MOV SBUF, A ;发送
INC R0 ;地址指针加一
JNB TI,$ ;等待发送结束
CLR TI
CJNE A, #'$', FA_LOOP ;不是$,继续发送

WAIT : AJMP WAIT ;结束了
;-------------------------------------------
RECE_S: