|
設計包含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;//消隱
- }
- }
復制代碼
|
-
捕獲2.PNG
(98.38 KB, 下載次數: 46)
下載附件
2020-8-7 12:31 上傳
-
捕獲1.PNG
(106.26 KB, 下載次數: 37)
下載附件
2020-8-7 12:29 上傳
-
-
stepmotor.rar
2020-8-7 12:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
33.92 KB, 下載次數: 34, 下載積分: 黑幣 -5
|