2.步進電機控制系統設計 第一個按鍵,速度等級增加,有多個速度等級,速度等級顯示在LCD上 第二個按鍵,速度等級減小
步進電機240.zip
(89.03 KB, 下載次數: 80)
2016-6-29 14:41 上傳
點擊文件名下載附件
步進電機系統開發 下載積分: 黑幣 -5
第三個按鍵,電機停止 第四個按鍵,電機啟動
0.png (17.22 KB, 下載次數: 104)
下載附件
2016-6-29 15:07 上傳
- #include <REGX51.H>
- #include "def.h"
- #include "lcd1602.h"
-
- void MotorStop(void); //聲明函數
- void qx (u16 ii);
- void zt (void);
- sbit k1=P3^2; // 運行與停止
- sbit k2=P2^1; // 方向轉換
- sbit k3=P2^2; // 速度調整
- sbit k4=P2^3; // 設定圈數
- u8 code ffw[4] ={0x01,0x02,0x04,0x08}; // 正轉
- u8 code rev[4] ={0x08,0x04,0x02,0x01}; // 反轉
- u16 snum=156; //預設角度
- u16 rate=101; //預設速率
- u16 ii; //角度顯示
- u16 ia=100; //報警值
- void Delay_xms(u8 x)//ms延時函數
- {
- u8 i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- bit on_off=1; // 運行與停止標志
- bit direction=1; //方向標志
- void to(void) //外部中斷
- {
- IT0=1;
- EX0=1;
- EA=1;
- }
- void bao (void) //、、、、、、、、、、、、、、、、、、、、、、、、報警 、、、、、、、、、、、、、、、、、、、、、、、、
- {
- if((ii==ia)|(on_off==1))
- {
- ii=snum;
- if(on_off==1)
- {
- zt();
- }
- else
- {
- qx(ia);
- display_lcd(0x19,0x21);
- }
- on_off=1;
- MotorStop();
- }
- }
- void clockwise(u16 rate) //順時針轉動
- {
- u8 i;
- for(i=0;i<4;i++)
- {
- P1=ffw[i];
- Delay_xms(rate);//轉速調節
- }
- }
- //停止轉動
- void MotorStop(void)
- {
- P1=0xff;
- }
- void anticlockwise (u16 rate) //逆時針轉動
- {
- u8 i;
- for(i=0;i<4;i++)
- {
- P1=rev[i];
- Delay_xms(rate);//轉速調節
- }
- }
- void key (void) //按鍵判斷
- {
- if (k2 == 0)
- {
- delay(10);
- if (k2 == 0)
- {
- direction=~direction; // 方向標志;
- }
- while (!k2);
- }
- if(on_off==1)
- {
- if (k3 == 0)
- {
- delay(10);
- if (k3 == 0)
- {
- while (!k3)
- {
- if(direction==1)
- {
- Delay_xms(100);
- if(rate<255)
- {
- rate++;
- }
- }
- else
- {
- Delay_xms(100);
- if(rate>10)
- {
- rate--;
- }
- }
- }
- }
- }
- if (k4 == 0)
- {
- delay(10);
- if (k4 == 0)
- {
- while (!k4)
- {
- if(direction==1)
- {
- Delay_xms(100);
- if(snum<255)
- {
- snum++;
- }
- }
- else
- {
- Delay_xms(100);
- if(snum>10)
- {
- snum--;
- }
- }
- }
- }
- }
- }
- }
- void zt (void) //狀態顯示
- {
- u8 a,b,c,d,e,f;
- if(on_off==0)
- {
- display_lcd(0,'n');
- }
- else
- {
- display_lcd(0,'f');
- }
- if(direction==1)
- {
- display_lcd(1,0x7e);
- }
- else
- {
- display_lcd(1,0x7f);
- }
- a=snum/100;
- b=(snum-100*a)/10;
- c=(snum-100*a-b*10)%10;
- d=rate/100;
- e=(rate-100*d)/10;
- f=(rate-100*d-e*10)%10;
- display_lcd(0x10,a+'0');
- display_lcd(0x11,b+'0');
- display_lcd(0x12,c+'0');
- display_lcd(0x15,d+'0');
- display_lcd(0x16,e+'0');
- display_lcd(0x17,f+'0');
- }
- void qx (u16 ii)
- {
- u8 a,b,c;
- a=ii/100;
- b=(ii-100*a)/10;
- c=(ii-100*a-b*10)%10;
- display_lcd(0x10,a+'0');
- display_lcd(0x11,b+'0');
- display_lcd(0x12,c+'0');
- }
- void quan (void) //圈數
- {
- if(on_off==0)
- {
- if(direction==1)
- {
- for(ii=0;ii<snum;ii++)
- {
- clockwise (rate);
- bao();
- if(on_off==0)
- {
- qx(ii);
- }
- }
- }
- else
- {
- for(ii=0;ii<snum;ii++)
- {
- anticlockwise(rate);
- bao();
- if(on_off==0)
- {
- qx(ii);
- }
- }
- }
- }
- }
- void main (void)
- {
- to();
- lcd_init();
- zt();
- while(1)
- {
- key();
- quan();
- }
- }
- void exint0() interrupt 0
- {
- if (k1 == 0)
- {
- delay(10);
- if (k1 == 0)
- {
- on_off=~on_off; // 運行與停止標志;
- }
- while (!k1);
- }
- }
復制代碼
|