|
设计包含PROTEUS仿真电路图和程序代码。设计能实现步进电机的启停控制,加减档调速并显示当前档位和速度。
- /***步进电机调速实验***/
- /***实验内容:通过程序能够实现电机的启停,正反转,加减速。同时显示电机当前档位和速度。***/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- void Delay_ms(uint x);//延时函数
- void Key_pros(); //声明按键函数
- void MotorControl_fwd();//声明电机控制函数
- void MotorControl_bwd();
- void Dig_display();//4位数码管显示函数
- void Data_pros(uint temp);//速度处理显示
- uchar code Motor_fwd[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //正转动数组
- uchar code Motor_bwd[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //反转动数组
- uchar code segcode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴显示段码,用于共阳数码管取反。
- uchar V_pros[4];
- uchar count=5; //初始挡位5档
- uint loop=50,j; //初始速度50ms一步,通过改变loop调整调整脉冲频率达到调速的目的
- uchar flag=1; //正反转标志位 1正0反
- uchar state=1; //启停标志位 1启动0关闭
- sbit Motor_Dcl=P1^2; //电机减速
- sbit Motor_Acl=P1^1; //电机加速
- sbit Motor_Bwd=P1^4; //电机反转
- sbit Motor_Fwd=P1^3; //电机正转
- sbit Motor_Control=P1^0; //电机启停
- sbit LSA=P2^0;
- sbit LSB=P2^1;
- sbit LSC=P2^2;
- void main()
- {
- while(1)
- {
- uint speed;
- Key_pros();
- while(state==1)
- {
- if(flag==1)
- {
- MotorControl_fwd();
- P2=~segcode[count];
- Key_pros();
- }
- if(flag==0)
- {
- MotorControl_bwd();
- Key_pros();
- P2=~segcode[count];
- }
- switch(loop)
- {
- case 10:speed=1900;break;
- case 20:speed=1800;break;
- case 30:speed=1700;break;
- case 40:speed=1600;break;
- case 50:speed=1500;break;
- case 60:speed=1400;break;
- case 70:speed=1300;break;
- case 80:speed=1200;break;
- case 90:speed=1100;break;
- default:break;
- }
- Data_pros(speed);
- Dig_display();
- }
- }
- }
- /***
- 函数名: Delay()
- 函数功能:延时函数
- 输入:j
- 输出:无
- ***/
- void Delay_ms(uint x)
- {
-
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void delay(uint i)
- {
- while(i--);
- }
- /***
- 函数名: MotorControl_fwd()
- 函数功能: 电机正转函数
- 输入:无
- 输出:无
- ***/
- void MotorControl_fwd()
- {
- uchar z;
- for(z=0;z<8;z++)
- {
- P3=Motor_fwd[z];
- Delay_ms(loop);
- }
- }
- /***
- 函数名: MotorControl_bwd()
- 函数功能: 电机反转函数
- 输入:无
- 输出:无
- ***/
- void MotorControl_bwd()
- {
- uchar z;
- for(z=0;z<8;z++)
- {
- P3=Motor_bwd[z];
- Delay_ms(loop);
- }
- }
- /***
- 函数名:void Key_pros()
- 函数功能: 电机反转函数
- 输入:
- 输出:
- ***/
- void Key_pros()
- {
- P1=0xff;
- if(P1!=0xff)
- Delay_ms(10);
- if(P1!=0xff)
- {
- switch(P1)
- {
- case 0xfe:state=~state;break;
- case 0xfd:loop-=10;count++;break;
- case 0xfb:loop+=10;count--;break;
- case 0xf7:flag=1;break;
- case 0xef:flag=0;break;
- }
- if(loop<10) //超速保护,最快10ms一步
- {
- count=9;loop=10;
- }
- else if(loop>90) //最低转速限制90ms一步
- {
- count=1;loop=90;
- }
- }
- while(P1!=0xff); //等待按键释放
- }
- /***
- 函数名: VDisplay_pros();
- 函数功能: 速度处理显示
- 输入:speed
- 输出:无
- ***/
- void Data_pros(uint temp)
- {
- V_pros[0]=segcode[temp/1000];
- V_pros[1]=segcode[temp%1000/100];
- V_pros[2]=segcode[temp%100/10];
- V_pros[3]=segcode[temp%10];
- }
- /***
- 函数名:void Dig_display()
- 函数功能: 4位数码管显示函数
- 输入:无
- 输出:无
- ***/
- void Dig_display()
- {
- uint i;
- for(i=0;i<4;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=0;LSB=1;LSC=1; break;//显示第3位
- }
- P0=~V_pros[i];//发送段码
- delay(100); //间隔一段时间扫描
- P0=0x00;//消隐
- }
- }
复制代码
|
|