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

📄 2990.c

📁 本设计设计了一个电机控制的测试台 其中包含原理图和源程序 希望对大家有帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
								{	
									while(key4==0)		//等待放开
									{
										display_scan();	//动态扫描
										sound=0;		//蜂鸣指示
									}
									sound=1;
									switch(dis.motor_number)
									{
									case 0	:	P2=P2&0xe0;
												P2=P2|start_pa[0];		//启动电机1
												/*delay1ms();			//1ms后进行电压检测
												if(RUN==0)			//电压检测口,为0表示启动成功
													dis.start_time0++;
												else
													P2=P2&0xe0;		//关闭所有电机*/
												break;
									case 1	:	P2=P2&0xe0;
												P2=P2|start_pa[1];		//启动电机2
												/*delay1ms();			//1ms后进行电压检测
												if(RUN==0)			//电压检测口,为0表示启动成功
													dis.start_time1++;
												else
													P2=P2&0xe0;		//关闭所有电机*/
												break;
									case 2	:	P2=P2&0xe0;
												P2=P2|start_pa[2];		//启动电机3
												/*delay1ms();			//1ms后进行电压检测
												if(RUN==0)			//电压检测口,为0表示启动成功
													dis.start_time2++;
												else
													P2=P2&0xe0;		//关闭所有电机*/
												break;
									case 3	:	P2=P2&0xe0;
												P2=P2|start_pa[3];		//启动电机4
												/*delay1ms();			//1ms后进行电压检测
												if(RUN==0)			//电压检测口,为0表示启动成功
													dis.start_time3++;
												else
													P2=P2&0xe0;		//关闭所有电机*/
												break;
									case 4	:	P2=P2&0xe0;
												P2=P2|start_pa[4];		//启动电机4
												/*delay1ms();			//1ms后进行电压检测
												if(RUN==0)			//电压检测口,为0表示启动成功
													dis.start_time4++;
												else
													P2=P2&0xe0;		//关闭所有电机*/
												break;
									default	:	break;
									}
								}
							}
							break;
				case 4	:	read=1;		//从24c02中读取值
							break;
										
			}
		}
	}
	else if(key4==0)key44=1; 
}  

/***************************************************
*					显示程序					   *
***************************************************/
void display_motor(void)
{
	uchar number0,number1,number2,number3,number4;
	switch(i)
	{
		case	0	:	switch(dis.motor_number)							//显示个位上的数
						{
							case 0	:	P1=seven_seg[dis.start_time0%10];
										break;
							case 1	:	P1=seven_seg[dis.start_time1%10];	
										break;
							case 2	:	P1=seven_seg[dis.start_time2%10];
										break;
							case 3	:	P1=seven_seg[dis.start_time3%10];
										break;
							case 4	:	P1=seven_seg[dis.start_time4%10];
										break;
							default	:	break;
						}
						break;

		case	1	:	switch(dis.motor_number)							//显示十位上的数
						{
							case 0	:	number0=dis.start_time0/10;
										P1=seven_seg[number0%10];
										break;
							case 1	:	number1=dis.start_time1/10;
										P1=seven_seg[number1%10];	
										break;
							case 2	:	number2=dis.start_time2/10;
										P1=seven_seg[number2%10];
										break;
							case 3	:	number3=dis.start_time3/10;
										P1=seven_seg[number3%10];
										break;
							case 4	:	number4=dis.start_time4/10;
										P1=seven_seg[number4%10];
										break;
							default	:	break;
						}
						break;

		case	2	:	switch(dis.motor_number)						 	//显示百位上的数
						{
							case 0	:	number0=dis.start_time0/100;
										P1=seven_seg[number0%10];
										break;
							case 1	:	number1=dis.start_time1/100;
										P1=seven_seg[number1%10];	
										break;
							case 2	:	number2=dis.start_time2/100;
										P1=seven_seg[number2%10];
										break;
							case 3	:	number3=dis.start_time3/100;
										P1=seven_seg[number3%10];
										break;
							case 4	:	number4=dis.start_time4/100;
										P1=seven_seg[number4%10];
										break;
							default	:	break;
						}
						break;

		case	3	:	switch(dis.motor_number)							//显示千位上的数
						{
							case 0	:	number0=dis.start_time0/1000;
										P1=seven_seg[number0%10];
										break;
							case 1	:	number1=dis.start_time1/1000;
										P1=seven_seg[number1%10];	
										break;
							case 2	:	number2=dis.start_time2/1000;
										P1=seven_seg[number2%10];
										break;
							case 3	:	number3=dis.start_time3/1000;
										P1=seven_seg[number3%10];
										break;
							case 4	:	number4=dis.start_time4/1000;
										P1=seven_seg[number4%10];
										break;
							default	:	break;
						}
						break;
		case 	4	:	switch(dis.motor_number)							//显示万位上的数
						{
							case 0	:	number0=dis.start_time0/10000;
										P1=seven_seg[number0%10];
										break;
							case 1	:	number1=dis.start_time1/10000;
										P1=seven_seg[number1%10];	
										break;
							case 2	:	number2=dis.start_time2/10000;
										P1=seven_seg[number2%10];
										break;
							case 3	:	number3=dis.start_time3/10000;
										P1=seven_seg[number3%10];
										break;
							case 4	:	number4=dis.start_time4/10000;
										P1=seven_seg[number4%10];
										break;
							default	:	break;
						}
						break;
		case	5	:	if(mode_signel==1)
						{
							P1=seven_seg[mode];
						}
						else
						{
							P1=seven_seg[dis.motor_number];	
						}
						break;
		default	:	break;
	}
}

/***************************************************
*				显示扫描子程序					   *
***************************************************/
void display_scan(void)
{
	P0=scan[i];
	i++;
	if(i==6)
		i=0;
}
/****************************************************
*			INT1中断初始化程序(低压检测)			*
****************************************************/
void int1_initial(void)
{
	EA=0;			//关闭所有中断
	EX1=1;			//允许int1中断
	PX1=1;			//int1中断优先
	EA=1;			//开启所有中断
}

/****************************************************
*				t0中断初始化程序					*
****************************************************/
void t0_initial(void)
{
	EA=0;
	time0_tick=0;
	TR0=0;
	TMOD&=0xfd;
	TMOD|=0x01;
	TL0=0x78;		//设置5毫秒中断初值
	TH0=0xec;
	ET0=1;
	TR0=1;
	EA=1;
}
/************************************************
*				24c02服务程序					*
************************************************/
//启动I2C总线,即发送I2C起始条件
void Start(void) 
{
	SCL=0;//低电平改变DA线
	SDA=1;
	SCL=1;
	NOP;
	SDA=0;		//在SCL为高时,SDA由高变低,产生起始信号
	NOP;
	SCL=0;		//SCL变低电平,准备发送或接收数据
}
//结束I2C总线,即发送I2C结束信号
void Stop(void)	
{
	SCL=0;
	SDA=0;
	SCL=1;
	NOP;
	SDA=1;		//当SCL为高电平时,SDA由低变高,产生I2C总线结束信号
	NOP;
	SCL=0;
}

//读数据操作
uchar RdOperation(void)		//读两个字节数据函数
{
  uchar time;//两个字节
  uint DataIn=0;//读进来的数据
  for(time=0;time<16;time++)
  {
	SCL=0;
	NOP;
	SCL=1;
	NOP;
    DataIn=(DataIn<<1)|SDA;
  }
  SCL=0;
  NOP;
  SDA=1;
  NOP;
  SCL=1;
  return DataIn;
}

//写器件地址和EEPROM地址
void WrOperation(uchar Out)	//写器件地址和EEPROM地址
{
  uchar time;			//一个字节
  for(time=0;time<8;time++)	//从最高位开始输出
  {
    SCL=0;
    SDA=Out&0x80;
	Out<<=1;
    NOP;
    SCL=1;
  }
  SCL=0;
  NOP;
  SCL=1;
  NOP;
  while(SDA!=0);
  SCL=0;
}
//写两个字节数据操作
void Wr_data(uchar DataOut)
{
  uchar time;//两个字节
  for(time=0;time<16;time++)//从最高位开始输出
  {
    SCL=0;
    SDA=DataOut&0x80;
	DataOut<<=1;
    NOP;
    SCL=1;
  }
  SCL=0;
  NOP;
  SCL=1;
  NOP;
  while(SDA!=0);
  SCL=0;
}
//写EEPROM
void WrEEPROM(uchar address,uchar y)
{
  Start();//开始
  WrOperation(0xa0);//写器件地址
  WrOperation(address);//写EEPROM地址
  Wr_data(y);//写数据
  Stop();//停止
  Delay10Ms();//延时,EEPROM内部操作
}
//读EEPROM
uchar RdEEPROM(uchar address)
{
  uchar x;
  Start();
  WrOperation(0xa0);//写器件地址
  WrOperation(address);
  Start();
  WrOperation(0xa1);//写EEPROM地址(读)
  x=RdOperation();
  Stop();
  return x;
}
/*****************************************************
*					延时10ms						 *
*****************************************************/
void Delay10Ms(void)
{
	uchar i,j;
	for(i=0;i<25;i++)
		for(j=0;j<50;j++);
}
/*****************************************************
*					延时1ms						 	 *
*****************************************************/
/*void delay1ms(void)			//1ms后进行电压检测
{
	uchar i;
	for(i=0;i<125;i++)
	{
		_nop_();
	}
}*/

/*****************************************************
*					读取24C02程序					 *
*****************************************************/
void read_24c02(void)		//从24c02中读取值
{
	dis.start_time0=RdEEPROM(0);
	dis.start_time1=RdEEPROM(1);
	dis.start_time2=RdEEPROM(2);
	dis.start_time3=RdEEPROM(3);
	dis.start_time4=RdEEPROM(4);
}
/*****************************************************
*					写24C02程序					 	 *
*****************************************************/
void write_24c02(void)		//将值写入24C01
{
	WrEEPROM(0,dis.start_time0);
	WrEEPROM(1,dis.start_time1);
	WrEEPROM(2,dis.start_time2);
	WrEEPROM(3,dis.start_time3);
	WrEEPROM(4,dis.start_time4);
}
/*********************************************************
*					主函数								 *
*********************************************************/
void main(void)
{
	RUN=0;
	dis.motor_number=0;
	read=0;			//首先清零读标志
	int1_initial();	//外部中断1初始化
	t0_initial();	//定时器0初始化
	P2=0x00;		//先初始化P2口
	P2=P2&0xe0;
	P2=P2|start_pa[0];		//启动电机0
	signel0=1;
	/*delay1ms();			//1ms后进行电压检测
	if(RUN==0)			//电压检测口,为0表示启动成功
		dis.start_time1++;
	else
		P2=P2&0xe0;		//关闭所有电机*/
	do
	{//uchar j=0;
		switch(dis.motor_number)
		{
			case 0	:	if(test0==200)
						{
							test0=0;
							if(RUN==0)			//电压检测口,为0表示启动成功
								dis.start_time0++;
							else
								P2=P2&0xe0;		//关闭所有电机
						}
						break;
			case 1	:	if(test1==200)
						{
							test1=0;
							if(RUN==0)			//电压检测口,为1表示启动成功
								dis.start_time1++;
							else
								P2=P2&0xe0;		//关闭所有电机
						}
						break;
			case 2	:	if(test2==200)
						{
							test2=0;
							if(RUN==0)			//电压检测口,为2表示启动成功
								dis.start_time2++;
							else
								P2=P2&0xe0;		//关闭所有电机
						}
						break;
			case 3	:	if(test3==200)
						{
							test3=0;
							if(RUN==0)			//电压检测口,为3表示启动成功
								dis.start_time3++;
							else
								P2=P2&0xe0;		//关闭所有电机
						}
						break;
			case 4	:	if(test4==200)
						{
							test4=0;
							if(RUN==0)			//电压检测口,为4表示启动成功
								dis.start_time4++;
							else
								P2=P2&0xe0;		//关闭所有电机
						}
						break;
			default	:	break;
		}
		if(read==1)
		{	
			read_24c02();		//从24c02中读取值
		}
	}while(1);
}













	


	







											
								
											

	

⌨️ 快捷键说明

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