一个51单片机程序,麻烦高手指点!!
80C51串口以方式3进行串行通信,第9个数据作为奇校验位,要求以中断方式(这个地方就头晕了),设波特率1200bps。
假设:1.fosc = 11.0592MHz;
2.收发数据以$为结束符号;
3.发送的数据存放在内部RAM 20H为首地址的区域,收到的数据存放在内部RAM以40H为首的地址区域;
4.若收到的数据出错,则PSW中的F0标志位为1;
5.当收到$时,数据已经发送完。
这个程序我这次是真的头疼了,不太会编啊!但还是硬着编了!但肯定是必错的程序!书本上的例子都是SM2有关的,老师说不要求掌握,说这题用不到。。。。。我也没什么参考的。
说实话这个题目都不太理解,它要求我们收发写在一个程序里,我就理解为,收部分数据,发部分数据,两个没什么关系,是两个程序,以下是我的程序。
比较长,略。
1.我现在知道我到底是什么不懂了,首先我弄不懂我这个编出来的到底是不是中断传送,而且这个中断和那个子程序调用有什么区别啊,我怎么觉得没什么区别啊?
2.还有不懂的我们下次基于这个再来,反正现在好多不理解啊!泪奔......
悬赏分:20 - 解决时间:2009-10-23 19:53
;--------------------------------------------------------
最佳答案:
;-----------------------本程序,既有发送能力,也有接收能力。
ORG 0000H
SJMP MAIN
ORG 0023H
SJMP RECE_S
ORG 0030H
MAIN:
LCALL INI_S_T1 ;调用初始化子程序
;串行口工作在方式3,允许接收,允许中断;T1控制波特率。
;-----------------------下面写些数据,准备发送
MOV A, #88H
MOV R0, #20H
MOV R1, #18
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: ;中断接收子程序
CLR RI
MOV A, SBUF ;取出收到的
JB P, P_1
JB RB8, ERR
SJMP GOOD
P_1:
JNB RB8, ERR
GOOD:
MOV @R1, A ;保存数据
INC R1
CJNE A, #'$', RE_END ;不是$,继续接收
CLR REN ;是,则停止接收
RE_END:
RETI
ERR:
SETB PSW.5 ;即F0标志位
RETI
;-------------------------------------------
INI_S_T1:
MOV SCON, #11010000B ;串行口工作在方式3,允许接收
MOV PCON, #0
MOV TMOD, #20H ;T1工作方式2
MOV TH1, #0E8H ;1200bps@11.0592MHz
MOV TL1, #0E8H
SETB TR1 ;启动T1
SETB ES
SETB EA
RET
END
;--------------------------------------------------------
回答者: 做而论道 - 八级 2009-10-22 20:17
原文网址:http://zhidao.baidu.com/question/122462324.html
;--------------------------------------------------------
后记:
本程序在理论上还是正确的。
但是不好做实验,因为需要两台单片机协同操作,传输的几十字节的数据还在内存中,也无法显示,故此也没有进行实验验证。
后来经过百度Hi了解到,提问者他们也并不是要做实验,只是个大作业的形式。本程序已经得到老师的认同,获得通过。