|
關(guān)于51單片機按鍵與串口控制步進電機正反轉(zhuǎn)調(diào)速的編程語言
單片機源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- //------8拍-----
- uchar code zz[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正轉(zhuǎn)
- uchar code fz[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //反轉(zhuǎn)
- sbit K1=P3^0; //停止
- sbit K2=P3^1; //正轉(zhuǎn)
- sbit K3=P3^2; //反轉(zhuǎn)
- sbit K4=P3^3; //加速
- sbit K5=P3^4; //減速
- uchar state=0; //狀態(tài)變量
- uint Time=60; //延時時間,用于調(diào)速
- unsigned char receiveData='0';
- void UsartConfiguration(); //初始化串口
- void delay(uint ms) //延時,用于調(diào)速
- {
- uint t;
- while(ms--)
- for(t=0;t<120;t++);
- }
- void motor_zz() //正傳函數(shù)
- {
- uint j;
- for(j=0;j<8;j++)
- {
- if(P3==0xfb)
- break;
- P1=zz[j];
- delay(Time);
- }
- }
- void motor_fz() //反轉(zhuǎn)函數(shù)
- {
- 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) //狀態(tài)0,停止
- {
- if((K2==0)||(receiveData=='z')) //按下K2或串口接收到'z',電機正轉(zhuǎn)
- {
- state=1;
- receiveData='0';
- break;
- }
- if((K3==0)||(receiveData=='f')) //按下K3或串口接收到'f',電機反轉(zhuǎn)
- {
- state=2;
- receiveData='0';
- break;
- }
- P0=0xfb;
- P1=0x03;
- }
-
- while(state==1) //狀態(tài)1,正轉(zhuǎn)
- {
- if((K1==0)||(receiveData=='t')) //按下K1或串口接收到'f',電機反轉(zhuǎn)
- {
- state=0;
- receiveData='0';
- break;
- }
- if((K2==0)||(receiveData=='z')) //按下K2或串口接收到'z',電機正轉(zhuǎn)
- {
- state=1;
- receiveData='0';
- break;
- }
- if((K3==0)||(receiveData=='f')) //按下K3或串口接收到'f',電機反轉(zhuǎn)
- {
- 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(); //狀態(tài)1,正轉(zhuǎn)
- }
- while(state==2) //狀態(tài)2,反轉(zhuǎn)
- {
- if((K1==0)||(receiveData=='t')) //按下K1或串口接收到'f',電機反轉(zhuǎn)
- {
- state=0;
- receiveData='0';
- break;
- }
- if((K2==0)||(receiveData=='z')) //按下K2或串口接收到'z',電機正轉(zhuǎn)
- {
- state=1;
- receiveData='0';
- break;
- }
- if((K3==0)||(receiveData=='f')) //按下K3或串口接收到'f',電機反轉(zhuǎn)
- {
- 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(); //狀態(tài)2,反轉(zhuǎn)
- }
- }
- }
- /************************************************************************
- * 函數(shù)名 :UsartConfiguration()
- * 函數(shù)功能 :設(shè)置串口
- * 輸入 : 無
- * 輸出 : 無
- *************************************************************************/
- void UsartConfiguration()
- {
- SCON=0X50; //設(shè)置為工作方式1
- //TMOD=0X20; //設(shè)置計數(shù)器工作方式2
- TMOD=0X21; //設(shè)置計數(shù)器工作方式2 和定時器0
- PCON=0X80; //波特率加倍
- //TH1=0XF4; //計數(shù)器初始值設(shè)置,注意波特率是4800的
- //TL1=0XF4;
- TH1=0XFA; //計數(shù)器初始值設(shè)置,注意波特率是9600的
- TL1=0XFA;
- ES=1; //打開接收中斷
- EA=1; //打開總中斷
- TR1=1; //打開計數(shù)器
- }
- void Usart() interrupt 4
- {
- receiveData=SBUF;//出去接收到的數(shù)據(jù)
- RI = 0;//清除接收中斷標(biāo)志位
- }
復(fù)制代碼
所有資料51hei提供下載:
51單片機按鍵與串口控制步進電機正反轉(zhuǎn)調(diào)速.zip
(1.5 KB, 下載次數(shù): 96)
2018-10-10 12:50 上傳
點擊文件名下載附件
|
|