51系列不支持2位停止位,好象还不好做啊。。。。
这样做: 1 首先把单片机串口设置成 9600, 8, Mark。这里校验位始终为 1,充当一个附加的停止位。 2 发送时,程序中编码计算 7 个 bit 的奇偶,然后将得到的 0 或 1 写到一个字节的最高位。它在串口发送时,是最后发出的,看作奇偶位。 3 接收时,计算低 7 比特的奇偶,与 bit 8 比对。
void UartInit(void) //9600bps@11.0592MHz { PCON |= 0x80; //使能波特率倍速位SMOD SCON = 0xD0; //9位数据,可变波特率 AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //清除定时器1模式位 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TL1 = 0xFA; //设定定时初值 TH1 = 0xFA; //设定定时器重装值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 } void SendOneByte(unsigned char c) { ACC=c; c=P<<7 & c; SBUF = c; while(!TI); TI = 0; } 大概这个样子吧,随手写的。。。
51没有7位通讯功能,你把单片机设置成 9600,8,N,2的通讯模式 然后每个数据的第八个字节,手动计算一下校验位,填进去就好了 起始位+7数据位+1校验位+2停止位=11位 起始位+8数据位+2停止位=11位 通讯长度上面一样就差不多了。
还是按8位处理, 一个字节的低7位(bit6~bit0)作为数据,Bit7作为校验, 校验可借助P(PSW.0) 2位停止位,只要保证两个字节之间的时间超过1个位的时间即可
27,372
社区成员
28,771
社区内容
加载中
试试用AI创作助手写篇文章吧