大家都知道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;
}