⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs232.c

📁 C51单片机得开发源码2其中有些非常经典得程序.jjzhang166@163.com
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: 	RS232.C
**创   建   人: 	叶皓贲
**最后修改日期:  	2003-3-4
**描        述: 	DP-1581串口及I2C eeprom演示程序
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 叶皓贲
** 版  本: 1.0
** 日 期: 2003-3-4
** 描 述: DP-1581演示程序
**
**------------------------------------------------------------------------------------------------------
** 修改人:
** 版  本:
** 日 期:
** 描 述:
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "config.h"

/* 全局变量 */

uchar *temp,j=0,i;
uchar rec_com[64];//接收缓冲区
 
bit timeout=0;    //接收超时标志
bit rec_ok=0;     //接收成功标志

main()
{
  TMOD=0X21;
  TH1=0XFd;
  TL1=0XFd;
  SCON=0X50;
  PCON=0;
  TR1=1;
  ET0=1;
  ES=1;
  EA=1;
  while(1)
  {
    while(timeout==0&&rec_ok==0);
    if(timeout)//超时处理
    {
      //send error for commad
      rec_com[0]=0x12;
      rec_com[1]=0xa1;
      rec_com[2]=2;
      rec_com[3]=0;
      rec_com[4]=rec_com[0]^rec_com[1]^rec_com[2]^rec_com[3];
      ES=0;
      for(i=0;i<5;i++)
      {
        SBUF=rec_com[i];
        while(TI==0);
        TI=0;
      }
      ES=1;
      timeout=0;
      rec_com[0]=0;
      rec_com[1]=0;
    }
    if(rec_ok) //接收成功!
    {
      if(rec_com[1]!=0x20&&rec_com[1]!=0x21)//命令错误!
      {
        rec_com[0]=0x12;
        rec_com[1]=0xa1;
        rec_com[2]=2;
        rec_com[3]=0;
        rec_com[4]=rec_com[0]^rec_com[1]^rec_com[2]^rec_com[3];
        ES=0;
        for(i=0;i<5;i++)
        {
          SBUF=rec_com[i];
          while(TI==0);
          TI=0;
        }
        ES=1;
        //send error for command
      }
      else if(rec_com[1]==0x20)//收到读命令
        {
          i=rec_com[5];
          if(IRcvStr(CSI24WC02,rec_com[3],&rec_com[3],rec_com[5]))//读成功
          {
            rec_com[0]=0x12;
            rec_com[1]=0xa0;
            rec_com[2]=i+2;
            for(j=0;j<(i+3);j++)
              rec_com[i+4]=rec_com[j]^rec_com[j+1];
            ES=0;
            j=j+2;
            for(i=0;i<j;i++)
            { 
              SBUF=rec_com[i];
              while(TI==0);
              TI=0;
            }
            ES=1;
          }     
          //send read ok;
          else//send read error读失败
          {
            rec_com[0]=0x12;
            rec_com[1]=0xa1;
            rec_com[2]=2;
            rec_com[3]=1;
            rec_com[4]=rec_com[0]^rec_com[1]^rec_com[2]^rec_com[3];
            ES=0;
            for(i=0;i<5;i++)
            {
              SBUF=rec_com[i];
              while(TI==0);
              TI=0;
            }
            ES=1;
          }
        }
      else if(rec_com[1]==0x21)//收到写命令
        {
          j=rec_com[2]-4;
          if(ISendStr(CSI24WC02,rec_com[3],&rec_com[5],j))//写成功
          {
            rec_com[0]=0x12;
            rec_com[1]=0xa0;
            rec_com[2]=1;
            rec_com[3]=rec_com[0]^rec_com[1]^rec_com[2];
            ES=0;
            for(i=0;i<4;i++)
            {
              SBUF=rec_com[i];
              while(TI==0);
              TI=0;
            }
            ES=1;
          }
          else//写失败
          {
            rec_com[0]=0x12;
            rec_com[1]=0xa1;
            rec_com[2]=3;
            rec_com[3]=0;
            rec_com[4]=0;
            rec_com[5]=rec_com[0]^rec_com[1]^rec_com[2]^rec_com[3];
            ES=0;
            for(i=0;i<6;i++)
            {
              SBUF=rec_com[i];
              while(TI==0);
              TI=0;
            }
            ES=1;
          }
        }
      rec_com[0]=0;
      rec_com[1]=0;
      rec_ok=0;
    }
  }
}
void int_com() interrupt 4
{
  uchar * tmp,counter;
  if(RI==1)
    {
      TR0=1;
      TH0=-60000/256;
      TL0=-60000/256;
      rec_com[0]=SBUF;
      RI=0;
      while(RI==0&&timeout==0);
      rec_com[1]=SBUF;
      RI=0;
      while(RI==0&&timeout==0);
      rec_com[2]=SBUF;
      RI=0;
      tmp=&(rec_com[3]);
      counter=rec_com[2];
      do
      {
         while(RI==0&&timeout==0);
         *tmp=SBUF;
         tmp++;
         counter--;
         RI=0;
      }
      while(timeout==0&&counter!=0);
      if(!timeout)
        rec_ok=1;  
      TR0=0;    
    }
  if(TI==1)
    {
       TI=0;
    }
}
void int_t0() interrupt 1
{
  static counter=0;
  counter++;
  TH0=-60000/256;
  TL0=-60000%256;
  if(counter==5)
  {
    timeout=1;
    counter=0;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -