STC单片机 串口通信 奇偶校验

现在想用stc12c5a60s2 单片机 串口向外发送字节数组,内容如下: E9 01 06 57 4A 01 F4 01 01 EF ,要求发送时 带有奇校验 ,请问程序如何编写,请大家帮帮我!可发送至邮箱[email protected] ,我这有50分酬谢!解决问题后再送您50分!
麻烦大家把我写的字节数组也写到程序中,我是新手!多谢啦!

1、51单片机SCON=0xDA,工作在方式3.(方式2也可以)

串口 1 模式 3:
波特率是可变的,其它和模式2 相同
11 位数据通过TxD/P3.1 发送,通过RxD/P3.0 接收。一帧数据包含一个起始位(0),8 个数据位(低位在
先),一个可编程的第9 位,和一个停止位(1)。发送时,第9 位数据位来自特殊功能寄存器SCON 的
TB8 位.接收时,第9 位进入特殊功能寄存器SCON 的RB8 位。
SMOD
串口1波特率在模式3 = ( 2 / 32 ) x BRT独立波特率发生器的溢出率
当SMOD = 0时,串口1波特率 = BRT 独立波特率发生器的溢出率 / 32,
当SMOD = 1时,串口1波特率 = BRT 独立波特率发生器的溢出率 / 16,
BRT独立波特率发生器的溢出率 = Fosc/12/( 256 - BRT ),当BRTx12 = 0时,
BRT独立波特率发生器的溢出率 = Fosc / ( 256 - BRT ),当BRTx12 = 1时

TB8:发送时校验位,可以奇校验或偶校验(直接置0或1),然后再发送。
RB8:接收时校验位,判断接数据是否正确。
2、程序
/*****************************************
*串口1中断
*****************************************/
void RXD_Int_Service() interrupt 4
{
uint8 ch;
if(RI)
{
RI=0;
Usart1.RxdDly=6; //超过0.3S清空计数
Usart1.RxdBuf[Usart1.RxdCnt]=ch;
Usart1.RxdCnt++;
if(Usart1.RxdCnt>=10)
{
Usart1.RxdTrue=1; //接收正确。
Usart1.RxdNum=Usart1.RxdCnt;
Usart1.RxdCnt=0;
}
}
if(TI)//防止发送中断
{
TI=0;
}
}
void Timer0_InSevice() interrupt 1
{
TH0=0xdc; //定义50ms 正常值0xfe 0x0c ,修正值:0xfe 0x16;
TL0=0x00; //11.0592MHz晶振

if(Usart1.RxdDly)
{
Usart1.RxdDly--; //0.3S没有接收到数据,清0计数。
if(Usart1.RxdDly==0)
{
Usart1.RxdCnt =0; //记数清0.
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-05-06

已试验通过,请下载。

追问

12c5a60s2 可以使用吗?

追答

下面是12系列的程序


追问

我用您的程序试验了,但是我的设备没有反应啊?我这数组中元素是用来驱动设备启动的,您能帮我解决吗?

第2个回答  2014-05-06
奇偶校验?

串口通信 2 端设置一致就可以了
相似回答