包含程序和仿真
功能:按鍵或串口發送字符指令,控制步進電機正轉、反轉、停止、加速、減速動作
仿真過程可直接通過按下電腦鍵盤控制
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
圖片4.png (19.45 KB, 下載次數: 95)
下載附件
2017-8-11 08:36 上傳
圖片3.png (19.54 KB, 下載次數: 85)
下載附件
2017-8-11 08:36 上傳
圖片2.png (19.24 KB, 下載次數: 93)
下載附件
2017-8-11 08:36 上傳
圖片1.png (19.63 KB, 下載次數: 100)
下載附件
2017-8-11 08:36 上傳
0.png (46.42 KB, 下載次數: 84)
下載附件
2017-8-11 17:26 上傳
單片機源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- //------8拍-----
- uchar code zz[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正轉
- uchar code fz[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //反轉
- sbit K1=P3^0; //停止
- sbit K2=P3^1; //正轉
- sbit K3=P3^2; //反轉
- sbit K4=P3^3; //加速
- sbit K5=P3^4; //減速
- uchar state=0; //狀態變量
- uint Time=60; //延時時間,用于調速
- unsigned char receiveData='0';
- void UsartConfiguration(); //初始化串口
- void delay(uint ms) //延時,用于調速
- {
- uint t;
- while(ms--)
- for(t=0;t<120;t++);
- }
- void motor_zz() //正傳函數
- {
- uint j;
- for(j=0;j<8;j++)
- {
- if(P3==0xfb)
- break;
- P1=zz[j];
- delay(Time);
- }
- }
- void motor_fz() //反轉函數
- {
- uint j;
- for(j=0;j<8;j++)
- {
- if(P3==0xfb)
- break;
- P1=fz[j];
- delay(Time);
- }
- }
- void main()
- {
- UsartConfiguration();
- while(1)
- {
- while(state==0) //狀態0,停止
- {
- if((K2==0)||(receiveData=='z')) //按下K2或串口接收到'z',電機正轉
- {
- state=1;
- receiveData='0';
- break;
- }
- if((K3==0)||(receiveData=='f')) //按下K3或串口接收到'f',電機反轉
- {
- state=2;
- receiveData='0';
- break;
- }
- P0=0xfb;
- P1=0x03;
- }
-
- while(state==1) //狀態1,正轉
- {
- if((K1==0)||(receiveData=='t')) //按下K1或串口接收到'f',電機反轉
- {
- state=0;
- receiveData='0';
- break;
- }
- if((K2==0)||(receiveData=='z')) //按下K2或串口接收到'z',電機正轉
- {
- state=1;
- receiveData='0';
- break;
- }
- if((K3==0)||(receiveData=='f')) //按下K3或串口接收到'f',電機反轉
- {
- state=2;
- receiveData='0';
- break;
- }
- if((K4==0)||(receiveData=='+')) //按下K4或串口接收到'+',電機加速
- {
- Time=Time-5;
- if(Time<20)
- Time=20;
- while(K4==0);
- }
- if((K5==0)||(receiveData=='-')) //按下K5或串口接收到'-',電機減速
- {
- Time=Time+5;
- if(Time>100)
- Time=100;
- while(K5==0);
- }
- motor_zz(); //狀態1,正轉
- }
- while(state==2) //狀態2,反轉
- {
- if((K1==0)||(receiveData=='t')) //按下K1或串口接收到'f',電機反轉
- {
- state=0;
- receiveData='0';
- break;
- }
- if((K2==0)||(receiveData=='z')) //按下K2或串口接收到'z',電機正轉
- {
- state=1;
- receiveData='0';
- break;
- }
- if((K3==0)||(receiveData=='f')) //按下K3或串口接收到'f',電機反轉
- {
- state=2;
- receiveData='0';
- break;
- }
- if((K4==0)||(receiveData=='+')) //按下K4或串口接收到'+',電機加速
- {
- Time=Time-5;
- if(Time<20)
- Time=20;
- while(K4==0);
- }
- if((K5==0)||(receiveData=='-')) //按下K5或串口接收到'-',電機減速
- {
- Time=Time+5;
- if(Time>100)
- Time=100;
- while(K5==0);
- }
- motor_fz(); //狀態2,反轉
- }
- }
- }
- /************************************************************************
- * 函數名 :UsartConfiguration()
- * 函數功能 :設置串口
- * 輸入 : 無
- * 輸出 : 無
- *************************************************************************/
- void UsartConfiguration()
- {
- SCON=0X50; //設置為工作方式1
- //TMOD=0X20; //設置計數器工作方式2
- TMOD=0X21; //設置計數器工作方式2 和定時器0
- PCON=0X80; //波特率加倍
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
按鍵&串口控制步進電機正反轉調速.zip
(163.03 KB, 下載次數: 644)
2017-8-11 08:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|