当前位置:文档之家› 液体点滴速度监控装置设计的程序

液体点滴速度监控装置设计的程序

#include<AT89X51.H>#define DB0_DB7 P0#define busy 0x80#define SCANPORT P1sbit E=P2^2;sbit RW=P2^1;sbit RS=P2^0;//1110 1111, 1101 1111, 1011 1111, 0111 1111unsigned char uca_LineScan[4]={0xEF,0xDF,0xBF,0x7F}; //列线扫描电压分为第1,2,3,4根列线unsigned char key_ctt[4]={0};unsigned char speed_bcd[4]={0};unsigned char speed_sc[2];unsigned char yy=0,temp;unsigned int speed_ck[4]={0};unsigned int di_xx[2]={0};unsigned int ct=0,ttb=0,xx=0,tt3=0,speedct=0,speed=0,speedcd=10,cott=0;unsigned int time_sq[4]={0};typedef unsigned char uchar;unsigned char code lcd3[]={"0123456789abcdef"};unsigned char code lcdnow[]={"NOW:000"};unsigned char code lcdset[]={"SET:000"};unsigned char CONTROL[8]={0x38,0x18,0x98,0x88,0xC8,0x48,0x68,0x28};unsigned char codes1[8]={0xb8,0x98,0xd8,0xc8,0xe8,0x68,0x78,0x38};//9,18,36,45,54,63,72,81度顺时针unsigned char codes2[8]={0xb8,0x98,0xd8,0xc8,0xe8,0x68,0x78,0x38};//9,18,36,45,54,63,72,81度逆时针unsigned char counts,pt;unsigned char uc_KeyTemp=0;unsigned char uc_ClickCount=0;unsigned char ucCount;bit flag=1; //度数,正反转,速度控制bit a_ac=0;//比较系统标志bit bleept=0;//报警标准bit moto=0;//电机标志位bit a_key=0;bit b_key=0;void vKeyProcess(unsigned char ucKeyCode);void bleep();//报警void ac();//电机速度比校void akey();//功能处理void getspeed();//速度检侧void stdisplay();//显示void Delay(unsigned int t);void delay_50ms(unsigned int t); //延时void SendCommand(unsigned char ch); //发送命令void InitLcd(); //初始化void DisplayOneChar(unsigned char x,unsigned char y,unsigned char ddata);//按指定位置显示一个字符void DisplayListChar(unsigned char x,unsigned char y,unsigned char *DData);//按指定位盆显示一串字符//================================================//================================================void Delay (unsigned int t) //delay 40us{//for(;t!=0;t--);while(t--);}void deley_50ms(unsigned int t){unsigned int j;//可以在此加少许延时补偿,以称补大数值传递时(如delay_50ms(1000))造成的误差,但付出的代价是造成传递小数值//(delay_50ms(1))造成更大的误差。

因为实际应用更多时候是传递小数值,所以补建议加补偿!for(;t!=0;t--)for(j=6245;j>0;j--);}//==============================================//===============================================void SendCommand(unsigned char ch) //发送命令{/*CheckBusy();*/RS=0;RW=0;DB0_DB7=ch;E=1;Delay(1);E=0;Delay(5); //delay 40us}//=============================================//===================================================void vWriteData(unsigned char ch) //发送数据{/*CheckBusy();*/RS=1;RW=0;DB0_DB7=ch;E=1;Delay(1);E=0;Delay(5); //delay 40us}//=========================================================//===========================================================void InitLcd() //初始化SendCommand(0x38);Delay(1);SendCommand(0x08); //设置工作方式Delay(1);SendCommand(0x01); //显示状态设置Delay(1);SendCommand(0x06); //清屏Delay(1);SendCommand(0x0c); //输入方式设置Delay(1);}//=========================================================//===========================================================void DisplayOneChar(unsigned char x,unsigned char y,unsigned char ddata) //按指定位置显示一//个字符{y&=0x1;x&=0xf; //限制X不能大于15,Y不能大于1if(y)x|=0x40;//当要显示第二行时,地址码+0x40;x|=0x80;//算出指令码SendCommand(x);vWriteData(ddata);}//=========================================================//===========================================================void DisplayListChar(unsigned char x,unsigned char y,unsigned char *DData) //按指定位盆显示一串字符{unsigned char ListLength;ListLength=0;y&=0x1;x&=0xf; //限制X不能大于15,Y不能大于1while(DData[ListLength]>0x20){if(x<=0xf){DisplayOneChar(x,y,DData[ListLength]); //显示单个字符ListLength++;x++;}}}//=========================================================//===========================================================void vShowOneChar(unsigned char ucChar){switch(ucChar){case '0':vWriteData(0x30);break;case '1':vWriteData(0x31);break;case '2':vWriteData(0x32);break;case '4':vWriteData(0x34);break;case '5':vWriteData(0x35);break;case '6':vWriteData(0x36);break;case '7':vWriteData(0x37);break;case '8':vWriteData(0x38);break;case '9':vWriteData(0x39);break;case 'a':vWriteData(0x61);break;case 'b':vWriteData(0x62);break;case 'c':vWriteData(0x63);break;case 'd':vWriteData(0x64);break;case 'e':vWriteData(0x65);break;case 'f':vWriteData(0x66);break;default:break;}}//==============================================//==============================================unsigned char ucKeyScan(){unsigned char ucTemp=0;//扫描状态暂存unsigned char ucRow=0,ucLine=0;//行号列号for(ucLine=0;ucLine<4;ucLine++)//列扫描{SCANPORT=uca_LineScan[ucLine]; //输出扫描电位ucTemp=SCANPORT&0x0f;// 输出扫描电位并屏蔽高4位if(ucTemp!=0x0f){switch(ucTemp){case 0x0e:ucRow=10;break;//如果有则判断行号case 0x0d:ucRow=20;break;case 0x0b:ucRow=30;break;case 0x07:ucRow=40;break;default: ucRow=50;break;}break;}}//<<<<<<<<<<<<<<<<<<<<<恢复键扫描处理前舒适状态>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SCANPORT=0x0f;//恢复P2口return ucRow+ucLine+1;//返回按键编码格式为2位数高位为行号地位为列号}//==============================================//==============================================void vKeyProcess(unsigned char ucKeyCode){if(a_key==1){switch(ucKeyCode){case 41:vShowOneChar('7');temp=7;break;case 42:vShowOneChar('8');temp=8;break;case 43:vShowOneChar('9');temp=9;break;case 31:vShowOneChar('4');temp=4;break;case 32:vShowOneChar('5');temp=5;break;case 33:vShowOneChar('6');temp=6;break;case 21:vShowOneChar('1');temp=1;break;case 22:vShowOneChar('2');temp=2;break;case 23:vShowOneChar('0');temp=0;break;case 12:vShowOneChar('7');temp=7;break;}SendCommand(0xc4+uc_ClickCount);SendCommand(0x0f);}switch(ucKeyCode){case 44:/*vShowOneChar('c');*/temp=12;break;//'/'case 34:/*vShowOneChar('d');*/temp=13;break;//*case 24:/*vShowOneChar('e');*/temp=14;break; //-case 14:/*vShowOneChar('f');*/temp=15;break;//+case 13:/*vShowOneChar('b');*/temp=11;break;//=case 11:/*vShowOneChar('a');*/temp=10;break;//ON/Cdefault:break;}if(temp==11)//判断按键与上一次所按的键是否相同{delay_50ms(10);if(uc_ClickCount<255)//同一个按连续按下的次数:1~255{uc_ClickCount++;SendCommand(0xc3+uc_ClickCount);SendCommand(0x0f);}if(uc_ClickCount==3)uc_ClickCount=0;SendCommand(0xc4+ uc_ClickCount);SendCommand(0x0f);}if(temp<=9){switch(uc_ClickCount){case 0:key_ctt[0]=temp;break;case 1:key_ctt[1]=temp;break;case 2:key_ctt[2]=temp;break;default:break;}}//============================================== //==============================================void int_timer0(void){TMOD=0x10;TMOD=0x01;TH0=0x3c;TL0=0xb0;ET1=1;TR1=1;ET0=1;TR0=1;EA=1;IT1=1;EX1=1;}//============================================== //============================================== void Timer1() interrupt 3{TH1=0x3c;TL1=0xb0;pt++;if(pt==2){pt=0;if(flag==0&&moto==1)P2=(P2&0x0f)|CONTROL[counts];if(flag==0&&moto==0)P2=(P2&0x0f)|codes2[counts];counts++;if(counts==8)counts=0;}}//============================================== //============================================== void Timer0() interrupt 1{TH0=0x3c;TL0=0xb0;yy++;if(yy==2){ct++;tt3++;yy=0;if(ct==600)//60秒定时ct=0;xx=0;}if(tt3==20){tt3=0;di_xx[1]=di_xx[0];di_xx[0]=xx;if((di_xx[0]==di_xx[1])&&a_ac==1){bleept=1;flag=1;}}}}//============================================== //============================================== void Int1()interrupt 2{static cott=0;cott++;if(cott==2){xx++;time_sq[2]=time_sq[1];time_sq[1]=time_sq[0];time_sq[0]=ct;if(a_key==0){DisplayOneChar(10,0,lcd3[speed/100]);DisplayOneChar(11,0,lcd3[speed%100/10]);DisplayOneChar(10,0,lcd3[speed%10]);DisplayOneChar(10,0,lcd3[xx/100]);DisplayOneChar(10,0,lcd3[xx%100/10]);DisplayOneChar(10,0,lcd3[xx%10]);SendCommand(0xc4+uc_ClickCount);getspeed();cott=0;}}}//============================================== //============================================== void stdisplay(){DisplayListChar(0,0,lcdnow);DisplayListChar(0,1,lcdset);DisplayListChar(14,0,0x4f);DisplayListChar(15,0,0x46);DisplayListChar(8,0, "S:");DisplayListChar(8,1,"T:");//==============================================//==============================================void main(){delay_50ms(1);int_timer0();InitLcd();P2_3=1;SCANPORT=0x0f;stdisplay();while(1){bleep();if(SCANPORT!=0x0f){for(ucCount=0;ucCount<200;ucCount++);if(SCANPORT!=0x0f)vKeyProcess(ucKeyScan());};switch(temp){case 13:bleept=0;break;//Dcase 14:a_ac=1;b_key=1;if(b_key==1){DisplayOneChar(15,1,0x4f);b_key=0;};SendCommand(0xc4+uc_ClickCount);break;//e case 15:if(a_key==1){speedcd=key_ctt[0]*100+key_ctt[1]*10+key_ctt[2];uc_ClickCount=0;};break;//fcase 10:a_key=1;akey();break;//acase 12:a_key=0;akey();break;//cdefault:break;}}}//==============================================//==============================================void ac(){if(speedct>=(speedcd+5)){ moto=0; flag=0; }else if(speedcd<=(speedcd-5)){ moto=1; flag=0; }elseflag=1;}//==============================================//==============================================void bleep(){if(a_ac==1){if(bleept==1)P2_3=0;P2_3=1;}}//==============================================//==============================================void akey(){if(a_key==1){SendCommand(0x0c);DisplayOneChar(14,0,0x4f);DisplayOneChar(15,0,0x4e);//OnSendCommand(0xc4);SendCommand(0x0f);}if(a_key==0){SendCommand(0x0c);DisplayOneChar(14,0,0x4f);DisplayOneChar(15,0,0x46);//Of}}//==============================================//==============================================void getspeed(){if(a_ac==1) { ac(); };speed=1200/(time_sq[0]-time_sq[2]);speed_ck[3]=speed_ck[2];speed_ck[2]=speed_ck[1];speed_ck[1]=speed_ck[0];speed_ck[0]=speed;if((speed_ck[0]!=speed_ck[1])){speed_sc[1]=speed_sc[0];speed_sc[0]=speed_sc[0];speedct=(speed_sc[0]+speed_sc[1])/2;}else{if((speed_ck[0]==speed_ck[2])&&(speed_ck[1]==speed_ck[3]))speedct=(speed_ck[0]+speed_ck[1])/2;if((speed_ck[0]==speed_ck[1])||(speed_ck[0]==speed_ck[2]))speedct=(speed_ck[1]+speed_ck[2])/2;if((speed_ck[0]!=speed_ck[1])&&(speed_ck[0]!=speed_ck[2])&&(speed_ck[1]==speed_ck[2])) speedct=(speed_ck[0]+speed_ck[1])/2;if((speed_ck[0]!=speed_ck[1])&&(speed_ck[0]!=speed_ck[2])&&(speed_ck[1]!=speed_ck[2])) speedct=(speed_ck[0]+speed_ck[1] +speed_ck[2]+speed_ck[4] )/4;}speed_bcd[1] =speed%100/10;speed_bcd[2]=speed%10;if(a_key==0){DisplayOneChar(4,0,lcd3[speedct/100]); DisplayOneChar(5,0,lcd3[speedct%100/10]); DisplayOneChar(6,0,lcd3[speedct%10]);DisplayOneChar(4,1,lcd3[speedct/100]); DisplayOneChar(5,1,lcd3[speedct/100]); DisplayOneChar(6,1,lcd3[speedct/100]); SendCommand(0xc4+uc_ClickCount);}}。

相关主题