51单片机中C语言奇偶校验位如何设置?

51单片机中C语言奇偶校验位如何设置?,第1张

在51单片机中,只要将一个值传送给累加器,这个数的奇偶校验值就会影响P。一般而言,在串行通讯中为确保传输数的准确,用到校验位的情况比较多。以下是程序代码:

#include

main()

{

char dat

TMOD=0x20

TH1=0xfd

TL1=0xfd

TR1=1

SCON=0xd0

while(1)

{

dat++

ACC=dat

TB8=P //校验位送第九数据位TB8

SBUF=ACC

while(TI==0)

TI=0

}

}

奇偶校验码计算:

首先字符T的十进制是84,转换成二进制是101 0100,最高位设置为奇校验,所以看101 0100中有3个1,是奇数个,所以最高位就为0使得校验后的数中1的个数还是奇数个,故为:0101 0100。

偶校验,内存中最小的单位是比特,也称为“位”,位有只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。

奇偶校验

就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数,那么在校验位定义为1,反之为0。

当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。

//奇偶校验

//data       要校验的数据起始地址

//length    数据长度,多少字节

//sum        校验码

//mode     校验方式,true:奇校验,false : 偶校验

//返回值     true: 校验成功 false:校验失败

bool CheckSum(char *data,int length,char sum , bool mode)

{

    char tmp=0

    

    for(int i=0i<lengthi++)

    {

        tmp+=*data

        data++

    }

    

    if(mode)

    {

        if(tmp+sum == 1)

        {

            return true

        }

        else

        {

             return false       

        }

    }

    else

    {

        if(tmp+sum == 0)

        {

             return true

        }

        else

        {

              return false       

        }

    }

}


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

原文地址: http://outofmemory.cn/yw/11105738.html

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

发表评论

登录后才能评论

评论列表(0条)

保存