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

📄 two18.c

📁 通过51单片机控制用sp2349扩展串口
💻 C
📖 第 1 页 / 共 5 页
字号:
# include<reg52.h>
# include<VIIC_C51.h>
# include<stdlib.h>
# include<string.h>
//***********************************************************

# define  uchar unsigned char
# define  uint unsigned int
# define  S24C04  0xA0

# define  VM   x                //宏定义VM为7.6km/h /M(平均每个脉冲所等价的速度)
# define  c    DangerDis          //危险距离
# define  d    SafeDis            //安全距离
# define  e    StartSpeed         //启动速度
# define  f    SafeSpeed          //安全速度

# define  OLEN   14                //发送缓冲区大小                                     2006 4 14
uchar idata outbuf[OLEN];         //发送缓冲区
uchar idata *outlast=outbuf;      //最后由中断传输出去的字节位置
uchar idata *putlast=outbuf;      //最后放入发送缓冲区的字节位置
# define  ILEN    8               //接收缓冲区大小
# define  SVLEN   8               //距离、速度缓冲区大小
uchar idata inbuf1[ILEN];         //接收缓冲区1
uchar idata inbuf2[ILEN];         //接收缓冲区2
uchar idata inbuf3[14];           //接收缓冲区3                                        2006 5 11
uchar idata BUF2[SVLEN];           //速度字符串缓存
uchar idata copyinbuf1[SVLEN];    //备份第一路数据
uchar idata copyinbuf2[SVLEN];    //备份第二路数据
uchar idata *inlast1=inbuf1;      //最后由中断进入接收缓冲区1的字节位置
uchar idata *inlast2=inbuf2;      //最后由中断进入接收缓冲区2的字节位置
uchar idata *inlast3=inbuf3;      //最后由中断进入接收缓冲区3的字节位置                2006 5 11


bit bdata outbufsign;             //输出缓冲区非空标志    有=1
bit bdata inbufful1;              //输入缓冲区1满标志     满=1
bit bdata inbufful2;              //输入缓冲区2满标志     满=1
bit bdata inbufful3;              //输入缓冲区3满标志     满=1                         2006 5 11

bit bdata DBshort;                 //短距离定标指示                                                    2006 5 21
bit bdata DBlong;                  //长距离定标指示                                                    2006 5 21
bit bdata ST_ON;                   //激活测距仪有效标志                                                2006 5 21
bit bdata DB_ON;                   //定标有效标志                                                      2006 5 21
bit bdata CS_ON;                   //参数设置有效标志                                                  2006 5 21

bit bdata order;                  //显示模块指令数据                                                    2006 5 21

bit bdata r_flag1;                //数据接收标志1,当接到数据串第一个字节后变量置1
bit bdata r_flag2;                //数据接收标志2,当接到数据串第一个字节后变量置1
bit bdata v_full;                 //新速度有标志,有新速度置1,取走置0
bit bdata OI;                     //子串口0、1选择标志量
bit bdata C2;                     //                                                      2006 5 11

bit bdata s2;                     //距离调整标志
bit bdata v2;                     //速度调整标志

bit bdata cutflag;                //断油标志
bit bdata brakeflag;              //刹车标志
bit bdata blankflag;              //恢复正常状态标志

bit bdata door1;                  //门1
//bit bdata door2;                  //门2

bit bdata no1come1;               //第一路数据到达标志
bit bdata no2come2;               //第二路数据到达标志

bit bdata no1wrong1;              //第一路数据错误
bit bdata no2wrong2;              //第二路数据错误

bit bdata resend1;                //数据重发                              2006 3 31
bit bdata resend2;                //数据重发                              2006 3 31

//bit bdata Twosecflag;             //两秒定时标志                          2006 4 14

bit bdata sky;                    //对空数据

//接口定义
//***********************************************************
sbit slow1=P0^0;                     //断油输出端
sbit slow2=P0^1;
sbit slow3=P0^2;
sbit slow4=P0^3;
sbit slow5=P0^4;

//sbit red=P1^1;                      //短距离定标灯指示                       2006 4 14
//sbit green=P1^2;                    //长距离定标灯指示                       2006 4 14
//sbit click=P3^2;                    //外中断0                                2006 4 14
//sbit dial=P3^6;                     //定标开关                               2006 4 14

sbit stop=P0^5  ;                   //刹车输出端
//sbit alarm=P3^7 ;                   //声光报警输出端

/*sbit  RS  =  P1^5;                  //液晶显示接口定义
sbit  RW  =  P1^6;
sbit  E   =  P1^7;
*/
sbit AdrIn0 = P1^3;                 //子串口0、1、2接收地址
sbit AdrIn1 = P1^4;
sbit AdrOut0 = P0^6;                //子串口0、1、2发送地址
sbit AdrOut1 = P0^7;

/* extern void DelayUs(unsigned int delay_tmp);    //显示延时
extern void write_com(unsigned char com_data);   //写指令子程序
extern void write_data(unsigned char data_tmp);  //写数据子程序
extern void write_hz(unsigned char *hz_data, unsigned char nm);   //写汉字
extern void write_zf(unsigned char *zf_data, unsigned char nm);   //写字符
extern void st_setup(void);         //LCD初始化
*/
//固定参数ROM存储,数字包括小数点共七位。

//uchar code  CHIN1[] ={0x53,0x3A};    //显示"S:"
//uchar code  CHIN2[] ={0x56,0x3A};    //显示"V:"
//uchar code  NORMAL[]="正常行使";     //显示"正常行使"
//uchar code  SPEED[] ={0x18,0x21};    //超速标志
//uchar code  DIST[]  ={0x17,0x21};    //危险距离标志
//uchar code  CUT5[]  ={0x19,0x35};    //断油5路
//uchar code  CUT4[]  ={0x19,0x34};    //断油4路
//uchar code  CUT3[]  ={0x19,0x33};    //断油3路
//uchar code  CUT2[]  ={0x19,0x32};    //断油2路
//uchar code  CUT1[]  ={0x19,0x31};    //断油1路
//uchar code  BRAKE[]  ={0x10,0x11};    //刹车标志
//uchar code  WHITE1[]={0x20,0x20};    //空两字符
//uchar code  WHITE2[]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};   //空八字符


//参数RAM存储

static uchar overflow_10ms;        //T0中断溢出次数
static uchar TIsign;               //中断向母串口发零以使母子串口波特率协调

static uchar data_number1;         //接收的数据个数
static uchar warning1;             //判断接收数据正误标志
static uchar data_number2;         //接收的数据个数
static uchar warning2;             //判断接收数据正误标志
//static uchar data_number3;         //                          串口3接收的数据个数                   2006 5 20

static uchar cutcount;             //断油时间计数                        2006.3.6
static uchar brakecount;           //刹车时间计数                        2006.3.6
static uchar brakestatus;          //刹车频率设置                        2006.3.7
static uchar blankcount;           //恢复正常时间计数                    2006.3.7

//static uchar alarmlevel;           //报警等级                            2006.3.9
//static uint  alarmcount;           //报警时间计数                        2006.3.9
//static uchar alarmstatus;          //报警频率设置                        2006.3.9

static uchar no1count;               //第一路数据计数                    2006 3 20
static uchar no2count;               //第二路数据计数                    2006 3 20

static uint no1wrong1count;         //等待数据计时                      2006 3 31
static uint no2wrong2count;         //等待数据计时                      2006 3 31

//static uchar int0count;             //外中断次数计数                    2006 4 14
//static uchar Twoseccount;           //2秒计时                           2006 4 14

float  idata  rv=0;              //实际速度浮点变量

uint idata  x;//=000;                //速度脉冲系数                                            2006 5 21
uint idata  c;//=010;//10.0  ;       //危险距离                                                2006 5 21
uint idata  d;//=200;//200.0 ;       //安全距离                                                2006 5 21
uint idata  e;//=025;//25.0 ;       //启动速度
uint idata  f;//=120;//120.0 ;       //安全速度

uint idata  t0;//=225;//0.225;       //30km/h 制动距离与速度比
uint idata  t1;//=305;//0.305;       //40km/h 制动距离与速度比
uint idata  t2;//=380;//0.380;       //50km/h 制动距离与速度比
uint idata  t3;//=450;//0.450;       //60km/h 制动距离与速度比
uint idata  t4;//=557;//0.557;       //70km/h 制动距离与速度比
uint idata  t5;//=675;//0.675;       //80km/h 制动距离与速度比
uint idata  t6;//=756;//0.756;       //90km/h 制动距离与速度比
uint idata  t7;//=840;//0.840;       //100km/h 制动距离与速度比                                2006 5 21
uint idata  t8;//=927;//0.927;       //110km/h 制动距离与速度比                                2006 5 21
uint idata  t9;//=917;//0.917;       //120km/h 制动距离与速度比                                2006 5 21



//=====================================================
//函数名称:serial() interrupt 4  串口中断
//功能描述:串口接收、发送数据
//输入:/
//输出:/
//全局变量: outbufsign  TIsign  OI
//           r_flag1  data_number1  inbufful1  no1come1
//           r_flag2  data_number2  inbufful2  no2come2

//调用模块: /
//=====================================================
serial() interrupt 4
{
 if(TI)
   {
    TI=0;
    if(outbufsign)                              //缓冲区满标志
    {
     if(TIsign==0)                                 //TIsign为零发数据
     {
      if(C2==0)
       {
        if(OI==0)                                  //如果发给串口0
        {
         AdrOut0=0;                                 //置串口0地址
         AdrOut1=0;
         SBUF=*outlast;                             //未发送完继续发送
         outlast++;                                 //最后传出去的字节位置加一
         }
        else
        {
         AdrOut0=1;                                 //置串口1地址
         AdrOut1=0;
         SBUF=*outlast;                            //未发送完继续发送
         outlast++;                                //最后传出去的字节位置加一
         }
        }
       else
        {
         AdrOut0=0;                                 //置串口2地址
         AdrOut1=1;
         SBUF=*outlast;
         outlast++;
         }
      TIsign=3;                                    //置发零个数标志量为三
      }
     else                                        //否则发零
      {
       AdrOut0=1;                                //置母串口地址
       AdrOut1=1;
       SBUF=0;                                   //发零
       TIsign--;
       }
     if(outlast==outbuf+OLEN) outlast=outbuf;    //地址到顶部回到底部
     if((putlast==outlast)&&TIsign==0) outbufsign=0;         //数据发送完置发送缓冲区空标志
      }
    }
 if(RI)
   {
    RI=0;
    if(AdrIn1==0)
     {
     if(AdrIn0==0)                              //串口0接到数据
     {
      data_number1++;                           //个数加一
      if(data_number1==1)                       //当接到第一个数据时,标志量置一
      {
       r_flag1=1;
      }
      if(data_number1>=7&&data_number1<=14)     //截取需要的数字串
      {
       *inlast1=SBUF;                            //放入数据
       inlast1++;                                //最后放入的位置加一
       }
      if(inlast1==inbuf1+ILEN)                  //地址到顶部回到底部
       {
        inlast1=inbuf1;
        inbufful1=1;                            //接收缓冲区满置满标志
        no1come1=1;                             //第一路数据到达                          2006 3 20
       }
      }

    else                                      //串口1接到数据
     {
      data_number2++;                           //个数加一
      if(data_number2==1)                       //当接到第一个数据时,标志量置一
      {
       r_flag2=1;
      }
      if(data_number2>=7&&data_number2<=14)     //截取需要的数字串
      {
      *inlast2=SBUF;                            //放入数据
      inlast2++;                                //最后放入的位置加一
      }
      if(inlast2==inbuf2+ILEN)                  //地址到顶部回到底部
       {
        inlast2=inbuf2;
        inbufful2=1;                            //接收缓冲区满置满标志
        no2come2=1;                             //第二路数据到达                          2006 3 20
       }
      }
    }
   else                                         //串口2接到数据                  2006 5  11
     {
      if(inbufful3==0)                            //
       {
         *inlast3=SBUF;                            //放入数据

         if(*inlast3=='$')                         //           显示模块指令数据                        2006 5 21
         {
          DB_ON=1;
          order=1;
          }

         if(*inlast3=='*')                        //           参数设置数据                              2006 5 21
          {
//           inlast3--;                             //指针减一                                           2006 5 23
           CS_ON=1;                               //参数设置有效标志                                     2006 5 21
           }

         inlast3++;                                //最后放入的位置加一

         if((inlast3==inbuf3+6)&&order==1)        //                          显示模块数据           2006 5 21
          {
           inlast3=inbuf3;
           inbufful3=1;
           order=1;
          }

         if(inlast3==inbuf3+14)                  //地址到顶部回到底部            参数设置数据           2006 5 21
          {
           inlast3=inbuf3;
           inbufful3=1;                            //接收缓冲区满置满标志
           }
        }

      }                                         //                                         2006 5 11

    }
}
//========================================================================================
//函数名称:timer0_ISR() interrupt 1 定时器T0中断
//功能描述:T0中断
//输入:/
//输出:/
//全局变量: overflow_10ms  rv  v_full
//           r_flag1  data_number1  no1come1  warning1
//           r_flag2  data_number2  no2come2  warning2
//           cutflag  cutcount  brakeflag  brakecount  brakestatus
//           door1  door2
//           blankflag  blankcount
//           no1count  no1wrong1  no2count  no2wrong2

//调用模块: /
//========================================================================================
void timer0_ISR(void)interrupt 1
{
 overflow_10ms++;                              //溢出次数加一
 TR0=0;                                        //关定时器T0
 TH0=0xB8;                                     //置初值
 TL0=0x00;
 TR0=1;                                        //开定时器T0
 //==================================================
 //取速度
 //==================================================
 if(overflow_10ms==20)                         //溢出次数达到20次,取T1计数值
 {
  TR1=0;                                       //关计数器T1
  overflow_10ms=0;                             //溢出次数清零
  rv=TL1;                                      //取计数值
  rv=(rv*VM)/10;                               //计算所计速度
  TL1=0;                                       //计数值T1清零
  TR1=1;                                       //开计数器T1
  v_full=1;                                    //得新速度,标志量置1
  }
 //==================================================
 //检查距离数据
 //==================================================
  if(r_flag1==1&&data_number1==16)             //常规情况下串口接收中断与T0中断不相遇
  {
   if(warning1==1)                              //接到第一次警告
   warning1=0;                                  //清零,防止警告累加到下一次接收中
   r_flag1=0;                                  //接收标志量清零
   data_number1=0;                              //接收个数标志清零
   }
  if(r_flag2==1&&data_number2==16)
   {
   if(warning2==1)                              //接到第一次警告
   warning2=0;                                  //清零,防止警告累加到下一次接收中
   r_flag2=0;                                  //接收标志量清零
   data_number2=0;                              //接收个数标志清零

⌨️ 快捷键说明

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