微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 这是一个单片机C51串口接收中断和发送例程

这是一个单片机C51串口接收中断和发送例程

时间:11-09 来源:互联网 点击:
//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的

#include
#include

#defineINBUF_LEN4//数据长度

unsignedcharinbuf1[INBUF_LEN];
unsignedcharchecksum,count3;
bit read_flag=0;

voidinit_serialcomm(void)
{
SCON =0x50;//SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |=0x20;//TMOD: timer 1, mode 2, 8-bit reload
PCON |=0x80;//SMOD=1;
TH1 =0xF4;//Baud:4800 fosc=11.0592MHz
IE |=0x90;//Enable Serial Interrupt
TR1 =1;// timer 1 run
// TI=1;
}

//向串口发送一个字符
voidsend_char_com(unsignedcharch)
{
SBUF=ch;
while(TI==0);
TI=0;
}

//向串口发送一个字符串,strlen为该字符串长度
voidsend_string_com(unsignedchar*str,unsignedintstrlen)
{
unsignedintk=0;
do
{
send_char_com(*(str + k));
k++;
}while(k < strlen);
}

//串口接收中断函数
voidserial () interrupt4using3
{
if(RI)
{
unsignedcharch;
RI =0;
ch=SBUF;
if(ch>127)
{
count3=0;
inbuf1[count3]=ch;
checksum= ch-128;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if( (count3==(INBUF_LEN-1)) && (!checksum) )
{
read_flag=1;//如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}

main()
{
init_serialcomm();//初始化串口
while(1)
{
if(read_flag)//如果取数标志已置位,就将读到的数从串口发出
{
read_flag=0;//取数标志清0
send_string_com(inbuf1,INBUF_LEN);
}
}

}

//-------------------------------------------------------------------

//crc:校验子程序

//开始地址指针ADRS,需校验字节数量SUM

//校验结果:高位CRCH,低位CRCL

//-------------------------------------------------------------------

void CCRC(unsigned char *ADRS,unsigned char SUM)

{

unsigned int data CRC; //校验码

unsigned char data i;

unsigned char data j;

CRC=0xFFFF;

for (i=0;i

{

CRC^=*ADRS;

for (j=0;j<8;j++)

{

if ((CRC & 1)==1)

{

CRC>>=1;

CRC^=0xA001;

}

else

{

CRC>>=1;

}

}

ADRS++;

}

CRCH=CRC&0xFF;

CRCL=CRC>>8;

}

//-------------------------------------------------------------------

//其他程序调用例子

//校验数组前6位

//-------------------------------------------------------------------

//。。。

unsigned char data RBuf[9]; //数据区

CCRC(&RBuf,6);

//。。。

CRC差错检验法在PC机与8031单片机串行通讯中的应用

2008-06-10 13:50:46 来源:现代电子技术作者:刘涛廉海…点击:401次

摘 要 通过对不同校验方法的分析,介绍了一种适合PC机与8031单片 机通讯差错校验的CRC方法并给出了其实现的软件流程图。

关键词 数据传输差错校验CRC

随着数据采集系统的功能日益强大,以及微型计算机的普及,在现代工业中,利用微机进行数据通讯的工业控制应用得也越来越广泛。特别是在大规模高精度数据采集系统中,对数据进行分析和计算将占用很大一部分单片机的资源,可以将采集到的数据通过串行通讯方式传送给PC机,由PC机来完成数据的处理工作。但是由于传输距离、现场状况等诸多可能出现的因素的影响,计算机与受控设备之间的通讯数据常会发生无法预测的错误。为了防止错误所带来的影响,在数据的接收端必须进行差错校验。虽然差错校验也可以完全由硬件来承担,但由于单片机和PC都具有很强的软件编程能力,这就为实施软件的差错校验提供了前提条件,而软件的差错校验有经济实用并且不增加硬件开销的优点。本文就是基于多功能应变测试系统而编写的主机和单片机之间的RS-485通讯系统,介绍了一种软件差错校验方案循环冗余差错校验法。

1 CRC法的原理

 传统的差错检验法有:奇偶校验法,校验和法,行列冗余校验法等。这些方法都是在数据后面加一定数量的冗余位同时发送出去,例如在单片机的通讯方式2和3中,TB8就可以作为奇偶校验位同数据一起发送出去,在数据的接收端通过对数据信息进行比较、判别或简单的求和运算,然后将所得和接收到的冗余位进行比较,若相等就认为数据接收正确,否则就认为数据传送过程中出现错误。但是冗余位只能反映数据行或列的奇偶情况,所以这 类检验方法对数据行或列的偶数个错误不敏感,漏判的概率很高。因此,此种方法的可靠性 就差。

 循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数 的原理来作错误侦测(Error Detecting)的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top