51单片机串口奇偶校验

  有的单片机串口奇偶校验都是硬件自动完成的,但是就我目前用到的很多51核的单片机,需要软件做一些简单的处理来完成奇偶校验。

  可以自己写一个简单的小程序来实现:一位一位的判断1的个数,这个当然好实现,但是51核本身有特殊功能的寄存器可以帮助我们来实现这个功能,减少运算量。只需用好 ACC 和 P 就能实现。

   奇校验:原数据+校验位 为奇数个1

   偶校验:原数据+校验位 为偶数个1

void uart4_meter_int() interrupt UART4_VECTOR
{
    u8 even;
    u8 tmpP;
    u8 tmpBuf;
    if(RI4)
	{
		CLR_RI4();
		if (meterCnt < sizeof(meterBuf)) //接收缓冲区尚未用完时,
        {
            even = (S4CON & 0x04)>>2;
            tmpBuf = S4BUF;
            ACC = tmpBuf;
            tmpP = P;   //这个必须跟在ACC的下面
            if(even==tmpP)   //偶效验
            {
                meterBuf[meterCnt++] = tmpBuf; //保存接收字节,并递增计数器
            }
        }
	}
	if(TI4)
	{
		CLR_TI4();
	}
}

ACC是累加器

P是PSW-----程序状态字的一个位,表示奇偶校验位:它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,否则为0。 运算结果有奇数个1,P=1;运算结果有偶数个1,P=0。

### 51单片机串口通信中奇偶校验的配置与使用 #### 奇偶校验的概念 奇偶校验是一种简单的错误检测方法,在数据传输过程中用于验证数据的完整性。通过计算数据帧中“1”的个数并附加一位校验位来实现这一目标。如果选择了偶校验,则整个数据帧(包括数据位和校验位)中“1”的总数应该是偶数;如果是奇校验,“1”的总数则应为奇数[^3]。 #### SCON 寄存器的作用 在51系列单片机中,`SCON` 是一个特殊的功能寄存器,用来定义串行端口的操作模式、接收/发送控制以及状态标志。其中涉及奇偶校验的相关位如下: - **SM0 和 SM1**:这两个位决定了串行端口的工作模式。 - **REN**:允许接收数据。 - **TB8 和 RB8**:分别表示第9位发送和接收的数据位。当工作在具有奇偶校验的功能模式下时,这些位可以被用作奇偶校验位[^2]。 #### 配置示例 下面提供了一个基于C语言的简单程序示例,展示如何在51单片机上启用带有奇偶校验的串行通信。 ```c #include <reg51.h> sbit TXD = P3^1; // 定义TXD引脚 sbit RXD = P3^0; // 定义RXD引脚 void UART_Init() { TMOD |= 0x20; // 设置定时器T1为模式2 (自动重装载) TH1 = 0xFD; // 波特率设置,假设晶振频率为11.0592MHz,波特率为9600bps TR1 = 1; // 启动定时器T1 SCON = 0x52; // 工作方式1,允许接收,使能REN=1,TB8/RB8作为奇偶校验位 } // 发送字符函数 void Send_Char(unsigned char c) { TI = 0; TB8 = ((unsigned int)c & 0xFF) % 2 ? 1 : 0; // 计算奇偶校验位 SBUF = c; while (!TI); // 等待直到发送完成 TI = 0; // 清除中断标志 } // 接收字符函数 unsigned char Receive_Char() { RI = 0; while(!RI); RI = 0; return SBUF; } ``` 上述代码初始化了UART模块,并设置了波特率及时钟源。特别注意的是 `SCON` 的值设为了 `0x52` ,这代表启用了工作模式1并且开启了接收功能 (`REN`) 。同时利用了 `TB8` 来存储发送出去的奇偶校验信息。 #### 数据处理逻辑 对于每一个要发送的数据字节,都需要先确定其二进制形式中含有多少个‘1’。依据所选的奇偶校验类型——即奇校验还是偶校验——决定最终附加到该字节后的校验比特应该是什么数值。例如,若当前字节数组里有三个‘1’, 并且我们希望执行偶校验操作的话,那么就需要额外增加一个‘1’使得总的计数达到四个 ‘1’ 才能满足条件。 #### 注意事项 实际应用当中还需要考虑硬件电路设计是否支持相应的信号电平转换等问题。另外也要确认双方设备之间关于通讯参数的一致性协商情况,比如相同的波特率、停止位长度等要素都必须达成一致才能顺利完成有效的双向交流过程。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

small_planet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值