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

📄 e_i.c

📁 这是一个基于MCU的电机控制系统
💻 C
字号:
#include<W77C32.H>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int

#define bn 5
#define RBR XBYTE[0X8010]
#define THR XBYTE[0X8010]
#define IER XBYTE[0X8011]
#define FCR XBYTE[0X8012]
#define IIR XBYTE[0X8012]
#define LCR XBYTE[0X8013]
#define MCR XBYTE[0X8014]
#define LSR XBYTE[0X8015]
#define MSR XBYTE[0X8016]
#define SCR XBYTE[0X8017]

#define DLL XBYTE[0X8010]
#define DLM XBYTE[0X8011]
sbit 	ExtCOM_CS=P1^7;
sbit   WDI=P3^4;


uchar idata rFpcdata[5];
uchar idata rFdrivdata[17];
uchar idata tpcdata[17];
uchar idata tdrivdata[17];
uchar rFpcdata1,contr_data1;
uchar temp,infor_data0,infor_data1,count,time_count,num1;
uchar ch2[2];
uchar ch3[4];
uchar v_reg1,v_reg2,v_reg3,v_reg4,speed_temp,m_minute,m_second,m_tempmin,m_tempsec,hexdata,lowdata;
bit begin_flag,time_flag1;
bit re_flag;
bit time_flag;
bit flash_flag;
bit	zhuan_flag;

uint speed,count1,num2,num3;
uchar a;



uchar control(uchar contr_data)reentrant;
uchar LRC(uchar usDataLen)reentrant;

uchar ConvertHextoChar(uchar ch)reentrant;
uchar ConvertCharHex(uchar ch)reentrant;

uchar Feedback();
void UartInit(void);
void SendC(uchar c)reentrant;


void FlashWDI();
uchar TestLine();

void main(void)
		{
		     /*51初始化*/
			 TMOD=0x21;//定时器1和0的工作方式分别为2和1

			 TH0=0x10; TL0=0x00;
			 TH1=0xF6; TL1=0xF6;
			 

			 EA=1;
			 ET0=1;
			 ET2=1;

			 TCON=0x40;/*启动定时器1*/
            		 UartInit();//串口初始化
			 SCON=0x50;
			 
		
			 while(1)
			 {                  
		
					
					
					for(count1=0;count1<0xFFFF;count1++)
	      			{
						
						FlashWDI();
						while(num2==num3)
						{   
								  	
						FlashWDI();
						}
				        num3=num2;
						
						if (begin_flag==1)
						  {	
														
							begin_flag=0;
							if ((num3==1)&&(contr_data1==0x01))
							{TestLine();}
					
									
						//	re_flag=1;
							switch(contr_data1)
	    					{case 0x01: control(0x01);
																
										TR0=1;
									    FlashWDI();
										break;
							 case 0x02: control(0x02);
										TR0=0;
										m_minute=0x00;
										m_second=0x00;
										FlashWDI();
										break;
						     case 0x05:control(0x05);
										FlashWDI();
										 break;
							 case 0x06:control(0x06);
										FlashWDI();
										 break;
							 case 0x07:control(0x07);
										FlashWDI();
										break;
							 default: break;
	    				    }
							contr_data1=0x00;				
						  }

						if(time_flag==1)
						 { 	time_flag=0;
							Feedback();
							tpcdata[2]=0x08;tpcdata[3]=m_minute;tpcdata[4]=m_second;//反馈运行时间
	                       	tpcdata[0]=0xFF;tpcdata[1]=0xFF;
	            		   	for(a=0;a<5;a++)
							{
				      			SendC(tpcdata[a]);
					  			FlashWDI();
							}
						}
						
			
				}
					
				 	
					
            }



		}
 /************************************串口初始化****************************************/
	void UartInit(void)
       {	ExtCOM_CS=0;
			FCR=0x06;
			LCR=0x80;
			DLL=0x0C;
			DLM=0x00;
			LCR=0x03;
			MCR=0x00;
			IER=0x01;//允许接收中断

   			EX0=1;
			ExtCOM_CS=0;
	   }
/************************************发送数据到pc****************************************/
	  void SendC(uchar c)reentrant//发送一字节
	  {	 uchar t;
		 ExtCOM_CS=0;
		 do{t=LSR;
			FlashWDI();
           }while((t&0x40)==0x00);//判断TEMP位
		 THR=c;
		 //ExtCOM_CS=1;
		 return;
	  }

	
	



/************************************中断接收pc数据服务程序****************************************/
	void mint0() interrupt 0 using 1
	{		  
          TR0=0;
		  EA=0;
		  ET0=0;
		  
		 
		  rFpcdata[num1]=RBR;
		  num1++;
			  if(num1==5)
			  { 	
				num1=0;
			    if (rFpcdata[0]==0xFF)
				{	
					if (rFpcdata[1]==0xFF)
					{
						contr_data1=rFpcdata[2];
						if(contr_data1==7)
						{infor_data0=rFpcdata[3];
					     infor_data1=rFpcdata[4];
						}
						num2++;				
						begin_flag=1;
					}
				}
				






				TR0=1;
				ET0=1;			
					
								
                                       
                              

			   }
		
		EA=1;
			
		return;
	}

	uchar control(uchar contr_data)reentrant
		{		uchar i;
				FlashWDI();
				switch(contr_data)
				   {case 0x01:tdrivdata[0]=0x3A;//起始符 /启动
						      tdrivdata[1]=0x30;tdrivdata[2]=0x31;//设备地址
					   	      tdrivdata[3]=0x30;tdrivdata[4]=0x36;//功能码
						      tdrivdata[5]=0x30;tdrivdata[6]=0x32;//地址段
						      tdrivdata[7]=0x31;tdrivdata[8]=0x45;
						      tdrivdata[9]=0x30;tdrivdata[10]=0x30; //数据段
	                          tdrivdata[11]=0x30;tdrivdata[12]=0x31;
                              tdrivdata[13]=0x44;tdrivdata[14]=0x38;//校验和
						      tdrivdata[15]=0x0D;tdrivdata[16]=0x0A;//结束符
						      for(i=0;i<17;i++)//发送到电机
							 {
		        				SBUF=tdrivdata[i];
			    				while(TI!=1);TI=0;
								FlashWDI();
							  } 
							  
						      break;

					case 0x02:tdrivdata[0]=0x3A;//起始符  停止
						      tdrivdata[1]=0x30;tdrivdata[2]=0x31;//设备地址
					   	      tdrivdata[3]=0x30;tdrivdata[4]=0x36;//功能码
						      tdrivdata[5]=0x30;tdrivdata[6]=0x32;//地址段
						      tdrivdata[7]=0x31;tdrivdata[8]=0x45;
						      tdrivdata[9]=0x30;tdrivdata[10]=0x30; //数据段
                              tdrivdata[11]=0x30;tdrivdata[12]=0x30;
                              tdrivdata[13]=0x44;tdrivdata[14]=0x39;//校验和
						      tdrivdata[15]=0x0D;tdrivdata[16]=0x0A;//结束符
						       for(i=0;i<17;i++)//发送到电机
							 {
		        				SBUF=tdrivdata[i];
			    				while(TI!=1);TI=0;
								FlashWDI();
							  } 
						      break;
			
				    case 0x05:v_reg1=0x30;v_reg2=0x31;//增速
							  v_reg3=0x30;v_reg4=0x39;
							  control(0x08);
							  for(i=0;i<17;i++)
								{ while(RI!=1);RI=0;
		      					  rFdrivdata[i]=SBUF;
			 					
								}
							  if(re_flag==1)
							  {for (i=8;i<11;i++)
								   { temp=rFdrivdata[i];
									 rFdrivdata[i+1]=temp;
									}
								re_flag=0;
							   }	
					  		  FlashWDI();
							  lowdata=ConvertCharHex(rFdrivdata[9]);
							  ch3[1]=lowdata;//高位             
							  FlashWDI();
							  hexdata=ConvertCharHex(rFdrivdata[10]);
							  lowdata=ConvertCharHex(rFdrivdata[11]);
							  ch3[0]=hexdata*16+lowdata;
							  speed=ch3[1]*256+ch3[0];
							  speed=speed+150;
                              if (speed>3000)
                              	 {  speed=0x0BB8;
									
								  }					
							  speed_temp=speed;
							  infor_data0=(uchar)(speed>>8);
							  infor_data1=(uchar)speed_temp;
							  control(0x07); 
							  break;
			    	case 0x06:v_reg1=0x30;v_reg2=0x31;//减速
							  v_reg3=0x30;v_reg4=0x39;
							  control(0x08);
							  for(i=0;i<17;i++)
								{ while(RI!=1);RI=0;
		      					  rFdrivdata[i]=SBUF;
			 					
								}
							  if(re_flag==1)
							  {for (i=8;i<11;i++)
								   { temp=rFdrivdata[i];
									 rFdrivdata[i+1]=temp;
									}
								re_flag=0;
							   }	
							 
							  FlashWDI();
							  lowdata=ConvertCharHex(rFdrivdata[9]);
							  ch3[1]=lowdata;//高位             
						      FlashWDI();
							  hexdata=ConvertCharHex(rFdrivdata[10]);
							  lowdata=ConvertCharHex(rFdrivdata[11]);
							  ch3[0]=hexdata*16+lowdata;
							  speed=ch3[1]*256+ch3[0];
                              if (speed<150)
  							    {speed=0;}
                              else
                              {speed=speed-150;}
								FlashWDI();
		  					   speed_temp=speed;
							   infor_data0=(uchar)(speed>>8);
							   infor_data1=(uchar)speed_temp;
                               control(0x07);
							   break;

		            case 0x07:tdrivdata[0]=0x3A;//起始符  //置速
						      tdrivdata[1]=0x30;tdrivdata[2]=0x31;//设备地址
					   	      tdrivdata[3]=0x30;tdrivdata[4]=0x36;//功能码
						      tdrivdata[5]=0x30;tdrivdata[6]=0x31;//地址段
						      tdrivdata[7]=0x30;tdrivdata[8]=0x39;
                              speed=infor_data0*256+infor_data1;
							  FlashWDI();
                              if ( speed>3000)
                               {
                                 break;
                               }
                               else
						    { 
							  		ConvertHextoChar(infor_data0);//转换速度
						      		tdrivdata[9]=ch2[1];tdrivdata[10]=ch2[0];//写入速度寄存器的数值
                              		ConvertHextoChar(infor_data1);
						      		tdrivdata[11]=ch2[1];tdrivdata[12]=ch2[0];
                              		temp=LRC(12);//求校验和
							  		FlashWDI();
				 		      		ConvertHextoChar(temp);//转换为ASCII
						      		tdrivdata[13]=ch2[1];tdrivdata[14]=ch2[0];
							      	tdrivdata[15]=0x0D;  tdrivdata[16]=0x0A;//结束符
							      	 for(i=0;i<17;i++)//发送到电机
							 		{
		        						SBUF=tdrivdata[i];
			    						while(TI!=1);TI=0;
										FlashWDI();
							 		 } 
								  	break;
                             
							 }
				case 0x08:tdrivdata[0]=0x3A;//查询命令
						  tdrivdata[1]=0x30;tdrivdata[2]=0x31;//设备地址
				   	      tdrivdata[3]=0x30;tdrivdata[4]=0x33;//功能码
						  tdrivdata[5]=v_reg1;tdrivdata[6]=v_reg2;//地址段
						  tdrivdata[7]=v_reg3;tdrivdata[8]=v_reg4;
						  tdrivdata[9]=0x30; tdrivdata[10]=0x30;//访问寄存器的个数
						  tdrivdata[11]=0x30;tdrivdata[12]=0x32;
						  temp=LRC(12);//求校验和
						  FlashWDI();
						  ConvertHextoChar(temp);//转换为ASCII
						  tdrivdata[13]=ch2[1];tdrivdata[14]=ch2[0];
						  tdrivdata[15]=0x0D;  tdrivdata[16]=0x0A;//结束符
						   for(i=0;i<17;i++)//发送到电机
							 {
		        				SBUF=tdrivdata[i];
			    				while(TI!=1);TI=0;
								FlashWDI();
							  } 
						  break;


				default: break;
			}
		return (1);
    }

   
/************************************数制转换****************************************/


	uchar ConvertCharHex(uchar ch)reentrant
	{		FlashWDI();
			if((ch>='0')&&(ch<='9'))
			return ch-0x30;
			else if((ch>='A')&&(ch<='F'))
			return ch-'A'+10;
			else return (-1);
			FlashWDI();
	}
	/*16进制转ASCII*/
	uchar ConvertHextoChar(uchar ch)reentrant
	{		 
			 uchar ch1;
             uchar ch3;
			 FlashWDI();
			 ch1=ch;
			 ch3=ch1&0x0F;
			 ch1=ch1>>4;
			 if ((ch1>=0x00) && (ch1<=0x09))
			   ch2[1]=ch1+0x30;
			 else
			   ch2[1]=ch1+0x37;
			FlashWDI();
			 if ((ch3>=0x00) && (ch3<=0x09))
			   ch2[0]=ch3+0x30;
			 else
			   ch2[0]=ch3+0x37;
			FlashWDI();

			   	return 1;
	}
/***********************************LRC校验模块*****************************************/
 	uchar LRC(uchar usDataLen)reentrant
	{		 uchar uchLRC=0x00;
			 uchar *p=tdrivdata;
			 p++;
			 while(usDataLen--)
			 {  uchar hexdata;
				uchar lowdata;
				hexdata=ConvertCharHex(*p++);
				usDataLen--;
				FlashWDI();
				lowdata=ConvertCharHex(*p++);
				uchLRC+=hexdata*16+lowdata;
				FlashWDI();
             }
			 return (-(uchLRC));


	}



 /************************************反馈运行时间和运行状态****************************************/
   void  time0() interrupt 1 using 0
		{//	uchar i;
			EA=1;
			
			TF0=0;
			
			time_flag1=1;
			IP=0x01;
			count++;
			FlashWDI();
			if (count==0x32)
				{   
                     count=0;
				
                     FlashWDI();
					 m_second++;
					 
                       if(m_second==60)
					   {	m_minute++;
							
						    m_second=0;
							
                            if (m_minute==60)
						     {m_second=0;
							  
                             }
                        }
                       
						
					 num2++;		
                     time_flag=1;
		       		 FlashWDI();
				}
			
			TMOD=0x21;
			TH0=0x10;
			TL0=0x00;
		
			return;
		}


		uchar Feedback()
		{	uchar i;
	
		/*查询电机的速度*/
		FlashWDI();
		v_reg1=0x30;v_reg2=0x31;
		v_reg3=0x30;v_reg4=0x39;
		control(0x08);
	    for(i=0;i<17;i++)
			{ while(RI!=1);RI=0;
		      rFdrivdata[i]=SBUF;
			}
		FlashWDI();
		
		lowdata=ConvertCharHex(rFdrivdata[9]);
		ch3[2]=lowdata;//高位 
		hexdata=ConvertCharHex(rFdrivdata[10]);
		lowdata=ConvertCharHex(rFdrivdata[11]);
		ch3[3]=hexdata*16+lowdata;
		tpcdata[0]=0xFF;
		tpcdata[1]=0xFF;
        tpcdata[2]=0x07;
		tpcdata[3]=ch3[2];
		tpcdata[4]=ch3[3];
		for(a=0;a<5;a++)
		{
			SendC(tpcdata[a]);
			FlashWDI();
		}
		FlashWDI();
		return (1);
	}
/************************************刷新存储器(看门狗)****************************************/
void FlashWDI()
{ 	WDI=0;
	WDI=1;
}


	uchar TestLine()
	{			    uchar b;	
					control(0x01);
					infor_data0=0x00;
					infor_data1=0x96;
					control(0x07);
					
				for (count1=0;count1<41;count1++)
				{	TR0=1;
					b++;
					while(num2==num3)
					{   
							  	
						FlashWDI();
					}
				    num3=num2;
				   if (begin_flag==1)
					{	
					  FlashWDI();						
					  begin_flag=0;
					  return (1);	
										
					}	
				
					if(time_flag==1)
					{ 	time_flag=0;
						Feedback();
						FlashWDI();
						tpcdata[2]=0x08;tpcdata[3]=m_minute;tpcdata[4]=m_second;//反馈运行时间
	                    tpcdata[0]=0xFF;tpcdata[1]=0xFF;
	            		   	for(a=0;a<5;a++)
							{
				      			SendC(tpcdata[a]);
					  			FlashWDI();
							}
						
					}
					if (b==2)
				    {	control(0x05);
						b=0;
					}
				
			   	}

				



				for (count1=0;count1<42;count1++)
				{
					b++;
					while(num2==num3)
					{   
							  	
						FlashWDI();
					}
				    num3=num2;
				  if (begin_flag==1)
					{	
											
					  begin_flag=0;
					  return (1);	
				
					}	
			
				 if(time_flag==1)
					{ 	time_flag=0;
						Feedback();
						tpcdata[2]=0x08;tpcdata[3]=m_minute;tpcdata[4]=m_second;//反馈运行时间
	                    tpcdata[0]=0xFF;tpcdata[1]=0xFF;
	            		   	for(a=0;a<5;a++)
							{
				      			SendC(tpcdata[a]);
					  			FlashWDI();
							}
					}
					if (b==2)
				    {
						control(0x06);
						b=0;
					}
				
			   	}
				infor_data0=0x00;
				infor_data1=0x96;
				control(0x07);
	
		
			   	return (1);	

	}

⌨️ 快捷键说明

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