單片機源程序如下:
- /***********************************************************************************
- * 標題: 步進電機+上位機 控制正反轉和加減速 *
- * *
- * 通過本例程了解步進馬達使用及驅(qū)動程序編寫 *
- *; 單雙八拍工作方式: *
- *; A-AB-B-BC-C-CD-D-DA *
- * * *
- **************************************************************************************/
- //接線方法:請你一定要看,步進電機杜邦線接方法 步進電機模塊上“-”接到開發(fā)板上的GND “+接VCC
- //IN1~IN4 分別接到P1.0~P1.3”
-
- #include "reg52.h"
- #include <string.h>
- void delay(unsigned int t);
- //Motor
- sbit F1 = P1^0;
- sbit F2 = P1^1;
- sbit F3 = P1^2;
- sbit F4 = P1^3;
- unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反轉
- unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正轉
- unsigned char g_Speed = 10; //最慢,1為最快
- unsigned char g_State = 0; //0: 停止, 1為正轉,2為反轉
- /*協(xié)議定義*/
- bit startBit = 0; //串口接收開始標志位
- bit newLineReceived = 0; //串口一幀協(xié)議包接收完成
- unsigned char inputString[50]; //接收數(shù)據(jù)協(xié)議
- /**********************************************************************
- * *
- * 步進電機驅(qū)動 *
- * *
- ***********************************************************************/
- void motor_ffw()
- {
- unsigned char i;
- unsigned int j;
- for (j=0; j<64; j++)
- {
- for (i=0; i<8; i++)
- {
- if(g_State==1) P1 = FFW[i]&0x1f; //取數(shù)據(jù)
- if(g_State==2) P1 = FFZ[i]&0x1f;
- delay(g_Speed); //調(diào)節(jié)轉速
- }
- }
- }
- /******************************************************
- *
- * 延時程序
- *
- ********************************************************/
- void delay(unsigned int t)
- {
- unsigned int k;
- while(t--)
- {
- for(k=0; k<80; k++)
- { }
- }
- }
- //串口初始化
- void ComInit(void)
- {
-
- SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收
- TMOD |= 0x20;
- TH1=0xfd; //波特率9600 初值
- TL1=0xfd;
- TR1= 1;
- EA = 1; //開總中斷
- ES= 1; //打開串口中斷
- }
- //串口發(fā)送函數(shù)
- /*void PutString(unsigned char *TXStr)
- {
- ES=0;
- while(*TXStr!=0)
- {
- SBUF=*TXStr;
- while(TI==0);
- TI=0;
- TXStr++;
- }
- ES=1;
- }*/
- void Protocol(void)
- {
- while (newLineReceived) //協(xié)議數(shù)據(jù)接收完畢一包
- {
- //判斷是否是51的協(xié)議
- if(inputString[1] != '5' || inputString[2] != '1')
- {
- newLineReceived = 0;
- memset(inputString, 0x00, sizeof(inputString));
- break;
- }
- //判斷是否是Step motor的協(xié)議數(shù)據(jù)
- if(inputString[4] != 'S' && inputString[5] != 'M' && inputString[6] != 'T')
- {
- newLineReceived = 0;
- memset(inputString, 0x00, sizeof(inputString));
- break;
- }
- if(inputString[8] == '1') //加速
- {
- g_Speed--;
- if(g_Speed == 0)
- g_Speed = 1;
-
- }
- else if(inputString[8] == '2') //減速
- {
- g_Speed++;
- if(g_Speed > 10)
- g_Speed = 10;
-
- }
-
- //讀取功能執(zhí)行
- if(inputString[7] == '0') //停止
- {
- g_State = 0;
- newLineReceived = 0;
- memset(inputString, 0x00, sizeof(inputString));
- break;
- }
- else if(inputString[7] == '1') //順轉
- {
- g_State = 1;
- newLineReceived = 0;
- memset(inputString, 0x00, sizeof(inputString));
- break;
- }
- else if(inputString[7] == '2') //逆轉
- {
- g_State = 2;
- newLineReceived = 0;
- memset(inputString, 0x00, sizeof(inputString));
- break;
- }
-
- newLineReceived = 0;
- memset(inputString, 0x00, sizeof(inputString));
- }
- }
- void main()
- {
- ComInit();
- P1 = 0xff;
- while(1)
- {
-
- if(g_State != 0 )
- {
- motor_ffw();
- }
- }
- }
- /******************************************************************/
- /* 串口中斷程序*/
- /******************************************************************/
- void UART_SER () interrupt 4
- {
- unsigned char n; //定義臨時變量
- static int num = 0;
- if(RI) //判斷是接收中斷產(chǎn)生
- {
- RI = 0; //標志位清零
- n = SBUF; //讀入緩沖區(qū)的值
- //control=n;
- if(n ==
- )
- {
- startBit = 1;
- num = 0;
- }
- if(startBit == 1)
- {
- inputString[num] = n;
- num++;
- }
- if (n == '#')
- {
- newLineReceived = 1;
- startBit = 0;
- Protocol();
- }
-
- if(num >= 50)
- {
- num = 0;
- startBit = 0;
- newLineReceived = 0;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
程序 步進電機.zip
(45.43 KB, 下載次數(shù): 33)
2018-6-11 16:43 上傳
點擊文件名下載附件
所有資料51hei提供下載: 下載積分: 黑幣 -5
|