新闻  |   论坛  |   博客  |   在线研讨会
51单片机串行通信奇偶校验的设置方法
luker | 2016-02-04 12:43:53    阅读:1994   发布文章

通常,串行通信的一帧的格式是8-n-1,即8位数据、无校验、1个停止位。 有时为了提高准确度,需要增加一个“奇”校验位或者“偶”校验位。  对于高级语言的做法是很简单的,只要把格式命令“8-n-1”,改为“8-P-1”或“8-O-1”即可。 串行口在带有校验位的通信方式中,是先发送8位数据,然后再发送校验位。  51单片机也可以按照带有校验位的方式进行串行通信,这在51单片机中称为9位数据方式。 51单片机中有两个位,分别称为TB8和RB8,它们在“无校验”的时候,并没有用处。 当51单片机用9位数据方式进行串行通信的时候,TB8和RB8的作用如下: 51单片机在发送的时候,先发送8位数据,然后发送TB8中的内容; 51单片机在接收的时候,先接收8位数据,然后接收校验位,存到RB8中。  编写51单片机程序的时候,应该在发送数据之前,在TB8中,写好待发送的校验位。 8位数据的校验位,可以利用单片机中奇偶标志位P来自动生成,程序如下。 MOV A, #待发数据 ;数据进了A,即刻生成奇偶标志位P MOV C, P  MOV TB8, C 校验位送到TB8 MOV SBUF, A 发送数据,以及P  由于P = 1则说明A中有奇数个1,所以上述程序是“偶”校验的形式。 如果要求的是“奇”校验,则需要增加一条取反指令,如下: MOV C, P CPL C  MOV TB8, C 校验位送到TB8  接收方会把收到的8位数送到SBUF,第9位数,送到RB8,然后自动设立RI = 1。 之后,就可以用RB8中的内容,对刚才收到的8位数进行正确性检验。   另一个问题:51单片机如何初始化成8-n-1(8数据位,无奇偶校验位,1停止位)波特率,是用串口的模式几?  本来想用串口的模式1,可是仔细一看,模式1是10异步通信方式,1起始位,8数据位,1停止位?   悬赏分:20 - 解决时间:2009-12-1 13:26  


问题补充:首先感谢一楼的回答。我还有些疑问,刚才用示波器看了下,当发送0xFF时,示波器显示一位低电平,其余为高电平,这点应该是对的,因为起始位是0.可是为什么发送0xAA时,示波器的(起始位+数据位+停止位)序列是:0 + 0101 0101 + 1,而0x55的序列为:0 +1010 1010 + 1,这两个值好像不对,是相反了,要是调一下刚好对? ;----------------------------------------------------------------- 最佳答案用串口的模式1,是10位异步通信方式。 1起始位,8数据位,1停止位,没有奇偶校验位。  这种模式就是:8-n-1(8数据位,无奇偶校验位,1停止位)的模式。 完全符合你的要求。  --------------------  带奇偶校验位的,要用方式2或方式3。  把奇偶校验位,放到TB8上,就可以发送了,这就是偶校验。 接收的奇偶校验位,在RB8中。 --------------------  呵呵,你还用上了示波器,奢侈! 你观察的很正确。  记住:串行通信,是“低位在前”。这就对了。   你补充的提问太多了,都足够再开一、二个问题了,这20分,真值!  ;----------------------------------------------------------------- UART设为9位模式 TB8/RB8为奇偶校验位数据  PSW寄存器的P位(PSW.0)位奇偶校验标志 发数据时TB8=P,接收数据时P=RB8 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客