不好意思,忘了
- #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(); //調用顯示程序
- }
- }
復制代碼
|