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

📄 2990.c

📁 本设计设计了一个电机控制的测试台 其中包含原理图和源程序 希望对大家有帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<regx52.h>
#include<intrins.h>
#define	NOP		_nop_();_nop_();_nop_();_nop_();_nop_()		//延时5us
#define	uchar	unsigned char
#define	uint	unsigned int
sbit key1=P3^5;
sbit key2=P3^0;
sbit key3=P3^1;
sbit key4=P3^4;
sbit key5=P3^3;
sbit sound=P3^7; 		//蜂鸣器
sbit RUN=P2^5;			//电压检测
sbit SCL=P2^7;
sbit SDA=P2^6;
const start_pa[5]={0x01,0x02,0x04,0x08,0x10};		//电机启动参数
const seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管段码
const scan[6]={0x3e,0x3d,0x3b,0x37,0x2f,0x1f};//位选码
typedef struct
			{
				 uint start_time0;
				 uint start_time1;
				 uint start_time2;
				 uint start_time3;
				 uint start_time4;
				 uchar motor_number;
			}motor;

uint time0_tick,i=0;	//计数次数
uint start_max1=0,start_max2=0,start_max3=0,start_max4=0,start_max5=0;		//设置最大启动次数
uchar mode=0;		//模式设置
uchar read;			//读24c02标志
uchar mode_signel=0;	//模式显示标志
uchar test0=0,test1=0,test2=0,test3=0,test4=0;		//用于电机启动后延时一秒再检测启动成功与否
uchar signel0=0,signel1=0,signel2=0,signel3=0,signel4=0;		//电机启动标志
motor dis;
/********************************************************
*						函数声明						*
********************************************************/
void key_judge(void);
void display_motor(void);
void display_scan(void);
void int1_initial(void);
void t0_initial(void);
void Start(void);
void stop(void);
void Ack(void);
uchar RdOperation(void);		//读两个字节数据函数
void WrOperation(uchar Out);	//写器件地址和EEPROM地址
void Wr_data(uchar DataOut);
void WrEEPROM(uchar address,uchar y);
uchar RdEEPROM(uchar address);
void read_24c02(void);		//从24c02中读取值
void write_24c02(void);		//将值写入24C01
void Delay10Ms(void);
//void delay1ms(void);			//1ms后进行电压检测

/********************************************************
*				INT1中断服务程序						*
********************************************************/
void int1_isr(void) interrupt 2 using 2
{
	write_24c02();		//将值写入24C02
	P0=0x00;			//关闭所有的IO口
	P1=0x00;
	P2=0x00;
	
}
/*****************************************************
*         定时器0中断功能按键及显示                  *					
*****************************************************/
static void timer0_isr(void) interrupt 1 using 1
{
	TR0=0;
	TL0=0x78;		//重装5毫秒中断初值
	TH0=0xec;
	TR0=1;
	switch(dis.motor_number)			//用于电机启动后延时一秒再检测启动成功与否
	{
		case 0	:	if(signel0==1)
						test0++;
					break;
		case 1	:	if(signel1==1)
						test1++;
					break;
		case 2	:	if(signel2==1)
						test2++;
					break;
		case 3	:	if(signel3==1)
						test3++;
					break;
		case 4	:	if(signel0==1)
						test4++;
					break;
		default	:	break;
	} 
	time0_tick++;
	if(time0_tick==1000)
		{
			time0_tick=0;
			dis.motor_number++;
			if(dis.motor_number==5)
			{
				dis.motor_number=0;
			}
			switch(dis.motor_number)
			{
		
				case 0	:	P2=P2&0xe0;
							P2=P2|start_pa[0];		//启动电机0
							signel0=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];		//启动电机1
							signel1=1;				//启动信号
							/*delay1ms();			//1ms后进行电压检测
							if(RUN==0)			//电压检测口,为0表示启动成功
								dis.start_time1++;
							else
								P2=P2&0xe0;		//关闭所有电机*/
							break;
				case 2	:	P2=P2&0xe0;
							P2=P2|start_pa[2];		//启动电机2
							signel2=1;				//启动信号
							/*delay1ms();			//1ms后进行电压检测
							if(RUN==0)			//电压检测口,为0表示启动成功
								dis.start_time2++;
							else
								P2=P2&0xe0;		//关闭所有电机*/
							break;
				case 3	:	P2=P2&0xe0;
							P2=P2|start_pa[3];		//启动电机3
							signel3=1;				//启动信号
							/*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
							signel4=1;				//启动信号
							/*delay1ms();			//1ms后进行电压检测
							if(RUN==0)			//电压检测口,为0表示启动成功
								dis.start_time4++;
							else
								P2=P2&0xe0;		//关闭所有电机*/
							break;
				default :	break;		
			}
		}
	key_judge();	//按键判断
	display_motor();		//显示程序
	display_scan();			//动态扫描

	
}

/*****************************************************
*            		按键判断						 *
*****************************************************/
void key_judge(void) 
{
	uchar key11=0,key22=0,key33=0,key44=0,key55=0;
	if(key11!=0)		//判断key1键(模式选择键)
	{
		key11--;
		if(key11==0&key1==0)
		{	
			while(key1==0)		//等待放开
			{
				display_scan();	//动态扫描
				sound=0;		//蜂鸣指示
			}
			sound=1;
			mode_signel=1;		//模式标志(用于显示)
			mode++;
			if(mode==5)mode=0;
		}
	}
	else if(key1==0)key11=1;
	if(key22!=0)		//判断key2键(上翻键判断)
	{
		key22--;
		if(key22==0&key2==0)
		{	
			while(key2==0)		//等待放开
			{
				display_scan();	//动态扫描
				sound=0;		//蜂鸣指示
			}
			mode_signel=0;		//显示电机号
			sound=1;
			dis.motor_number++;
			if(dis.motor_number==5)
				dis.motor_number=0;
			switch(mode)		//模式判断
			{
				case 1 :	switch(dis.motor_number)		//设置各电机启动参数的最大值
							{
								case 1 :	if(key33!=0)		//判断key3键(加)
											{
												key33--;
												if(key33==0&key3==0)
												{	
													while(key3==0)		//等待放开
													{
														display_scan();	//动态扫描
														sound=0;		//蜂鸣指示
													}
													sound=1;
													start_max1=start_max1+1000;		//每次1000递增
													if(start_max1==60000)			//最大增到60000
														start_max1=0;
												}
											}
									   		else if(key3==0)key33=1;
									   		if(key44!=0)		//判断key4键(减)
									  		 {
												key44--;
												if(key44==0&key4==0)
												{	
													while(key4==0)		//等待放开
													{
														display_scan();	//动态扫描
														sound=0;		//蜂鸣指示
													}
													sound=1;
													start_max1=start_max1-1000;		//每次1000递减
													if(start_max1<0)			//减到小于0
														start_max1=60000;
												}
											  }
									  		 else if(key3==0)key33=1;
									  		 break;

								case 2 :	if(key33!=0)		//判断key3键(加)
											{
												key33--;
												if(key33==0&key3==0)
												{	
													while(key3==0)		//等待放开
													{
														display_scan();	//动态扫描
														sound=0;		//蜂鸣指示
													}
													sound=1;
													start_max2=start_max2+1000;		//每次1000递增
													if(start_max2==60000)			//最大增到60000
													start_max2=0;
												}
											}
									 	  	else if(key3==0)key33=1;
									  		if(key44!=0)		//判断key4键(减)
									  		{
												key44--;
												if(key44==0&key4==0)
												{	
													while(key4==0)		//等待放开
													{
														display_scan();	//动态扫描
														sound=0;		//蜂鸣指示
													}
													sound=1;
													start_max2=start_max2-1000;		//每次1000递减
													if(start_max2<0)			//减到小于0
														start_max2=60000;
												}
											}
									   		else if(key3==0)key33=1;
									  		 break;
					
								case 3 :	if(key33!=0)		//判断key3键(加)
											{
												key33--;
												if(key33==0&key3==0)
												{	
													while(key3==0)		//等待放开
													{
														display_scan();	//动态扫描
														sound=0;		//蜂鸣指示
													}
													sound=1;
													start_max3=start_max3+1000;		//每次1000递增
													if(start_max3==60000)			//最大增到60000
													start_max3=0;
												}
											}
											else if(key3==0)key33=1;
											if(key44!=0)		//判断key4键(减)
									   		{
												key44--;
												if(key44==0&key4==0)
												{	
													while(key4==0)		//等待放开
													{
														display_scan();	//动态扫描
														sound=0;		//蜂鸣指示
													}
													sound=1;
													start_max3=start_max3-1000;		//每次1000递减
													if(start_max3<0)			//减到小于0
														start_max3=60000;
												}
											}
									 		else if(key3==0)key33=1;
											break;

								case 4 :	if(key33!=0)		//判断key3键(加)
											{
												key33--;
												if(key33==0&key3==0)
												{	
													while(key3==0)		//等待放开
													{
														display_scan();	//动态扫描
														sound=0;		//蜂鸣指示
													}
													sound=1;
													start_max4=start_max4+1000;		//每次1000递增
													if(start_max4==60000)			//最大增到60000
														start_max4=0;
												}
											}
											else if(key3==0)key33=1;
									   		if(key44!=0)		//判断key4键(减)
											{
												key44--;
												if(key44==0&key4==0)
												{	
													while(key4==0)		//等待放开
													{
														display_scan();	//动态扫描
														sound=0;		//蜂鸣指示
													}
													sound=1;
													start_max4=start_max4-1000;		//每次1000递减
													if(start_max4<0)			//减到小于0
														start_max4=60000;
												}
											}
											   else if(key3==0)key33=1;
											   break;

			
								case 5	:	if(key33!=0)		//判断key3键(加)
											{
												key33--;
												if(key33==0&key3==0)
												{	
													while(key3==0)		//等待放开
													{
														display_scan();	//动态扫描
														sound=0;		//蜂鸣指示
													}
													sound=1;
													start_max5=start_max5+1000;		//每次1000递增
													if(start_max5==60000)			//最大增到60000
														start_max5=0;
												}
											}
										  	 else if(key3==0)key33=1;
											   if(key44!=0)		//判断key4键(减)
											   {
													key44--;
													if(key44==0&key4==0)
													{	
														while(key4==0)		//等待放开
														{
															display_scan();	//动态扫描
															sound=0;		//蜂鸣指示
														}
														sound=1;
														start_max5=start_max5-1000;		//每次1000递减
														if(start_max5<0)			//减到小于0
														start_max5=60000;
													}
												}
										 	  else if(key3==0)key33=1;
										 	  break;
								default :		break;
							}
							break;
				case 2	:	display_motor();
								break;
				case 3	:	if(key44!=0)		//判断key4键(确定键按下后启动)
							{
								key44--;
								if(key44==0&key4==0)
								{	
									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;
									}
								}
							}
							else if(key4==0)key44=1;
							break;
				case 4	:	read_24c02();		//从24c02中读取值
							break;
				default	:	break;
			}
			//default :	break;
			
		}
	}
	else if(key2==0)key22=1;
	if(key33!=0)		//判断key3键(下翻)
	{
		key33--;
		if(key33==0&key3==0)
		{	
			while(key3==0)		//等待放开
			{
				display_scan();	//动态扫描
				sound=0;		//蜂鸣指示
			}
			sound=1;
			mode_signel=0;		//显示电机号标志
			dis.motor_number--;
			if(dis.motor_number<0)
				dis.motor_number=4;
			switch(mode)
			{
				case 3	:	if(key44!=0)		//判断key4键(确定键按下后启动)
							{
								key44--;
								if(key44==0&key4==0)

⌨️ 快捷键说明

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