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

📄 main.c

📁 液滴的自动控制装置
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#include<math.h>

#define uchar unsigned char 
#define uint unsigned int

#define LEVEL0  0x42
#define LEVEL1  0x82
#define LEVEL2  0x14
#define LEVEL3  0x24
#define LEVEL4  0x44
#define LEVEL5  0x84
#define LEVEL6  0x18
#define LEVEL7  0x28
#define LEVEL8  0x48
#define LEVEL9  0x88
#define LEVELEXIT 0x22
#define LEVELBEGIN 0x12
//;/CS=P1.5  /WR=P1.3  DATA=P1.2    ********************
sbit LCD_WR=P0^1;
sbit LCD_CS=P0^0;
sbit LCD_DA=P0^2; 
sbit maichong=P0^4;
sbit jiaodu=P0^3;
sbit DIRECTION=P0^5;
bit timerflag;

uchar rtlevel;  //发动机的实时档
///////////////////////键盘处理程序/////////////////////
uchar code key_number[]={0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};
//uchar code key_number1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
void dlms(void);          // delay time
uchar kbscan(void);
uchar changelevel(uchar level);

///////////////////////键盘处理程序/////////////////////

////////////////////////显示子程序//////////////////////
uchar LCD_pub_number[11]={0xbf,0x06,0xed,0xcf,0x5e,0xdb,0xfb,0x07,0xff,0xdf,0x00};// 显示码
uchar LCD_strdata[6]={0x00,0x00,0x00,0x00,0x00,0x00};  // 对应段码
uchar LCD_str[6]; //显示字符的真实值
void SendOneBit(bit blcddata);
void SData1_6(uint number);
void InitLcd();
void SCommand(uchar strco);
void ClsLcd();
void ChangeToBcd(int number);
void IntToChar(uint a);
void Delay_nop(int n );
////////////////////////显示子程序//////////////////////

////////////////////////马达驱动程序////////////////////
void MoUp(uchar n);
void MoDown(uchar n );
void mortermov(uchar level);

////////////////////////马达驱动程序////////////////////

void StartTestSpeed() ;



timer0() interrupt 1    //定时器中断0 、计数器中断1
{
	timerflag=1;
	TH0=-50000/256; 
	TL0=-50000%256;
}

main()
{
	uint frequency,count,temp;
	uchar level;
    P1=0xf0; 
	InitLcd();
    ClsLcd();
	StartTestSpeed();
	while(1)
	{
		if(timerflag)
		{
			count+=1;
			if(count==200)// 每10秒钟为单位计数
			{
				frequency|=TH1;
				frequency<<=8;
				temp|=TL1;
				frequency+=temp;
			    SData1_6(frequency*6);  //一分钟的水滴数
   			    temp=0;
			    frequency=0;
				count=0;
				TH1=0;
	            TL1=0;				
			}
			timerflag=0;
		}//计算速度
       if(kbscan()==LEVELBEGIN) //进入键盘处理程序
	   {
	   	while(1)
		{
			EA=0; //禁止所有中断
			if( (level=kbscan())==LEVELEXIT )
			{
				EA=1;//开中断
			   break; //如果想退出键盘处理程序
		    }
			else //设定不同的档次,并驱动电机转动
			{
				level=changelevel(level);
				mortermov(level);
			}
		}
	   	
	   }
	}
}

/*
main()
{
	uchar level;
	rtlevel=0;
	level=10;
	mortermov(level);
	P0=0;
}*/
uchar changelevel(uchar level)
{
	//uchar i;
	switch(level)
	{
case  0x42: level=1;break;
case  0x82: level=2;break;
case  0x14: level=3;break;
case  0x24: level=4;break;
case  0x44: level=5;break;
case  0x84: level=6;break;
case  0x18: level=7;break;
case  0x28: level=8;break;
case  0x48: level=9;break;
case  0x88: level=10;break;
default :break;
	}
	return level;
}
void StartTestSpeed()
{
	TMOD=0x51; // T0 16bits timer, T1 16 bits counter
	//TH0=-50000/256;
	//TL0=-50000%256; //每50ms 产生一个定时器中断
	TH0=-50000/256;
	TL0=-50000%256;
	TH1=0;
	TL1=0;
		
	IP=0x08;
	EA=1;  // enable cpu interrupt
	ET0=1; // enable T/C0 interrupt timer
	ET1=1; // enable T/C1 interrupt counter

    TR0=1; // begin to timer
    TR1=1; //begin to count
}


////---------马达驱动程序-----------------------
void mortermov(uchar level)
{
    char n;
    n=level-rtlevel;
    if(n>0)
       MoUp(n);
    else 
       MoDown(n);
}


////---------马达驱动程序-----------------------
void MoUp(uchar n)
{
	uint i;
	for(;n>0;n--)
	    for(i=0;i<900;i++)
     {
	 maichong=!maichong;
	 Delay_nop(250);
     maichong=!maichong;
     Delay_nop(250);
    }
}
void MoDown(uchar n)
{
	uint i;
	DIRECTION=!DIRECTION;

	for(;n>0;n--)
	    for(i=0;i<900;i++)
	{
	 maichong=!maichong;
	 Delay_nop(250);
     maichong=!maichong;
     Delay_nop(250);
    }    
}
////---------马达驱动程序-----------------------


////---------显示子程序-------------------------
void SData1_6(uint number) //directory display if BCD
{
	uchar i,j;
	ChangeToBcd( number);
	LCD_CS=1;
	LCD_CS=0;
	SendOneBit(1);
	SendOneBit(0);
	SendOneBit(1);
	for(i=0;i<6;i++)	
	   SendOneBit(0); //send first memory address;
	for(i=0;i<6;i++)
	    for(j=0;j<8;j++)
		   {
		   	 if( (LCD_strdata[i]&0x80)==0x80 )  // if the lowest is 1
		   	   SendOneBit(1);
		   	 else
		   	   SendOneBit(0);
		   	 LCD_strdata[i]<<=1;       //send from low to high
		   }
}
void ChangeToBcd( int number)
{
 unsigned int i,a,temp;
 //Int to char
 a=number;
 temp=a/10000;
 if(a!=0) { a-=temp*10000; LCD_str[1]=temp; }
 temp=a/1000;
 if(a!=0) { a-=temp*1000;  LCD_str[2]=temp; }
 temp=a/100;
 if(a!=0) { a-=temp*100;  LCD_str[3]=temp; }
 temp=a/10;
 if(a!=0) { a-=temp*10;  LCD_str[4]=temp; }
 temp=a;
 LCD_str[5]=temp; 
 //Int to char
 for(i=0;i<6;i++)
	{
		switch(LCD_str[i])
		{
			case  0 : LCD_strdata[i]=LCD_pub_number[0];break;
			case  1 : LCD_strdata[i]=LCD_pub_number[1];break;
			case  2 : LCD_strdata[i]=LCD_pub_number[2];break;
			case  3 : LCD_strdata[i]=LCD_pub_number[3];break;
			case  4 : LCD_strdata[i]=LCD_pub_number[4];break;
			case  5 : LCD_strdata[i]=LCD_pub_number[5];break;
            case  6 : LCD_strdata[i]=LCD_pub_number[6];break;
            case  7 : LCD_strdata[i]=LCD_pub_number[7];break;
            case  8 : LCD_strdata[i]=LCD_pub_number[8];break;
            case  9 : LCD_strdata[i]=LCD_pub_number[9];break;
			default :break;
		}
	}
}

void Delay_nop(int n )
{
	for(;n>0;n--)
	_nop_();
}
void InitLcd()
{
	Delay_nop(500);
	SCommand(0x29);  // INITIALIZE
	SCommand(0x14);  //EX CRYSTAL
	SCommand(0x01);  //SYS EN
	SCommand(0x03);  //LCD ON
}

void SCommand(uchar strco)
{
    uchar i;	
	LCD_CS=1;
	Delay_nop(5);
	LCD_CS=0;
	SendOneBit(1);
	SendOneBit(0);
	SendOneBit(0);
	for(i=0;i<8;i++)
	   {
	   	if( (strco&0x80)==0x80)   //if the highest bit is 1
	    	{  
	    		Delay_nop(4);
	   	       SendOneBit(1); 
   	        }
	   	else  
	   	   {  SendOneBit(0); Delay_nop(4);}
	    strco<<=1; 
       }
    SendOneBit(0);
	LCD_CS=1;
}
void SendOneBit(bit blcddata)
{
	Delay_nop(5);
	LCD_WR=0;
	Delay_nop(5);
	LCD_DA=blcddata;
	Delay_nop(5);
	LCD_WR=1;
}
void ClsLcd()
{
	uchar i;
	LCD_CS=1;
	LCD_CS=0;
	_nop_();
	SendOneBit(1);
	SendOneBit(0);
	SendOneBit(1);
	for(i=0;i<5;i++)
	{
		SendOneBit(0);  
	}//five zeros for the first memorys
	for(i=0;i<128;i++)
	{
		SendOneBit(0);
	}//all datas are 0 to make the display disable
}
/////---------显示子程序-------------------------


/////---------键盘处理------------------------
void dlms(void)
{
  uchar i;                                                                                                                                                                                                                                                                                                                                                                                                          
    for(i=200;i>0;i--){} 	
}
uchar kbscan(void)      //select the key
{
  uchar sccode,recode,j,a;
  P1=0xf0; 
  if((P1&0xf0)!=0xf0) //如果有键按下
    { dlms();
    	if((P1&0xf0)!=0xf0)
    	{  sccode=0xfe;  //逐行扫描初值
    	   while((sccode&0x10)!=0)
    		{
    			P1=sccode;		 //输出行扫描码
    			if((P1&0xf0)!=0xf0) //如果本行有键按下
    			   {
                    a=P1;
    			   	j=a&0xf0;
    			    recode=j|0x0f;
     			    return((~sccode)+(~recode)); //返回字节特征码   
			       }		      
			       			        
			    else
			        sccode=(sccode<<1)|0x01;  //行扫描码左移一位
		    }
       }	      	
    }			
  return(0); //无键按下返回0
}
/////---------键盘处理------------------------

⌨️ 快捷键说明

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