您的位置 首页 FPGA

单片机 液体点滴操控

==============================200700821=====================================从机滴速测量==================

//==============================200700821=================//

//====================从机滴速丈量========================//
#include
//====================数据类型界说========================//
#defineUchar 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 Busy0x80 // 忙判别位
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();

}

}

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/260201.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部