不好意思,忘了
- #include<red52.h>
- sbit ZZ=P3^0; //正转
- sbit FZ=P3^1; //反转
- sbit TZ=P3^4; //停止
- sbit K1=P3^5; //加速
- sbit K2=P3^6; //减速
- sbit shiwei=P2^2//速度的十位
- sbit gewei=P2^3//速度的个位
- sbit shuru=P2^1//输入正反停这三状态
- sbit shuru1=P2^0//输入加减速状态
- sbit L1=P2^4;
- sbit L2=P2^5;
- sbit L3=P2^6;//38译码器的3线输入端
- #define uchar unsigned char
- #define uchar unsigned int
- uchar code zz[4]={0x05,0x06,0x10,0x09};
- uchar code fz[4]={0x09,0x10,0x06,0x05};
- uchar code xianshi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x5e,0x71,0x31,0x3e};//显示数组值为0~9,D(减速)F(反转)U(加速)T(停止)Z(正转)
- uint time,count,speedlevel//speedlevel为步进电机转速参数,其值越大电机的速度越小,值越小电机转速越大;其范围为1~100;
- uint speedcount;//步进电机转速参数计数
- uint step=10000;//步数,在本次实验中,设定电机步数为0时到达目的地
- uint stepcount;//步数计数
- unsigned char keycan=0; //键值
- unsigned char s,i,j,k,z;
- /**********************************/
- /**P1.0=A ;P1.1=A- ;P1.2=B ; P1.3=B-**/
- /**延时t,由于选用的晶振为11.0592MHz,即一个机器周期为1微秒**/
- void delay(i)//延时函数
- {
- for(j=0;j<i;j++)
- for(k=0;k<250;k++);
- }
- /***正反转程序部分**/
- void motor_zhengzhuan()
- {
- for(i=0;i<4;i++)
- {P1=zz[i];
- delay(speedlevel);
- }
- }
- void motor_fanzhuan()
- {
- for(j=0;j<4;j++)
- for(i=0;i<4;i++)
- {P1=fz[i];
- delay(speedlevel);
- }
- }
- /**位置控制**/
- /**由于步距角为1.8°,故电机转动一圈为200步即200脉冲,并规定正转步数减1,反转加1**/
- void weizhi()
- { if(ZZ==0)
- { stepcount++;
- step=step-stepcount;
- if(step==0)
- { TZ=0;
- }
- }
- if(FZ==0)
- {stepcount++;
- step=step+stepcount;
- }
- }
- /**LED数码管显示部分**/
- /**本次实验采用7SEG-MPX4-CC共阴极数码管显示,规定左边2个数码代表状态,右边2个数码管代表speedlevel即步进电机转速参数**/
- void xianshi()
- { uint i,j,m,n;
- i=speedlevel%10;
- j=speedlevel/10;
- gewei=0; //开个位数码管
- P0=xianshi[i];
- delay(1);
- geiwei=1;
- shiwei=0; //开十位数码管
- P0=xianshi[j];
- delay(1);
- shiwei=1;
- shuru=0;
- if(ZZ==0)
- { P0=xianshi[2];
- else if(FZ==0)
- { P0=xianshi[12];
- }
- else if(TZ==0)
- { P0=xianshi[14];
- }
- }
- delay(10);
- shuru=1;
- shuru1=0;
- if(K1==0)
- { P0=xianshi[13];
- else if(K2==0)
- { P0=xianshi[11];
- }
- }
- delay(10);
- shuru1=1;
- }
- /**主程序部分**/
- main()
- { //EA=1; //中断允许
- //IT0=0;//电平触发
- //EX0=1;//外部中断0允许
- //EX1=0; //外部中断1允许
- //TMOD=1; //方式1
- // ET0=1; //定时器0中断允许
- //TH0=0xfe;
- //TL0=0x0c; //设定0.5ms中断1次
- //TR0=1; //计数开始
- speedlevel=50;//设定初始步进电机转速等阶为5
- while(1)
- { gewei=1;
- shiwei=1;
- shuru=1;
- shuru1=1; //关闭LED数码管显示
- if(ZZ==0) //如果电机正转按键按下
- { delay(2); //去抖动
- if(ZZ==0)
- { L1=0;
- L2=0 ;
- L3=0; //控制正转LED灯亮
- keycan=1; //键值等于1
- }
- }
- if(FZ==0) //如果电机反转按键按下
- { delay(2); //去抖动
- if(FZ==0)
- { L1=0;
- L2=0;
- L3=1; //控制反转LED灯亮
- keycan=2; //键值等于2
- }
- }
- if(TZ==0)
- { delay(2); //去抖动
- { L1=0;
- L2=1;
- L3=0; //控制停止LED灯亮
- keycan=3;
- }
- }
- switch (keycan)
- {
- case 1: motor_zhengzhuan(); //键值等于1 正转
- break;
- case 2: motor_fanzhuan(); //键值等于2 反转
- break;
- }
- if(K1==0) // 电机加速
- { delay(2); //去抖动
- if(K1==0)
- { L1=0;
- L2=1;
- L3=1; //控制加速LED灯亮
- speedlevel-=5;
- if(speedlevel<=0)
- { speedlevel=1;//表示当参数降到0时,电机以speedlevel=1作为最大速度工作
- }
- }
- }
- if(K2==0) // 电机减速
- { delay(2); //去抖动
- if(K2==0)
- { L1=1;
- L2=0;
- L3=0; //控制减速LED灯亮
- speedlevel+=5;
- if(speedlevel>=100)
- { speedlevel=99;//表示当参数降到0时,电机以speedlevel=99作为最小速度工作
- }
- }
- }
- xianshi(); //调用显示程序
- }
- }
复制代码
|