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

📄 two18.c

📁 通过51单片机控制用sp2349扩展串口
💻 C
📖 第 1 页 / 共 5 页
字号:
   }

  if(r_flag1==1&&data_number1<16)                   //特殊情况下T0中断位于接收中断之间(包含错误接收情况)
  {
   warning1++;
   if(warning1==2)                              //确定发生错误
   {
    r_flag1=0;                                 //接收标志量清零
    data_number1=0;                             //接收个数标志清零
    warning1=0;                                 //次数清零
    inlast1=inbuf1;                              //指针指向缓存首址
    inbufful1=0;                                //置缓冲区空标志
    no1come1=0;                                 //                                             2006 3 20

    }
  }
   if(r_flag2==1&&data_number2<16)                   //特殊情况下T0中断位于接收中断之间(包含错误接收情况)
  {
   warning2++;
   if(warning2==2)                              //确定发生错误
   {
    r_flag2=0;                                 //接收标志量清零
    data_number2=0;                             //接收个数标志清零
    warning2=0;                                 //次数清零
    inlast2=inbuf2;                              //指针指向缓存首址
    inbufful2=0;                                //置缓冲区空标志
    no2come2=0;                                 //                                             2006 3 20
    }
   }
 //==================================================
 //刹车、断油控制
 //==================================================
   if(cutflag==1)                               //如果断油标志有效
   {
      --cutcount;
    if(cutcount==100)                          //断油时间段计数,且断油时间达0.5s
     {
      brakeflag=1;                              //置刹车标志有效
      brakecount=101;                            //刹车定时时间置初值,定时0.5s
      brakestatus=21;                            //刹车定时周期0.06秒,高低电平时间等长     2006.3.9
//      door2=1;                                  //门2开
      stop=0;                                   //刹车状态有效               2006 3 9
//      alarm=1;                                  //报警      2006 3 16

      }
    if(brakeflag==1)
     {
        --brakecount;
      if(brakecount==0)
       {
        door1=1;                                //门1开
        cutflag=0;                              //断油结束标志
        brakeflag=0;                            //刹车结束标志
        blankflag=1;                            //恢复正常状态标志有效
        blankcount=8;                          //恢复正常定时时间置初值,定时0.06s
        }
 //==================================================
 //ABS刹车控制,16.67Mhz
 //==================================================
        --brakestatus;
      if(brakestatus==0)                      //定时时间到         2006 3 9
       {
         if(stop==0)
         {
          brakestatus=10;                     //置初值             2006 3 9
          stop=1;
          }
         if(stop==1)
         {
          brakestatus=20;
          stop=0;
          }
//         stop=!stop;                            //状态取反           2006 3 9
        }

      }

    }
 //==================================================
 //恢复正常段
 //==================================================
   if(blankflag==1)                             //恢复正常标志有效
    {
       --blankcount;                                           //
     if(blankcount==0)                        //定时时间到
     blankflag=0;                               //恢复正常状态结束
     }
 //==================================================
 //数据接收频率控制
 //==================================================
   if(--no1count==0)                              //第一路接收频率计数标志到零      2006 3 20
    {
     no1wrong1=1;                                 //第一路数据出错标志有效          2006 3 20
     no1come1=1;                                  //第一路数据到达标志有效          2006 3 20
     }

   if(no1come1==1)                                //第一路数据到达                  2006 3 20
    {
     no1come1=0;                                  //到达标志清零                    2006 3 20
     no1count=10;                                 //接收频率计数标志置初值,定时0.1s(10hz)        2006 3 20
     }
//===================================================
//
//===================================================

   if(--no2count==0)                              //第二路接收频率计数标志到零      2006 3 20                                2006 3 20
    {
     no2wrong2=1;                                 //第二路数据出错标志有效          2006 3 20                                2006 3 20
     no2come2=1;                                  //第二路数据到达标志有效          2006 3 20
     }

   if(no2come2==1)                                //第二路数据到达                  2006 3 20
    {
     no2come2=0;                                  //到达标志清零                    2006 3 20                                2006 3 20
     no2count=10;                                 //接收频率计数标志置初值,定时0.1s(10hz)     2006 3 20                           2006 3 20
     }
 //==================================================
 //发送命令给测距仪,超过定时时间无数据,使其重发数据
 //==================================================
 //子串口0
   if(no1wrong1==0)                               //数据正确,置定时时间20秒
   no1wrong1count=2000;

   if(no1wrong1==1)                               //定时20秒时间内,无数据,置发送命令标志为1
    {
     if(--no1wrong1count==0)
       {
        no1wrong1count=2000;                      //置定时初值
        ST_ON=1;                                  //激活有效
        resend1=1;                                //置重发标志
        }
    }

  //子串口1
   if(no2wrong2==0)                               //数据正确,置定时时间20秒
   no2wrong2count=2000;

   if(no2wrong2==1)                               //定时20秒时间内,无数据,置发送命令标志为1
    {
     if(--no2wrong2count==0)
       {
        no2wrong2count=2000;                      //置定时初值
        ST_ON=1;                                  //激活有效
        resend2=1;                                //置重发标志
        }
    }

 //==================================================
 //定标2秒定时
 //==================================================
/*   if(Twosecflag==1)                                 //                        2006 4 14
    {
     if(--Twoseccount==0)                            //定时时间到
      {
       if(int0count>=2)                              //中断次数为二
       {
        DBshort=0;                                       //点亮红灯
        Twosecflag=0;                                //清定时标志
        int0count=0;                                 //清中断次数
        }
       else                                          //次数为一
       {
        DBlong=0;                                     //点亮绿灯
        Twosecflag=0;                                //清定时标志
        int0count=0;                                 //清中断次数
       }
     }
   }            */                                 //                        2006 4 14
 //==================================================
 //报警控制
 //==================================================
 /*  if(alarmlevel==1)                          //一级报警,周期1秒
    {
       --alarmcount;                          //定时计数减一
     if(--alarmstatus==0)                     //定时状态至零,状态反转
      {
       alarmstatus=50;
       alarm=!alarm;
       }
     if(alarmcount==0)                        //计数定时到,取消报警级别,关报警
      {
       alarmlevel=0;
       alarm=0;
       }
     }
   if(alarmlevel==2)                          //二级报警,周期0.8秒
    {
       --alarmcount;
     if(--alarmstatus==0)
      {
       alarmstatus=40;
       alarm=!alarm;
       }
     if(alarmcount==0)
      {
       alarmlevel=0;
       alarm=0;
       }
     }
   if(alarmlevel==3)                          //三级报警,周期0.6秒
    {
      --alarmcount;
     if(--alarmstatus==0)
      {
       alarmstatus=30;
       alarm=!alarm;
       }
     if(alarmcount==0)
      {
       alarmlevel=0;
       alarm=0;
       }
     }
   if(alarmlevel==4)                          //四级报警,周期0.4秒
    {
      --alarmcount;
     if(--alarmstatus==0)
      {
       alarmstatus=20;
       alarm=!alarm;
       }
     if(alarmcount==0)
      {
       alarmlevel=0;
       alarm=0;
       }
     }
   if(alarmlevel==5)                          //五级报警,周期0.1秒
    {
      --alarmcount;
     if(--alarmstatus==0)
      {
       alarmstatus=10;
       alarm=!alarm;
       }
     if(alarmcount==0)
      {
       alarmlevel=0;
       alarm=0;
       }
     }
   if(alarmlevel==6)                          //五级报警,周期0.1秒
    {
      --alarmcount;
     if(--alarmstatus==0)
      {
       alarmstatus=5;
       alarm=!alarm;
       }
     if(alarmcount==0)
      {
       alarmlevel=0;
       alarm=0;
       }
     } */
}
//============================================================================================
//结束
//============================================================================================

//=====================================================
//延时
//=====================================================
 void DelayUs(unsigned int delay_tmp)     //延时N us
{
   while(delay_tmp)
       delay_tmp--;
}

//=====================================================
//定标按键,外中断0,电平触发
//=====================================================
/* void int0(void) interrupt 0                 //                                2006 4 14
{
 uchar i;
 if(dial==0)                                //
  {                                         //中断次数加一
    int0count++;                            //中断次数为一,置两秒定时初值
    if(int0count==1)
     {
      Twosecflag=1;
      Twoseccount=200;
      }

    for(i=0; i<30; i++)                    //延时210ms
    DelayUs(0x5FF);

   }

 }
 */
//=====================================================
//函数名称:INT2ASCII()  浮点化字符
//功能描述:浮点型数据化为字符串型
//输入: j  浮点型
//输出:/
//全局变量: /
//调用模块: /
//=====================================================
void INT2ASCII(float j)
{
 uchar i;
 uint v;
 i=0;
 v=(uint)(j*10);                        //浮点数值扩大10倍并化浮点为整型
 BUF2[i++]=(v/10000+0x30);              //取千分位
 BUF2[i++]=((v%10000)/1000+0x30);       //取百分位
 BUF2[i++]=((v%1000)/100+0x30);         //取十分位
 BUF2[i++]=((v%100)/10+0x30);           //取个位
 BUF2[i++]='.';
 BUF2[i++]=(v%10+0x30);                //取小数点后一位小数
 BUF2[i++]='0';                        //小数点后第二位添零
 BUF2[i++]='M';                        //以'M'作为串尾

 }
//=====================================================
//函数名称:putbytes()  中断发送
//功能描述:放一串数据到发送缓冲区
//输入:*outplace   j
//输出:/
//全局变量: outbufsign
//调用模块: /
//=====================================================
putbytes(unsigned char *outplace,unsigned char j)
{
 int i;
 for(i=0;i<j;i++)
 {
  *putlast=*outplace;                          //放字节进入缓冲区
  putlast++;                                   //入指针加一
  outplace++;                                  //字符串指针加一
  if(putlast==outbuf+OLEN)putlast=outbuf;      //指针到了顶部换到底部
  }
  if(!outbufsign)
  {
   outbufsign=1;
   TI=1;
  }          //缓冲区开始为空,置为“有”标志,启动发送

 }
//=====================================================
//查询发送命令
//=====================================================
senddatas(uchar *sendline,uchar j)
{
 uchar i;
 for(i=0;i<j;i++)
  {
     if(C2==0)
     {
      if(OI==0)                                  //如果发给串口0
      {
       AdrOut0=0;                                 //置串口0地址
       AdrOut1=0;
       SBUF=*sendline;                             //未发送完继续发送
       sendline++;                                 //最后传出去的字节位置加一
       while(TI==0);                               //查询发送                         2006 4 19
       TI=0;
       }
      else
      {
       AdrOut0=1;                                 //置串口1地址
       AdrOut1=0;
       SBUF=*sendline;                            //未发送完继续发送
       sendline++;                                //最后传出去的字节位置加一

⌨️ 快捷键说明

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