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

📄 111.c

📁 开发环境Keil 51
💻 C
字号:
//-------------------------------------
//---------智能抽水系统软件设计--------
//---------date:     2007-3-18 --------   
//---------author:   Adeola   ----------

    #include "89s51.h"
	#include "LCD.H"
	#define uint unsigned int
    #define  K1   P0_4       // 水位上限加
    #define  K2   P0_3       // 水位上限减
	#define  K3   P0_2       // 水位下限加
    #define  K4   P0_1       // 水位下限减
	#define  K5   P0_0       //应急键 按下则强制停止抽水

    long int juli;
	unsigned char second;
	unsigned char shang=100,xia=1  ;    //初始化  最高水位限制 为100 最低水位1 
	static long int Recieve_Time;
	void Caculate_juli(void);		//计算距离
/////////////////////////////////////////////////////////////////////	

   void delay(char m)                   //超声波发送延时
	{
	 unsigned char i,j;
 	 for(i=0;i<m;i++)
 	 	for(j=0;j<80;j++);
    }

///////////////////////////////////////////////////////////////////
	void Delay1ms(int n)              //LCD显示延时
	{
        int i,j;
        for(i=0;i<n;i++)
        	for(j=0;j<125;j++);
	}


///////////////////////////////////////////////////////////
	void intet0(void) interrupt 1 using 1  //T0益出中断,得到超声波返回时间 
	{
	  TH0=0X00;  //重新赋值
	  TL0=0X00;
      second++; // T0益出中断次数++
	}

/////////////////////////////////////////////////////////////
	void intex1(void) interrupt 2 using 1//  外部中断1服务程序
	{
	union {unsigned int time;unsigned char t[2];}count;//定义一个共用体,用来存放T0的值,将TH0 TL0的值整合在一起
	IE=0;
	TR0=0;
	count.t[0]=TH0;
    count.t[1]=TL0;		//读取时间,计数多少则为多少US
	Recieve_Time=count.time;
	TH0=0;      //T0重新赋初值
	TL0=0;
	IE=0x8e;		//开启中断	
	Caculate_juli();//计算距离
	}
////////////////////////////////////////////////////////////
	void Caculate_juli(void)		//计算距离
	{
	unsigned char i;		//secondT0溢出次数
	int Speed=170;          // 340/2=170
	juli=Recieve_Time*Speed;//Recieve_Time(us)*340(m/s)*10-6  
	//juli/=2000000;         //若是	Speed=340;	 则如此	
	for(i=0;i<second;i++)
	{
		juli+=11140000;		//11.14为T0溢出一次对应距离	 补齐八位是为了方便拆开显示
		//juli/=1000000;
	}
	second=0;        //中断记数器清零
	}
//////////////////////////////////////////////////////////////
	void Initial_display()   //显示初始化
	{
    WriteInstruct(0x80);
    WriteString("shuiwei:"); 
	}
////////////////////////////////////////////////////////////
	void display()//显示程序
	{
	long int temp;
	unsigned char i;
	unsigned char value[8]; //存放JULI
	for(i=0;i<8;i++)        //逐一拆字 方便LCD显示
	{
		value[i]=temp%10;
		temp/=10;
	}
	WriteInstruct(0x89); //在 shuiwei 后显示距离
	WriteData(value[7]+0x30);//从高位向地位逐一显示 只显示四位 精度为CM
	WriteData(value[6]+0x30); 
	WriteString(".");       //小数点显示
	WriteData(value[5]+0x30);
	WriteData(value[4]+0x30);	//显示两位小数,精度到CM
	//Write_Data(value[3]+0x30); //后四位丢弃
	//Write_Data(value[2]+0x30);
	//Write_Data(value[1]+0x30);
	//Write_Data(value[0]+0x30);

   /* WriteInstruct(0xc0);  // 显示格式控制
	WriteData(juli/10+'0');
    WriteData(juli%10+'0');
	WriteString(":");*/
	WriteInstruct(0xc0);
	WriteData(shang/10+'0');
    WriteData(shang%10+'0');
    WriteString(":");
    WriteData(xia/10+'0');
    WriteData(xia%10+'0');
    WriteString(":"); // 空格有影响 " : "
   
	}


////////////////////////水位设定////////////////////////////

 	 void keyboard()      //键盘程序
 	 {
 	       if(K1==0)           //最高水位限制为: 60---100
  	  	   { 
		        Delay1ms(10);  //键消抖
	    	    while(!K1)     //P3.0连续低电平时shang连续加1
				{  
				if(shang!=100) //最高水位限制为100
			     {   
				 shang++;
				 display();
				 Delay1ms(200);
				 }
			     else 
			        { 
				      shang=60;        //shang等于100时,shang=60
				      display();
					  Delay1ms(200);
				    }
			    }
	    	}
           
			if(K2==0)
  	  	   { 
		        Delay1ms(10);
	    	    while(!K2)       //P3.0连续低电平时shang连续减一
				{  
				if(shang!=60)
			     {   
				 shang--;
				 display();
				 Delay1ms(200);
				 }
			     else 
			        { 
				      shang=100;   //shang等于60时,shang=100
				      display();
					  Delay1ms(200);
				    }
			    }
	    	}

			if(K3==0)      /// 最低水位限制为  1-20
  	  	   	{ 
		        Delay1ms(10);
	    	    while(!K3)  //P3.0连续低电平时xia连续加1
				{  
				if(xia!=20)
			     {   
		        	xia++;
				   	display();
				  	Delay1ms(200);
				 }
			     else 
			      { 
				      xia=0;       //xia等于20时,day=1
				      display();
					  Delay1ms(200);
				   }
			    }
	    	}

			if(K4==0)
  	  	   	{ 
		        Delay1ms(10);
	    	    while(!K4)           //P3.0连续低电平时xia连续-1
				{  
				 if(xia!=1)
			      {   
		           xia--;
				   display();
				   Delay1ms(200);
				  }
			      else 
			        { 
				      xia=200;      //xia等于1时,xia=60
				      display();
					  Delay1ms(200);
				    }
			    }

 	    	}

		  if(K5==0)	
		  {
		    Delay1ms(10);
	        while(!K5)  
		    {
		   
		       P2_1=1; //强制关机。
		   
		    }
		  }
		
		   	
}

//////////////////////////////////////////////////////////////////
//////////////////////系统主程序/////////////////////////////////

 
    void mian(void)
	{
     IE=0x86; 	// EA=1  允许外中断1 T0 中断
     TMOD=0x01;	//T0模式一
     TH0=0x00;	//定时初值
     TL0=0x00;	//大于65536以后又需要重新开始记数了  中断一次则标志位加一(65536US)再算时间时候标志位乘以65536
	 IP=0x04;
	 Initial_LCD();  //  初始化函数调用
     Initial_display();//
     display();
     while(1)
     {
       	keyboard();		//调用键盘
	   	display();		//
	   	P0_6=1;	//发送超声波
     	TR0=1;		//启动定时器0 测量超声波发射到接收的时间
     	delay(5);	// 延时,抗干扰 必须小于超声波回波时间
     	P0_6=0;	//停止发送
       	if(juli<xia)  	//现在测量的距离小于设定距离 则启动电机抽水
       	{
         	P2_0=1; 	// 启动电机抽水
       	}
      
      	if(juli>shang) //现在距离大于设定抽水上限 则停止抽水
      	{
        	 P2_1=1; //停止 电机停止抽水
      	}
      } 
	}

////////////////////////////////////END/////////////////////////////////////////////	
	

⌨️ 快捷键说明

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