新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī) 液體點(diǎn)滴控制

單片機(jī) 液體點(diǎn)滴控制

作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏
//==============================200700821=================//

//====================從機(jī)滴速測(cè)量========================//
#include
//====================數(shù)據(jù)類型定義========================//
#defineUchar unsigned char
#define Uint unsigned int
//====================常量定義============================//
Uchar t;
Uchar p;
Uchar m;
int time; //ms為單位

本文引用地址:http://2s4d.com/article/201611/320794.htm

//=====================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; //當(dāng)前顯示指針
static unsigned char ucLcdPosY;
//=====================LCD1602函數(shù)定義====================//
extern void LcdWriteData( char dataW ); //LCD寫數(shù)據(jù)
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); //顯示速度函數(shù)
//=====================延時(shí)函數(shù)定義=======================//
extern void Delay1000Ms(void);
extern void Delay400Ms(void);
extern void Delay5Ms(void);
void delay(Uint m);
//======================滴速變量定義======================//
Uchar set_v; //設(shè)定的速度
Uchar real_v; //實(shí)際速度
//======================中斷初始化函數(shù)定義================//
void int_init(void);
//=======================步進(jìn)電機(jī)變量定義=================//
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
//=======================步進(jìn)電機(jī)函數(shù)定義=================//
void motor_ffw(void);//正轉(zhuǎn)
void motor_rev(void);//反轉(zhuǎn)
void control(void); //調(diào)節(jié)滴速
//===================LCD1602函數(shù)說(shuō)明======================//

/*=======================================================
顯示光標(biāo)定位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);
}
/*=======================================================
按指定位置顯示數(shù)出一個(gè)字符
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {

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

/*=======================================================
初始化程序, 必須按照產(chǎn)品資料介紹的初始化過(guò)程進(jìn)行
=======================================================*/
void LcdReset( void ) {

LcdWriteCommand( 0x38, 0);// 顯示模式設(shè)置(不檢測(cè)忙信號(hào))
Delay5Ms();
LcdWriteCommand( 0x38, 0);// 共三次
Delay5Ms();
LcdWriteCommand( 0x38, 0);
Delay5Ms();

LcdWriteCommand( 0x38, 1);// 顯示模式設(shè)置(以后均檢測(cè)忙信號(hào) 參數(shù)--"1")
LcdWriteCommand( 0x08, 1);// 顯示關(guān)閉
LcdWriteCommand( 0x01, 1);// 顯示清屏
LcdWriteCommand( 0x06, 1);// 顯示光標(biāo)移動(dòng)設(shè)置
LcdWriteCommand( 0x0c, 1);// 顯示開(kāi)及光標(biāo)設(shè)置
}

/*=======================================================
寫控制字符子程序: E=1 RS=0 RW=0
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC )
{
if (AttribC)
{
P0=0xff;
while( Lcd1602StatusPort & Busy );// 檢測(cè)忙信號(hào)?
}
Lcd1602CmdPort = CMD;
}

/*=======================================================
當(dāng)前位置寫字符子程序: E =1 RS=1 RW=0
=======================================================*/
void LcdWriteData( char dataW )
{
while( Lcd1602StatusPort & Busy );// 檢測(cè)忙信號(hào)

Lcd1602WdataPort = dataW;
}
//=====================延時(shí)函數(shù)說(shuō)明==========================//
// 短延時(shí)
void Delay5Ms(void)
{
Uint i = 5552;
while(i--);
}

//長(zhǎng)延時(shí)
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{

j=1817; //100Ms
while(j--);
};
}
//更長(zhǎng)延時(shí)
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++)
{ }
}
}
//==================中斷初始化函數(shù)說(shuō)明====================//
void int_init(void)
{EA=1;
EX1=1;
EX0=1;
ET1=1;

}
//===================外部中斷0函數(shù)說(shuō)明====================//
void high(void) interrupt 0 using 0
{
EA=0;
DispOneChar(8,0,E);
EA=1;
}
//===================外部中斷1函數(shù)說(shuō)明====================//
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++;

}
}
//====================定時(shí)器1中斷函數(shù)說(shuō)明=================//
void get_time(void) interrupt 3 using 3
{
TR1=0;
t++;
if(t%4==0)
EX1=1;
TH1=0x15;
TL1=0x9f;
TR1=1;
}

//=======================顯示速度函數(shù)說(shuō)明=================//
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]);
}
}
//======================步進(jìn)電機(jī)函數(shù)說(shuō)明==================//
/********************************************************/
/*
/*步進(jìn)電機(jī)正轉(zhuǎn)
/*
/********************************************************/
void motor_ffw()
{
Uchar i;


for (i=0; i<8; i++) //一個(gè)周期轉(zhuǎn)7.2度
{
P1 = FFW[ i ]; //取數(shù)據(jù)
delay(15); //調(diào)節(jié)轉(zhuǎn)速
}

}
/********************************************************/
/*
/*步進(jìn)電機(jī)反轉(zhuǎn)
/*
/********************************************************/
void motor_rev()
{
Uchar i;

for (i=0; i<8; i++) //一個(gè)周期轉(zhuǎn)7.2度
{
P1 = REV[ i ]; //取數(shù)據(jù)
delay(15); //調(diào)節(jié)轉(zhuǎn)速
}

}
//====================調(diào)節(jié)滴速函數(shù)說(shuō)明====================//
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;
}
}
//======================主函數(shù)說(shuō)明========================//
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();

}

}

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



評(píng)論


技術(shù)專區(qū)

關(guān)閉