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

发布者:星空行者最新更新时间:2016-06-15 来源: eefocus关键字:单片机  C51  串口接收中断  发送例程 手机看文章 扫描二维码
随时随地手机看文章
//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 
//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的

#include 
#include 

#define INBUF_LEN 4   //数据长度

unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit           read_flag=0;

void init_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; 
}

//向串口发送一个字符 
void send_char_com(unsigned char ch)  
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

//向串口发送一个字符串,strlen为该字符串长度 
void send_string_com(unsigned char *str,unsigned int strlen)
{
    unsigned int k=0;
    do 
    {
        send_char_com(*(str + k));
        k++;
    } while(k < strlen);
}


//串口接收中断函数 
void serial () interrupt 4 using 3 
{
    if(RI)
    {
        unsigned char ch;
        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)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CR C值不同,则说明数据通讯出现错误。由于这种方法取得校验码的方式具有很强的信息覆盖能力,所以它是一种效率极高的错误校验法。错误的概率几乎为零。在很多的仪器设备中都 采用这种冗余校验的通讯规约。
  根据应用环境与习惯的不同,CRC又可分为以下几种标准:
  ① CRC-12码;② CRC-16码;
  ③ CRC-CCITT码;④ CRC-32码。
  CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则是用来传送8-b it字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。
 
 
2  CRC校验码的生成过程
 
 
  我们以最常用的CRC-16码作为例子进行说明。
  冗余循环码包括2个字节,即16位二进制数。先预置16位寄存器全部为1,再逐 步把每8位的数据信息进行处理。在进行CRC计算时只用8位数据位,起始位和停止位,如有 奇 偶校验位的话也包括奇偶校验位,都不参与CRC计算。
  在计算CRC码时,8位数据与寄存器的数据相异或,得到的数据向低位移一位,用 0填补最高位,再检查最低位。如果最低位为1,把寄存器的内容与预置数相异或;若最低位 为0,则不进行异或计算。
  这个过程一直重复8次,第8次移位后,下一个8位数据再与现在寄存器中的内容 相异或,这个过程和以上一样重复8次。当所有的信息处理完后,最后寄存器中的内容即为C RC码。这个CRC码将由发送设备跟在数据的最后一起发送。
  计算CRC的步骤为:
  (1)预置16位寄存器位十六进制数FFFF(即全为1)。称此寄存器位CRC寄存器。
  (2)把第一个8位数据与16位寄存器的低位相异或,将结果放于CRC寄存器中;
  (3)把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
  (4)如果最低位为0,重复第三步(再次移位);
  如果最低位为1,CRC寄存器与多项式码进行异或;
  (5)重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
  (6)重复步骤2到5,进行下一个8位数据的处理;
  (7)最后得到的CRC寄存器即为CRC码。

 
3  CRC法在收发双方的软件实现
 
 
  根据前面给出的CRC码的生成过程,我们可以编制CRC校验程序,根据通讯协议通 过RS232-RS485电平转换接口和MAX485,PC机的串口与单片机的串行口进行串行异步通讯, 需要发送的数据信息位8位,选取异或多项式为A001(Hex)。
  8031单片机CRC算法的程序流程图如图1所示。同时给出汇编语言的源程序。
  CRC源代码:
  CRCH,CRCL,CRCD分别代表CRC校验码的高8位,低8位和要处理的数据。
 
          
           
 
    PC机的CRC程序思路与单片机完全相同,信息的处理、发送和接收可以用任何一种高级设计 语言来实现。
  本文主要讨论了用CRC法进行差错校验的问题,接收方如果发现接收错误,则返回信息,要求主机重发数据;如果没有发现错误,则不反馈信息。由此可以提高收发效率。实践证明CRC法在PC机与8031单片机异步通讯的差错检验中应用是十分有效的,可以在实际中得到广泛应用。

关键字:单片机  C51  串口接收中断  发送例程 引用地址:这是一个单片机C51串口接收中断和发送例程

上一篇:C51:串口通信接收与发送
下一篇:C51串口的SCON寄存器及工作方式

推荐阅读最新更新时间:2024-03-16 14:57

基于MSP430单片机的开关稳压电源设计
  1 引 言   MSP430系列单片机是美国TI公司生产的新一代16位单片机,是一种超低功耗的混合信号处理器(MixedSignal Processor),它具有低电压、超低功耗、强大的处理能力、系统工作稳定、丰富的片内外设、方便开发等优点,具有很高的性价比,在工程控制等领域有着极其广泛的应用范围。开关Boost稳压电源利用开关器件控制、无源磁性元件及电容元件的能量存储特性,从输入电压源获取分离的能量,暂时把能量以磁场的形式存储在电感器中,或以电场的形式存储在电容器中,然后将能量转换到负载。对DC-DC主回路采用Boost升压斩波电路。   2 系统结构和总设计方案   本开关稳压电源是以MSP430F449为主控制器件,
[单片机]
基于MSP430<font color='red'>单片机</font>的开关稳压电源设计
基于单片机89C51的异步串行接口键盘设计
在信息处理系统中,显示分系统是整个系统的人机界面。显示器画面呈现出的态势图形和数据,是人们决策的重要依据。人工干预手段则是将人们的决策变为系统所能接收信息的必不可少的工具。因此人工干预手段的多寡及有效度直接影响着整个系统的有效度。特别是在处理信息量大,人机交互频繁的系统中,对人工干预手段的要求更高。 笔者结合工作实际,围绕单片机89C51设计了通用异步串行接口键盘作为显示分系统的扩展键盘。目的在于为显示分系统增加一种干预手段。实践表明:此键盘改善了系统的人机界面,提高了系统的处理效率。 1 设计要求与工作原理 1.1 设计要求 (1)扩展键盘键位编码符合显示分系统的约定。   (2)扩展键盘与显示处理机通讯通过其异步串
[单片机]
德州仪器推出最新低成本 Stellaris MCU 套件
日前,德州仪器 (TI) 宣布推出四款可支持基于 ARM Cortex-M3 的第四代 Stellaris MCU 的低成本开发套件,能够在工业、消费类电子以及医疗应用等领域对高级连接与复杂控制功能的需求不断增长的情况下,充分满足对高性能集成微处理器 (MCU) 以及可靠配套工具与软件的需求。最低全新套件可帮助开发人员立即开展设计工作,并充分发挥最新 32 位 Stellaris MCU 的高级连接性、数据高效性以及运动控制特性等优势。为进一步简化开发,每个套件均包含有全面的 StellarisWare® 外设驱动器库、图形库、USB 库以及代码示例。 两款全新评估套件、一款开发套件与一款参考设计套件现已开始供货,可
[单片机]
51单片机入门经验分享3-通过流水灯讲解for循环语句
接上一篇帖子,继续来看,既然我们会点亮一个小灯,并可以让其闪烁了,那么我们就尝试着点亮流水灯好了,让8个小灯,从左到右,从右往左来回流动,还是在上一个程序的基础上来修改,很简单依次赋值即可实现。 while(1) { P2 = 0XFE;//1111_1110; Delay500ms();//500ms延时 11.0592MHZ P2 = 0XFD;//1111_1101; Delay500ms();//500ms延时 11.0592MHZ P2 = 0XFB;//1111_1011; Delay500ms();//
[单片机]
基于单片机的射频读卡器设计
引 言 无线射频识别技术(RFID)以其高度安全保密性、通信高速性、使用方便性、成本低等特点而得到快速的普及和推广,现已广泛地应用于各类门禁控制系统、公共交通支付系统、医疗保险系统、停车场管理系统、仓储管理、车辆防盗等方面,并带动了读写器和各类应用产品的开发和推广。本文在分析射频识别系统组成和原理的基础上,提出了基于STC11F32高速单片机和MFRC500芯片的射频读写器设计方案;同时,在该读卡器上扩展了点阵图形液晶LCD和串行存储器W25X80,以及USB芯片CH340T等外围设备。LCD可以显示各种图形和汉字;串行存储器用来存储点阵字库、图形库等;USB芯片使得该读卡器省去了串口和电源供电端口,可以通过USB接口和PC管理
[单片机]
51单片机-AT24C
AT24C02是由ATMEL公司提供的,IIC总线串行EEPROM(electronic eraser programmer read only memory),其容量为2kbit(256B),工作电压在2.7v 5.5v之间,生产工艺是CMOS。 一般数字芯片都在左下角和右上角为GND,VCC。容量的计算方法:AT24Cxx :01 1024 容量 = xx * 1kbit。 写入过程: AT24C系列EEPROM芯片的固定部分为1010,A2,A1,A0引脚接高低电平后得到确定的3位编码,形成7位编码即为该器件的地址码。 单片机进行写操作时,首先发送该器件的7位地址码和写方向位 0 (共8位,即
[单片机]
51<font color='red'>单片机</font>-AT24C
51单片机系列连载10-串行通信
今天介绍一下计算机通信,计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。而计算机通信有并行通信和串行通信两种方式。并行通信通常是将数据字节的各位用多条数据线同时进行传送,如下图: 在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。串行通信包括同步通信和异步通信,异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设
[单片机]
AD574与8031单片机及前置电路的一种实用接口电路
  AD574是美国核拟器件公司Analog Devices) 生产的12 位逐次逼近型快速A/D 转换器。其转换35us,转换误差为土0.05%,是前我国应用广泛,价格适中的A/D转换器。其内部含三态电路,可直接与各种微处理器连接,且无须附加逻辑接口电路,便能与CMOS 及TTL 电平兼容。内部配置的高精度参考电压源和时钟电路,使它不需要任何外部电路和时钟信号,就能实现A/D转换功能,应用非常方便。   许多文献有关于AD574与8031单片机接口技术的介绍, 但其控制功能引线基本局限于单一的AD574与8031的连接。由于8031无内部程序存贮器, 其内部数据存贮器也有限, 因而8031构成的测控系统, 往往都需外扩存贮器
[单片机]
AD574与8031<font color='red'>单片机</font>及前置电路的一种实用接口电路
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved