单片机奇偶校验

单片机奇偶校验,第1张

通常,串行通信的一帧的格式是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停止位)的模式。

完全符合你的要求。

奇偶校验码是 奇校验码 和 偶校验码 的统称

它们都是通过在要校验的编码上加一位校验位组成

如果是 奇校验 加上校验位后,编码中1的个数为 奇数个

如果是 偶校验 加上校验位后,编码中1的个数为 偶数个

例:

原编码 奇校验 偶校验

0000 0000 1 0000 0

0010 0010 0 0010 1

1100 1100 1 1100 0

1010 1010 1 1010 0

如果发生 奇数 个位传输出错,那么编码中1的个数就会发生变化

从而校验出错误 要求从新传输数据

目前应用的 奇偶校验码 有3种

水平奇偶校验码

对每一个数据的编码添加校验位,使信息位与校验位处于同一行

垂直奇偶校验码

把数据分成若干组,一组数据排成一行,再加一行校验码

针对每一行列采用 奇校验 或 偶校验

例: 有32位数据10100101 00110110 11001100 10101011

垂直奇校验 垂直偶校验

数据10100101 10100101

00110110 00110110

11001100 11001100

10101011 10101011

校验为00001011 11110100

水平垂直奇偶校验码

就是同时用水平校验和垂直校验

例:

奇校验 奇水平 偶校验 偶水平

数据 10100101 1 10100101 0

00110110 1 00110110 0

11001100 1 11001100 0

10101011 0 10101011 1

校验 00001011 0 11110100 1

奇偶校验:是一种通过增加冗余位使得字符中“ 1 ” 的个数恒为奇数或恒为偶数的编码方法。

如:奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数恒为奇数,如:

1 0110,0101

0 0110,0001

偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数恒为偶数,如:

1 0100,0101

0 0100,0001

另外,奇偶校验的编码方法只能检测出信息传输过程中的部分误码(1位误码能检出,2位及2位以上误码不能检出),在发现错误后,只能要求重发,而不能对该错误进行纠正。

奇偶校验用在数据传送里。数据传送时,最后一位为奇偶校验位。收发上方事先已经约定好进行奇校验还是偶校验。

比如传送0101这个二进制数,约定为奇校验。0101里面1的个数是偶数个,所以奇偶校验位为1,变成01011,这样1的个数就为奇数个。收到方就根据奇偶校验位判断数据有没有发送错误。

但是就跟你所说的,这个方法有缺陷,如果数据一下子错了两位,比如刚才的0101,发成了1001,错误就查不出来了。

以上就是关于单片机奇偶校验全部的内容,包括:单片机奇偶校验、奇偶校验码的特点是什么为什么说它是可靠性代码、关于奇偶校验码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9323964.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存