串行通信奇偶校验c语言程序,用C51实现带奇偶校验的串行通信.doc

该文介绍了如何使用C51语言在MCS-51单片机上实现带奇偶校验的串行通信。由于MCS-51不自动加入奇偶校验位,需要通过软件来生成。文中提供了汇编和C语言的实现方法,强调了在C语言中需注意累加器A的透明性和避免编译优化导致的问题。并给出了正确的编程步骤,包括设置全局变量确保奇偶校验位的正确生成。
摘要由CSDN通过智能技术生成

用C51实现带奇偶校验的串行通信

MCS-51系列单片机的串行口有4种工作方式。方式0为移位寄存器方式,用于外接同步I/O设备或扩展I/O口,不算起始位和停止位。方式1为8位异步串行通讯,方式2和方式3为9位异步串行通讯。方式2和方式3中的第9位是可程控位,即可由软件来确定第9位是“0”还是“1”。也就是说,MCS-51系列单片机不像某些专用串行芯片,如INTEL8051、8050、TLC16C550等那样,可根据初始化条件自动加入串行通讯中的奇偶校验位发送出去,而是需要软件参与产生奇偶校验位。用软件产生奇偶校验位是根据MCS-51系列单片机的状态寄存器PSW的定义:当累加器A中为1的个数为奇数时,P=1,否则P=0,来编程的。假定待发送的数据已放入累加器A中,可用如下汇编语言来实现(串行口工作于方式2):

MOV C,P; 把奇偶标志送给进位位

MOV TB8,C; 把进位位送给TB8

MOV SBUF,A; 把待发送的数据放入串行口

用C语言来编写时,因累加器A对编程者不透明,则会带来问题。例如,假定待发送的数据已放入变量VARIABLE中,若要从串行口发送出去,想当然地认为使用如下语句即可:

TB8=P; /*语句1*/

SBUF=VARIABLE /*语句2*/

实际上,2条语句并不能可靠地产生奇偶校验位。因为在语句1前面的语句所对应的汇编语言中的累加器A中为1的个数是不确定的,而语句2又是不可分割的。语句1和2对应的汇编语言程序为:

MOV C,P; 语句3

MOV TB8,C; 语句4

MOV A,VARIABLE; 语句5

MOV SBUF,A; 语句6

可以看出,只有将语句3、4放到语句5和语句6之间时,才能正确地产生奇偶校验位。为了达到这一目的,可引入全局变量VARIABLE1相应的C语言程序如下:

VARIABLE1=0; /* 语句7*/

VARIABLE +=VARIABLE1; /* 语句8*/

TB8=P; /*语句9 */

SBUF=VARIABLE; /*语句10*/

需要强调的是:

1.在串行中断服务程序中,VARIABLE1一定要设置为全局变量,若设置为局部变量,则可能引起意想不到的后果。

2.语句7和语句8尽量不要缩写成:

VARIABLE +=0; /* 语句10*/

而把全局变量VARIABLE1省掉。这主要是为了防止编译程序在某种可能的编译优化条件下将语句10也省略掉。

展开阅读全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值