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

📄 main.c

📁 基于c8051f330芯片开发的电机正反转控制系统
💻 C
📖 第 1 页 / 共 2 页
字号:
									db_clear(t_m/10,t_m%10,t_s/10,t_s%10);
									break;
								  }
								  else if(freq==2)
								  {
									P1_7=0;
									P1_5=0;
									P0_0=1;	
									pread=0x1b02;
									idamin_l=*pread++;
									idamin_h=*pread;
									while(KEY==0);
									db_clear(idamin_h/10,idamin_h%10,idamin_l/10,idamin_l%10);
									break;
								  }
								  else if(freq==3)
								  {								  
									P1_7=0;
									P1_5=1;
									P0_0=0;	
									pread=0x1b04;
									idamax_l=*pread++;
									idamax_h=*pread;
									while(KEY==0);
							    	db_clear(idamax_h/10,idamax_h%10,idamax_l/10,idamax_l%10);						
									break;
								  }
								  else
								  {
								    freq=0;
									P1_7=0;
									P1_5=0;
									P0_0=0;
									while(KEY==0);
									break;
								  }
							  }
						  
						  default: break;
						  }
						  }
						  else
						  {
							  break;
						  }
					  }while(1);
				  }

		  }while((S2!=0)&&(P0_5==1)); //S2没有接通且无外部屏蔽信号,继续脉冲计数
		  
		  P1_0=0;
	  }while(P0_5==0);        //S2没有接通且外部有屏蔽信号,程序重新开始执行(外屏需保持一段时间)
		
		P1_0=0;

		db4=count/1000;
		db3=count/100-db4*10;
		db2=count/10-db4*100-db3*10;
		db1=count%10;

		db_clear(db1,db2,db3,db4);      //S1脉冲计数值用数码管显示,不超过2000;

        IDA0L=Get_DAL(count*1023/2000);
		IDA0H=Get_DAH(count*1023/2000);

		P1_1=1;                        //触发K2

		delay_10ms(100);          //延时1s

		if(count>=2)               //输入信号正常
		{                                        //S3还未接通,键盘输入可修改数字
			do
			{
				if ((KEY==0)&&(S3!=0))
				{
						CS = 0;
					delay_short();
					SEND_BUF=0X15;             // 写入读键盘数据指令
					send7289();
					delay_short();
					symbol = read_key();       // 读出按键的值
					ACC=symbol;
					CS = 1;
					delay_long();
					
					
					switch(symbol)
					{
					case(2): 
						{
							freq++;
							if(freq==1)
							{
								P1_7=1;
								P1_5=0;
								P0_0=0;	
								pread=0x1b00;
								t_s=*pread++;
								t_m=*pread;
								while(KEY==0);
								db_clear(t_m/10,t_m%10,t_s/10,t_s%10);
								break;
							}
							else if(freq==2)
							{
								P1_7=0;
								P1_5=0;
								P0_0=1;	
								pread=0x1b02;
								idamin_l=*pread++;
								idamin_h=*pread;
								while(KEY==0);
								db_clear(idamin_h/10,idamin_h%10,idamin_l/10,idamin_l%10);
								break;
							}
							else if(freq==3)
							{
								P1_7=0;
								P1_5=1;
								P0_0=0;
								pread=0x1b04;
								idamax_l=*pread++;
								idamax_h=*pread;
								while(KEY==0);
								db_clear(idamax_h/10,idamax_h%10,idamax_l/10,idamax_l%10);
								break;
							}
							else
							{
								freq=0;
								P1_7=0;
								P1_5=0;
								P0_0=0;
								while(KEY==0);
								db_clear(db1,db2,db3,db4);
								break;
							}
							}
					default: break;
						}					
					}
			else if(S3==0)        //S3接通;
			{
				P1_1=0;           //K2停止;  
				break;
			}
			else                  //S3未接通且无键盘信号时等待S3信号
			{
				;
			}
		}while (1);

		}
		else
		{		    
			break;              //S1少于两个脉冲,跳出程序
		}

 }while(1);                    //输出故障,数码管闪动;
   
   CS=0;
   delay_short();
   SEND_BUF=0X88;
   send7289();
   delay_short();
   SEND_BUF=0xF0;
   send7289();
   CS=1;
   delay_long();
   do
   {
	   ;
   }while(1);
   
}

void SysClk_Init(void)   /***配置系统时钟***/
{   
   //配置内部高频振荡器为系统时钟
    OSCICN=0X82;         //系统时钟允许,为振荡器两分频
   OSCICL=OSCICL+22;    //设置片内振荡器为22.1184MHZ
   CLKSEL=0X00;         //系统时钟选择内部高频振荡器
}

void WDT_Init(void)    /***使能看门狗初始化***/
{
	
	PCA0MD=0X00;       //系统时钟的12分频
	PCA0CPL2=0Xff;     //超时时间间隔70ms
    PCA0CPH2=0Xff;	
	PCA0MD=0X60;
   
	EA=1;  
}

void port_Init(void)   /***端口初始化,没有用内部数字IO资源,外部晶振,DAC输出***/
{
	//P0MDIN=0XF3;     //P0.2,P0.3全为模拟输入(外部晶振)
    P0MDIN=0XFF;       //P0全为数字输入
	P0MDOUT=0X00;      //P0.1(DAC0)开漏输出
	P0SKIP=0X02;       //跳过P0.1(DAC)
   // P0SKIP=0X0E;     //跳过P0.2,P0.3(外部晶振)
	P0=0XFE;

	P1MDIN=0XFF;       //P1全为数字输入
	P1MDOUT=0X00;      //P1全为推挽输出
	P1SKIP=0X00;       //无跳过引脚
	P1=0X00;

	P2MDOUT=0Xff;      //P2全为推挽输出 
	P2=0X00;

	XBR0=0X00;         //没有设置数字资源输出到引脚
	XBR1=0XC0;         //允许交叉开关,弱上拉 

}

void timer_Init(void)  /***定时器0初始化***/
{
	TMOD=0X01;     //定时器0工作于方式1;
	
    TL0=0XB0;      //定时器0初始值;
	TH0=0X3C;

	CKCON=0X00;    //使用系统时钟;

		 
	TR0=1;         //开中断
	ET0=1;


	EA=1;
}


void timer0_Isr(void) interrupt 1    /***定时器0 中断服务程序***/
{

   
  	PCA0CPL2=0Xff;     //超时时间间隔70ms
	PCA0CPH2=0Xff;	


	TMOD=0X01;         //50ms中断一次;
    TL0=0XB0;
	TH0=0X3C;
	din_50++;
	setcan++;
	if((din_50==5000)||(setcan==5000))
	{
		din_50=0;
		setcan=0;
	}
	
}

void DAC_Init(void)    /***DAC初始化***/
{
	IDA0CN=0XF1;       //DAC允许,写IDA0H触发输出更新,1mA满度输出
}

unsigned char Get_DAH(unsigned int count)  /***得到IDA0H值***/
{
	unsigned char da_h;	
	count <<= 6;

	count=(count&0xff00)>>8;
	da_h=(unsigned char)count;

	return da_h;
}

unsigned char Get_DAL(unsigned int count)  /***得到IDA0L值***/
{
	unsigned char da_l;	
	count <<= 6;

	count=count&0x00ff;
	da_l=(unsigned char)count;

	return da_l;
}

void send7289()                  //7289送指令和数据函数
{
	unsigned char BIT_CNT;
	BIT_CNT=0x08;
	delay_long();
	while( BIT_CNT!=0)
	{
		DIO=((SEND_BUF>>(BIT_CNT-1))&0x01);
		CLK=1;
		delay_short();
		CLK=0;
		delay_short();
		BIT_CNT--;
    }
	DIO=0;
}

void delay_short(void)            //短延时
{
	unsigned char j;
	for(j=0;j<20;j++);
}

void delay_long(void)             //长延时
{
    unsigned char j;
	for(j=0;j<120;j++)
	{;}
}

void delay_10ms(unsigned int time)       //延时10ms
{
	unsigned int i,j,k;
	for(i=0;i<time;i++)
		for(j=0;j<10;j++)
			for(k=0;k<120;k++)
			;
}

unsigned char read_key()           //7289读键盘代码
{
	unsigned char i;
    unsigned char temp=0;
    unsigned char aa=0;

	for(i=0;i<8;i++)
	{
		temp = temp<<1;
		aa = DIO;
		if(aa==1)
			temp=temp+1;
		CLK=1;
		delay_short();
		CLK=0;
	}
	return (temp);
}

void db_clear(int a,int b,int c,int d)    //4位数码管显示
{
	CS=0;
	CLK=0;
	delay_short();


	SEND_BUF=0xA4;           //7289复位
	send7289();

	CS = 0;                  // 选择驱动第1个数码管显示
	delay_short();
	SEND_BUF=0XC8;
	send7289();
	delay_short();
	SEND_BUF=a;
	send7289();
	CS = 1;
	delay_long();


	CS = 0;                   // 选择驱动第2个数码管显示
	delay_short();
	SEND_BUF=0XC9;
	send7289();
	delay_short();
	SEND_BUF=b;
	send7289();
	CS = 1;
	delay_long();


	CS = 0;                    // 选择驱动第3个数码管显示
	delay_short();
	SEND_BUF=0XCA;
	send7289();
	delay_short();
	SEND_BUF=c;
	send7289();
	CS = 1;
	delay_long();


	CS = 0;                    // 选择驱动第4个数码管显示
	delay_short();
	SEND_BUF=0XCB;
	send7289();
	delay_short();
	SEND_BUF=d;
	send7289();
	CS = 1;
	delay_long();
}


⌨️ 快捷键说明

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