C51的奇偶校验位及相关编程

6,136次阅读
没有评论

大家都知道C51的PSW寄存器的P位,是关于ACC的奇偶校验位,但其实关于校验有奇校验和偶校验之分,那有几个可以马上说得出这个P究竟是属于奇校验还是偶校验呢?
开始我也不知道,那就google一下呗,首先了解P位,以下为网络摘录:
The parity bit reflects the number of 1’s in the Accumulator: P = 1 if the Accumulator
contains an odd number of 1’s, and P = 0 if the Accumulator contains an even number of
1’s. Thus the number of 1’s in the Accumulator plus P is always even.(来自Atmel的官方网页文档)
C51特殊功能寄存器PSW的奇偶校验位P,如果ACC中“1”的个数为偶数,硬件置P=0。如果ACC中“1”的个数位奇数,硬件置P=1。(也是搜索的中文翻译)
好了,然后继续普及,何谓奇校验,何谓偶校验:
奇偶校验位是一个表示给定位数的二进制数中 1 的个数是奇数还是偶数的二进制数。奇偶校验位是最简单的错误检测码。
奇偶校验位有两种类型:偶校验位与奇校验位。如果一组给定数据位中 1 的个数是奇数,那么偶校验位就置为 1,从而使得总的 1 的个数是偶数。如果给定一组数据位中 1 的个数是偶数,那么奇校验位就置为 1,使得总的 1 的个数是奇数。(来自维基百科)
好了,结合以上两个知识点,我们可以得出结论:
C51的奇偶校验位实际为偶校验。
使用校验的地方,通常都是通讯,C51基本就是RS232了。为了方便,通讯一般使用几种,8位数据位无校验,7位数据位带校验,8位数据位带校验。
下面就简单说一下C51里面如何编程使用:

//首先寄存器如何配置就不详细展开讲了,自己查资料吧
//transfer_mode 0-8位无校验;1-7位数据奇校验;2-7位数据偶校验;3-8位数据奇校验;4-8位数据偶校验
//7位数据位的默认最高位不会有1的情况出现;
void Send_one_byte(unsigend char byte){
    unsigned char sbyte,temp;
    switch(transfer_mode){
        case 0://8位数据位无校验
            SBUF=byte;
            break;
        case 1://7位数据奇校验
            ACC=byte;
            temp=P;//存入临时寄存器,防止判定时ACC被改写导致P变化
            if(temp){
                SBUF=byte;
            }
            else{
                SBUF=(byte|0x80);
            }
            break;
        case 2://7位数据偶校验
            ACC=byte;
            temp=P;
            if(temp){
                SBUF=(byte|0x80);
            }
            else{
                SBUF=byte;
            }
            break;
        case 3://8位数据奇校验
            ACC=byte;
            temp=P;
            TB8=(!temp);
            SBUF=byte;
            break;
        case 4://8位数据偶校验
            ACC=byte;
            TB8=P;
            SBUF=byte;
            break;
    }
    while(!TI);
    TI=0;
}
正文完
 0
评论(没有评论)