|
不好意思,忘了
- #include<red52.h>
- sbit ZZ=P3^0; //正轉(zhuǎn)
- sbit FZ=P3^1; //反轉(zhuǎn)
- sbit TZ=P3^4; //停止
- sbit K1=P3^5; //加速
- sbit K2=P3^6; //減速
- sbit shiwei=P2^2//速度的十位
- sbit gewei=P2^3//速度的個(gè)位
- sbit shuru=P2^1//輸入正反停這三狀態(tài)
- sbit shuru1=P2^0//輸入加減速狀態(tài)
- 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};//顯示數(shù)組值為0~9,D(減速)F(反轉(zhuǎn))U(加速)T(停止)Z(正轉(zhuǎn))
- uint time,count,speedlevel//speedlevel為步進(jìn)電機(jī)轉(zhuǎn)速參數(shù),其值越大電機(jī)的速度越小,值越小電機(jī)轉(zhuǎn)速越大;其范圍為1~100;
- uint speedcount;//步進(jìn)電機(jī)轉(zhuǎn)速參數(shù)計(jì)數(shù)
- uint step=10000;//步數(shù),在本次實(shí)驗(yàn)中,設(shè)定電機(jī)步數(shù)為0時(shí)到達(dá)目的地
- uint stepcount;//步數(shù)計(jì)數(shù)
- unsigned char keycan=0; //鍵值
- unsigned char s,i,j,k,z;
- /**********************************/
- /**P1.0=A ;P1.1=A- ;P1.2=B ; P1.3=B-**/
- /**延時(shí)t,由于選用的晶振為11.0592MHz,即一個(gè)機(jī)器周期為1微秒**/
- void delay(i)//延時(shí)函數(shù)
- {
- for(j=0;j<i;j++)
- for(k=0;k<250;k++);
- }
- /***正反轉(zhuǎn)程序部分**/
- 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°,故電機(jī)轉(zhuǎn)動(dòng)一圈為200步即200脈沖,并規(guī)定正轉(zhuǎn)步數(shù)減1,反轉(zhuǎn)加1**/
- void weizhi()
- { if(ZZ==0)
- { stepcount++;
- step=step-stepcount;
- if(step==0)
- { TZ=0;
- }
- }
- if(FZ==0)
- {stepcount++;
- step=step+stepcount;
- }
- }
- /**LED數(shù)碼管顯示部分**/
- /**本次實(shí)驗(yàn)采用7SEG-MPX4-CC共陰極數(shù)碼管顯示,規(guī)定左邊2個(gè)數(shù)碼代表狀態(tài),右邊2個(gè)數(shù)碼管代表speedlevel即步進(jìn)電機(jī)轉(zhuǎn)速參數(shù)**/
- void xianshi()
- { uint i,j,m,n;
- i=speedlevel%10;
- j=speedlevel/10;
- gewei=0; //開(kāi)個(gè)位數(shù)碼管
- P0=xianshi[i];
- delay(1);
- geiwei=1;
- shiwei=0; //開(kāi)十位數(shù)碼管
- 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;//電平觸發(fā)
- //EX0=1;//外部中斷0允許
- //EX1=0; //外部中斷1允許
- //TMOD=1; //方式1
- // ET0=1; //定時(shí)器0中斷允許
- //TH0=0xfe;
- //TL0=0x0c; //設(shè)定0.5ms中斷1次
- //TR0=1; //計(jì)數(shù)開(kāi)始
- speedlevel=50;//設(shè)定初始步進(jìn)電機(jī)轉(zhuǎn)速等階為5
- while(1)
- { gewei=1;
- shiwei=1;
- shuru=1;
- shuru1=1; //關(guān)閉LED數(shù)碼管顯示
- if(ZZ==0) //如果電機(jī)正轉(zhuǎn)按鍵按下
- { delay(2); //去抖動(dòng)
- if(ZZ==0)
- { L1=0;
- L2=0 ;
- L3=0; //控制正轉(zhuǎn)LED燈亮
- keycan=1; //鍵值等于1
- }
- }
- if(FZ==0) //如果電機(jī)反轉(zhuǎn)按鍵按下
- { delay(2); //去抖動(dòng)
- if(FZ==0)
- { L1=0;
- L2=0;
- L3=1; //控制反轉(zhuǎn)LED燈亮
- keycan=2; //鍵值等于2
- }
- }
- if(TZ==0)
- { delay(2); //去抖動(dòng)
- { L1=0;
- L2=1;
- L3=0; //控制停止LED燈亮
- keycan=3;
- }
- }
- switch (keycan)
- {
- case 1: motor_zhengzhuan(); //鍵值等于1 正轉(zhuǎn)
- break;
- case 2: motor_fanzhuan(); //鍵值等于2 反轉(zhuǎn)
- break;
- }
- if(K1==0) // 電機(jī)加速
- { delay(2); //去抖動(dòng)
- if(K1==0)
- { L1=0;
- L2=1;
- L3=1; //控制加速LED燈亮
- speedlevel-=5;
- if(speedlevel<=0)
- { speedlevel=1;//表示當(dāng)參數(shù)降到0時(shí),電機(jī)以speedlevel=1作為最大速度工作
- }
- }
- }
- if(K2==0) // 電機(jī)減速
- { delay(2); //去抖動(dòng)
- if(K2==0)
- { L1=1;
- L2=0;
- L3=0; //控制減速LED燈亮
- speedlevel+=5;
- if(speedlevel>=100)
- { speedlevel=99;//表示當(dāng)參數(shù)降到0時(shí),電機(jī)以speedlevel=99作為最小速度工作
- }
- }
- }
- xianshi(); //調(diào)用顯示程序
- }
- }
復(fù)制代碼
|
|