×
嵌入式 > 技术百科 > 详情

单片机 液体点滴控制

发布时间:2020-06-20 发布时间:
|
//==============================200700821=================//

//====================从机滴速测量========================//
#include
//====================数据类型定义========================//
#define Uchar unsigned char
#define Uint  unsigned int
//====================常量定义============================//
Uchar t;
Uchar p;
Uchar m;
int time;              //ms为单位

//=====================LCD1602变量定义====================//
char xdata Lcd1602CmdPort     _at_ 0xf9fc;  //E=1  RS=0 RW=0 写命令
char xdata Lcd1602WdataPort   _at_ 0xf9fd;    //E=1  RS=1 RW=0 写
char xdata Lcd1602StatusPort  _at_ 0xf9fe;      //E=1 RS=0 RW=1
#define Busy 0x80                            // 忙判别位   
static  unsigned char ucLcdPosX;                //当前显示指针
static  unsigned char ucLcdPosY;
//=====================LCD1602函数定义====================//
extern void LcdWriteData( char dataW );                             //LCD写数据
extern void LcdWriteCommand( Uchar CMD,Uchar AttribC );       //LCD写命令
extern void LcdReset( void );  
extern void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void disp_v(void);                                             //显示速度函数
//=====================延时函数定义=======================//
extern void Delay1000Ms(void);
extern void Delay400Ms(void);
extern void Delay5Ms(void);
void delay(Uint m);
//======================滴速变量定义======================//
Uchar set_v;                    //设定的速度
Uchar real_v;                   //实际速度
//======================中断初始化函数定义================//
void int_init(void);
//=======================步进电机变量定义=================//
Uchar code FFW[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};
Uchar code REV[8]={0x90,0x10,0x30,0x20,0x60,0x40,0xc0,0x80};
sbit  K1   = P1^7;         //A
sbit  K2   = P1^6;         //B
sbit  K3   = P1^5;         //C
sbit  K4   = P1^4;      //D
//=======================步进电机函数定义=================//
void  motor_ffw(void);//正转
void  motor_rev(void);//反转
void control(void);   //调节滴速
//===================LCD1602函数说明======================//

/*=======================================================
 显示光标定位4行
=======================================================*/

void LocateXY( char posx,char posy) {

Uchar temp;

 temp = posx & 0xf;
 posy &= 0x03;
   switch ( posy)
   {
    case 0:;
 break;
    case 1:temp |= 0x40;
 break;
    default:;
   }
    temp |= 0x80;
 LcdWriteCommand(temp,0);
}
/*=======================================================
 按指定位置显示数出一个字符
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {

 LocateXY( x, y );    // 定位显示地址
 LcdWriteData( Wdata );   // 写字符
}

/*=======================================================
 初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void LcdReset( void ) {

    LcdWriteCommand( 0x38, 0);   // 显示模式设置(不检测忙信号)
  Delay5Ms();
 LcdWriteCommand( 0x38, 0);   // 共三次
  Delay5Ms();
 LcdWriteCommand( 0x38, 0);
  Delay5Ms();

 LcdWriteCommand( 0x38, 1);   // 显示模式设置(以后均检测忙信号 参数--"1")
    LcdWriteCommand( 0x08, 1);   // 显示关闭
    LcdWriteCommand( 0x01, 1);   // 显示清屏
 LcdWriteCommand( 0x06, 1);   // 显示光标移动设置
 LcdWriteCommand( 0x0c, 1);   // 显示开及光标设置
}

/*=======================================================
 写控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC )
{
    if (AttribC)
 {
  P0=0xff;
  while( Lcd1602StatusPort & Busy );  // 检测忙信号?
 }
 Lcd1602CmdPort = CMD;
}
 
/*=======================================================
 当前位置写字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW )
{
    while( Lcd1602StatusPort & Busy );     // 检测忙信号

 Lcd1602WdataPort = dataW;
}
//=====================延时函数说明==========================//
// 短延时
void Delay5Ms(void)
{
 Uint i = 5552;
 while(i--);
}

//长延时
void Delay400Ms(void)
{
 Uchar i = 5;
 Uint j;
 while(i--)
 {
 
        j=1817;   //100Ms
  while(j--);
 };
}
//更长延时
void Delay1000Ms(void)
{
 Uchar i = 5;
 Uint j;
 while(i--)
 {
     j=18172;
      
  while(j--);
 };
}
void delay(Uint m)
                         
   Uint k;
   while(m--)
   {
     for(k=0; k<125; k++)
     { }
   }
}
//==================中断初始化函数说明====================//
void int_init(void)
{EA=1;
 EX1=1;
 EX0=1;
 ET1=1;
 
}
//===================外部中断0函数说明====================//
void high(void) interrupt 0 using 0
{
 EA=0;
 DispOneChar(8,0,'E');
 EA=1;
}
//===================外部中断1函数说明====================//
void count(void) interrupt 2 using 1
{
    EX1=0;
    while (INT1==0);
   
 
 m++;
 if (p==3)
 {
  TR1=0;
     time=(TH1*256+TL1-5536)/1000+60*t;
     real_v=60000/(time/3);
     t=0;
     p=0;
     time=0;
   
 }
    if(p<3&&p!=0)
 {
  p++;
  
 }
 if (p==0)
 {
 t=0;
 TH1=0x15;
 TL1=0x9f;
 TR1=1;
 p++;
 
 }
}
//====================定时器1中断函数说明=================//
void get_time(void) interrupt 3 using 3
{
 TR1=0;
    t++;
    if(t%4==0)
    EX1=1;
    TH1=0x15;
 TL1=0x9f;
 TR1=1;
}

//=======================显示速度函数说明=================//
void disp_v(void)
{
    Uchar i;
 Uchar v_real[16]="realspeed:   /m";
 v_real[10]=real_v/100+0x30;
 v_real[11]=(real_v%100)/10+0x30;
    v_real[12]=real_v%10+0x30;
    for(i=0;i<15;i++)
    {
     DispOneChar(i,0,v_real[i]);
    }
}
//======================步进电机函数说明==================//
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void  motor_ffw()
{
   Uchar i;
  
  
          for (i=0; i<8; i++)         //一个周期转7.2度
        {
          P1 = FFW[ i ];              //取数据
          delay(15);                 //调节转速
        }
 
}
/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void  motor_rev()
{
     Uchar i;
    
        for (i=0; i<8; i++)            //一个周期转7.2度
        {
          P1 = REV[ i ];                    //取数据
          delay(15);                       //调节转速
        }
   
}
//====================调节滴速函数说明====================//
void control(void)
{char count;
   
   
    count=set_v-real_v;
 if (count>=5)
 {
 motor_rev();
 }
 else if (count<=-5)
 {
 motor_ffw();
 }
 else
 {
 EX1=0;
 ET1=0;
 Delay1000Ms();
 Delay1000Ms();
 EX1=1;
 ET1=1;
 }
}
//======================主函数说明========================//
main()
{
    TMOD=0x10;
    IT1=0;
    set_v=100;
    p=0;
    t=0;
    m=0;
    time=0;
    real_v=0;
 LcdReset();
 Delay400Ms();
 int_init();
 while(1)
 {
     disp_v();
     DispOneChar(4,1,m/100+48);
     DispOneChar(5,1,m%100/10+48);
     DispOneChar(6,1,m%10+48);
     if(real_v)
     control();
     else
     motor_ffw();

     }
 
}

//========================================================//

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器