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

📄 liu3.c

📁 80C51单片机控制程序.设计了一个输液控制器的控制.
💻 C
📖 第 1 页 / 共 2 页
字号:
    for(i=0;i<25000 && !P3_2&&!F_warn;i++);//等待



//调节
void adjust(void)
{
  uchar i;
 uchar s_width;  //定义设置速度与当前滴速的差值
  if(cur_speed>set_speed)  //当前速度大于设置速度,正转,P1_6控制转动方向
  {
    s_width=cur_speed-set_speed;
    P1_6=0;                                     //正转准备
  }
  else                    //当前速度小于设置速度,反转
  {
    s_width=set_speed-cur_speed;
    P1_6=1;                                    //反转准备
  } 
  while((judge()>(set_speed/5))&&(set_speed>30)&&(!F_warn)&&(!F_key))
  {                                           //无报警信号,自动调节,设置速度大于30,速度差大于设置的20%
    P1_7=1;
    delay(300);
     P1_7=0;
    delay(300);                                 //全速至20%
    display(Dis_buff);                          //送显
  }
 while((judge()>(set_speed/10))&&(set_speed>30)&&(!F_warn)&&(!F_key))
  {                                         //无报警信号,自动调节,设置速度大于30,速度差大于设置的10%
    P1_7=1;
    delay(300);
    P1_7=0;
    delay(1000);
    display(Dis_buff);                           //减速至10%
  }
  if(judge()>(set_speed/20)&&(set_speed>30)&&(!F_warn)&&(!F_key))
  {
    for(i=0;i<250&&(!F_warn)&&(!F_key);i++)
    {
     P1_7=1;
     delay(100);
     P1_7=0;
     delay(3000);                                //微调至5%
     display(Dis_buff);
    }
  }
 while(judge()>(set_speed/10)&& (set_speed<31)&&(!F_warn)&&(!F_key))    //速度设定小于30,特殊处理
   {
    if(cur_speed>60)
    {
      P1_7=1;
      delay(300);
      P1_7=0;
      delay(300);
      display(Dis_buff);                             //全速
    }
    else if(cur_speed>40)
    {
      P1_7=1;
      delay(300);
      P1_7=0;
      delay(1200);
      display(Dis_buff);                             //减速
    }
    else if(cur_speed>30)
    {
      P1_7=1;
      delay(300);
      P1_7=0;
      delay(3000);
      display(Dis_buff);                             //减速
    }
    else
    {
      for(i=0;(i<20)&&(!F_warn)&&(!F_key);i++)
      {
       P1_7=1;
       delay(300);
       P1_7=0;
       delay(5000);
       display(Dis_buff);                             //微调
      }
    }
  }
  display(Dis_buff);
  for(i=0;(i<250)&&(!F_warn) && (set_speed>30)&&(!F_key);i++)
  {
    P1_7=1;
    delay(300);
    P1_7=0;
    delay(3000);
    display(Dis_buff);                             //微调
  }
}
uchar judge(void)           //判断正反转方向,并计算速度差
{
  uchar width;
  if(cur_speed>set_speed)
  {
    width=cur_speed-set_speed;  //width为速度差
    P1_6=0;                                     //正转准备
  }
  else
  {
    width=set_speed-cur_speed;
    P1_6=1;                                    //反转准备
  }
  return width;
}
/////////////////////////////////////////////////////////////
///////////////////串行通信函数//////////////////////////////
uchar code comm_s=0x02;//这是从机号,以二号从机为例
//comm_s[0]:机器号
//comm_s[1]:自动
//comm_s[2]:手动
//comm_s[3]:字节1
//comm_s[4]:字节2
//comm_s[5]:字节3
//comm_s[6]:结束

extern bit F_auto,F_warn;//F_auto为主控(自动)/从控标志位
extern uchar warn,cur_speed,set_speed;
extern uchar Dis_buff[16];

uchar receive(void)
{
  uchar j,R_Data;
  En_send=0;//处于接收状态
  for(j=0;j<1000;j++)
  {
    if(RI!=0)//有中断请求
    {
       RI=0;
       R_Data=SBUF;//接收数据放R_Data里
       break;
    }
  }
  RI=0;
  if(j>999)R_Data=0xff;//在规定时间内未接到信息则返回ff
  return R_Data;
}
void send(uchar se_dat)//发送从机设置的速度
{
  En_send=1;//处于发送状态
  SBUF=se_dat;//发送数据
  while(TI==0);//等待发送完毕
  TI=0;        //软件清0
  En_send=0;//不发送则清0

}
void commution(void)
{
  uchar slave,dat_sp,dis_sp1;
   ES=0;//关中断
   if(RB8==1)//接收到的第9位为1,表明接收的是地址
   {
     slave=receive();
     if(slave==comm_s)//接收到的地址等于机器号
     {
       SM2=0;   //开始单机通信,将接收到的数据装入SBUF中
       send(comm_s);//返回本机地址
     }
   }
   else
   {
     dat_sp=receive();//否则,接收到的为数据属性命令字
     switch(dat_sp)
     {
       case 0xe0:  //主控,从机处于按键无效状态(紧急报警除外)
       {
         F_auto=1;  //自动标志位置1
         set_speed=receive();//设置速度等于主机设置值
         Dis_buff[2]='A';  //显示缓存置A,表示auto
         if(!F_warn)  //将速度送显示缓存
         {
           Dis_buff[8]=set_speed%10+'0';
           dis_sp1=set_speed/10;
           Dis_buff[7]=dis_sp1%10+'0';
           Dis_buff[6]=dis_sp1/10+'0';
           if(Dis_buff[6]=='0')Dis_buff[6]=' ';
         }
       }break;
       case 0xe3://授权从机,从机处于手动调节状态
       {
         F_auto=0;//标志位置0
         send(set_speed);//返回从机设置速度值
         Dis_buff[2]='H';//H表示hand,送显示缓存
       }break;
       case 0xfe://终止命令字
       {
         SM2=1;//多机通信控制位置1,恢复多机通信
       }break;
       case 0xf0://返回当前warning 
       {
         send(warn);
       }break;
       case 0xf1://返回从机当前滴速
       {
         send(cur_speed);
       }break;
       default:break;
     }
   }
    ES=1;//开串行口中断
}
///////////////////////////LCD显示程序/////////////////
/*查询LCD是否忙*************************************************/
void delay(uint shu)                 //延时,数可以自己定义
 {for(;shu!=0;shu--);}
void wait(void)                     //读忙状态
  {do{ACC=lcdr;}while(ACC_7==1);delay(10);}  //ACC_7=1,则lcd忙
void display(uchar *tab)  //*tab指向要显示数据缓冲区首地址
{
  uchar i;
  wait();
  lcdcom=0x80;           //80置DDRAM地址为00H,从第一行开始显示
  for(i=0;i<8;i++)
   {
    wait();
    lcdw=tab[i];         //显示表中前8位
   }
  wait();
  lcdcom=0xc0;          //c0置DDRAM地址为40H,换为第二行显示
 for(;i<16;i++)         //在第二行显示后8位
  {
   wait();
   lcdw=tab[i];
  }
}
/*LCD初始化***********/
void lcdinit(void)
{
 uchar i;
 wait();lcdcom=0x38;  wait();lcdcom=0x06; //38表示双行显示,5*7点阵 ;06表示AC 增量,显示不移位,
 wait();lcdcom=0x0f;  wait();lcdcom=0x01; //显示开,显示光标,光标闪烁;01是清屏
 wait();
}

⌨️ 快捷键说明

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