导航:首页 > 操作系统 > 单片机如何实现奇偶校验

单片机如何实现奇偶校验

发布时间:2025-04-27 03:30:42

1. 51单片机串口通讯代码和校验怎么弄,最好有现成的程序我参考一下!

串口通讯模式3用于数据收发,支持9位数据传输,其中第九位可以作为奇偶校验位。发送代码如下:

发送代码:
SPOUT: MOV C,P ;奇偶位送C
MOV TB8,C ;送发送位
MOV SBUF,A ;发送数据
JNB TI,$
CLR TI
RET

接收代码如下:

接收代码:
SPIN: JNB RI,$ ;等待接收数据
MOV A,SBUF;接收数据
MOV C,RB8 ;第九位送C
JC SPIN1 ;为1转
ORL C,P ;与奇偶位或运算
JC ERR ;为1(也就是不相等转错误)
SJMP SPOK
SPIN1: ANL C,P ;与奇偶位与运算
JNC ERR ;为0则错误
SPOK: RET
ERR: MOV A,#0FFH

以上代码详细展示了如何使用模式3进行串口通信,并对奇偶校验位进行了处理。通过这种方式,可以有效检测数据传输中的错误。

2. 单片机的ASCII码的奇偶校验位该如何设置

“8”的ASCLL码为:70
(十进制)=
0011
1000
(二进制)
“B”的ASCLL码为:102(十进制)=
0100
0010(二进制)
书上说了低7位表示本身编码,第8位做奇偶校验
奇偶校验规则:编码中1的个数为奇数则为奇校验,为偶数则为偶校验
所以“8”的奇校验ASCLL码为**0**0111000B(添0,使得1的个数为奇数),偶校验ASCLL码为**1**0111000B(添1,使得1的个数为偶数)
同理“B”也类似

3. 单片机奇偶校验

通常,串行通信的一帧的格式是8-n-1,即8位数据、无校验、1个停止位。
有时为了提高准确度,需要增加一个“奇”校验位或者“偶”校验位。
对于高级语言的做法是很简单的,只要把格式命令“8-n-1”,改为“8-P-1”或“8-O-1”即可。
串行口在带有校验位的通信方式中,是先发送8位数据,然后再发送校验位。
51单片机也可以按照带有校验位的方式进行串行通信,这在51单片机中称为9位数据方式。
51单片机中有两个位,分别称为TB8和RB8,它们在“无校验”的时候,并没有用处。
当51单片机用9位数据方式进行串行通信的时候,TB8和RB8的作用如下:
51单片机在发送的时候,先发送8位数据,然后发送TB8中的内容;
51单片机在接收的时候,先接收8位数据,然后接收校验位,存到RB8中。
编写51单片机程序的时候,应该在发送数据之前,在TB8中,写好待发送的校验位。
8位数据的校验位,可以利用单片机中奇偶标志位P来自动生成,程序如下。
MOV A, #待发数据 ;数据进了A,即刻生成奇偶标志位P
MOV C, P
MOV TB8, C ;校验位送到TB8
MOV SBUF, A ;发送数据,以及P
由于P = 1则说明A中有奇数个1,所以上述程序是“偶”校验的形式。
如果要求的是“奇”校验,则需要增加一条取反指令,如下:
MOV C, P
CPL C
MOV TB8, C ;校验位送到TB8
接收方会把收到的8位数送到SBUF,第9位数,送到RB8,然后自动设立RI = 1。
之后,就可以用RB8中的内容,对刚才收到的8位数进行正确性检验。

另一个问题:51单片机如何初始化成8-n-1(8数据位,无奇偶校验位,1停止位)波特率,是用串口的模式几?
本来想用串口的模式1,可是仔细一看,模式1是10异步通信方式,1起始位,8数据位,1停止位?
悬赏分:20 - 解决时间:2009-12-1 13:26
问题补充:首先感谢一楼的回答。我还有些疑问,刚才用示波器看了下,当发送0xFF时,示波器显示一位低电平,其余为高电平,这点应该是对的,因为起始位是0.可是为什么发送0xAA时,示波器的(起始位+数据位+停止位)序列是:0 + 0101 0101 + 1,而0x55的序列为:0 +1010 1010 + 1,这两个值好像不对,是相反了,要是调一下刚好对?
;-----------------------------------------------------------------
最佳答案用串口的模式1,是10位异步通信方式。
1起始位,8数据位,1停止位,没有奇偶校验位。
这种模式就是:8-n-1(8数据位,无奇偶校验位,1停止位)的模式。
完全符合你的要求。

4. 关于51单片机的奇偶校验~~小弟菜鸟


呵呵,在这两条指令的前后,你各忽略了一条指令。请看下列程序及说明:

MOV A, #待发数据 ;数据进了A,即刻生成校验位P
MOV C, P
MOV TB8, C ;校验位送到TB8
MOV SBUF, A ;发送数据,以及P

上述写法,是偶校验。奇校验,需要增加一条取反指令,如下:

MOV C, P
CPL C
MOV TB8, C ;校验位送到TB8

就这些。

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

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.
}
}
}

阅读全文

与单片机如何实现奇偶校验相关的资料

热点内容
文件夹形成套娃以后该怎么办 浏览:74
安卓本地加密相册 浏览:859
买书籍用什么app 浏览:811
如何申请服务器代理 浏览:107
文件夹内容不分类 浏览:956
怎么样给信捷plv文件加密 浏览:711
android如何连接数据库 浏览:158
解压的英语作文60字 浏览:966
有没有什么自动聊天的app 浏览:483
工具加密哪家价格实惠 浏览:470
androidcrosswalk集成 浏览:393
linux切换管理员 浏览:861
程序员中的逻辑是什么意思 浏览:437
如何把安卓系统换为苹果 浏览:125
文件夹映射命令 浏览:536
新买的阿里云服务器安装宝塔 浏览:848
pdf加密怎么办 浏览:329
网易怎么开电脑服务器地址 浏览:824
android存储访问权限 浏览:761
单片机间接寄存器 浏览:535