網路城邦
上一篇 回創作列表 下一篇  字體:
LY-51S 步進馬達正反轉綜合控制
2012/12/23 18:34:49瀏覽783|回應0|推薦0

            近日在學習89C52之微處理機控制,使用的是LY-51S單機學習板,雖然該單機板既不提供繁體字版的說明書,而又不提供繁體字的燒錄程式,如使用英文版的燒錄程式又不提供89C52的晶片的設定,

            在範例87中的步進馬達綜合控制中,並未提供正反轉馬達的控制,所以在修改其中之程式,增加第5與6按鍵為正反轉控制,並同時增加第五位置顯示器來顯示正反轉之狀態.

            因為受限BLOG文字轉貼的字數限制,所以將其中未修改之副程式加以簡略,請閱讀者見諒.

以下是修改後之程式:

/*-----------------------------------------------

  名稱:步進馬達綜合控制

  編寫:PETER YANG

  日期:2012.12.23

  修改:增加正反轉控制按鍵與顯示

  內容:增加正轉控制鍵-KEY5與反轉控制鍵-KEY6,同時顯示正反轉於第五位置

 ------------------------------------------------*/

 

#include

 

#define KeyPort P3

#define DataPort P0     //定義資料埠

sbit LATCH1=P2^2;     //定義鎖存使能埠 段鎖存

sbit LATCH2=P2^3;     //定義鎖存使能埠 位鎖存

 

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9

unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼

unsigned char TempData[8]; //存儲顯示值的總體變數

 

sbit A1=P1^0; //定義步進馬達連接埠

sbit B1=P1^1;

sbit C1=P1^2;

sbit D1=P1^3;

 

 

#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通電,其他相斷電

#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通電,其他相斷電

#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通電,其他相斷電

#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通電,其他相斷電

#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通電,其他相斷電

#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通電,其他相斷電

#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通電,其他相斷電

#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通電,其他相斷電

#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部斷電

 

unsigned char Speed=1;

bit StopFlag;

bit FrFlag;       //新增正反轉旗號

void Display(unsigned char FirstBit,unsigned char Num);

void Init_Timer0(void);

unsigned char KeyScan(void);

 

(簡略uS延時函數與mS延時函數之兩者副程式)

/*------------------------------------------------

                    主函數

------------------------------------------------*/

main()

{

 unsigned int i=512;//旋轉一周時間

 unsigned char num;

 Init_Timer0();

 Coil_OFF

 while(1)  //正向

  {

   num=KeyScan();    //迴圈調用按鍵掃描

   if(num==1)        //第一個按鍵,速度等級增加

      {

       if(Speed<18) o:p="">

       Speed++;

      }

   else if(num==2)    //第二個按鍵,速度等級減小

      {

       if(Speed>1)

       Speed--;

      }

   else if(num==3)    //馬達停止

     {

      Coil_OFF

      StopFlag=1;

      }

   else if(num==4)    //馬達啓動

     {

      StopFlag=0;

      }

   else if(num==5)    //馬達正轉設定

     {

     Coil_OFF

      FrFlag=1;

      }

   else if(num==6)    //馬達反轉設定

     {

      Coil_OFF

      FrFlag=0;

      }

  //分解顯示資訊,如要顯示68,則68/10=6  68%10=8 

  TempData[0]=dofly_DuanMa[Speed/10];

  TempData[1]=dofly_DuanMa[Speed%10];

  TempData[4]=dofly_DuanMa[FrFlag];    //增加第5位數正反轉顯示,0表反轉,1表正轉

  }

}

(簡略顯示函數與計時器初始化之副程式) 

/*------------------------------------------------

                 計時器中斷副程式

------------------------------------------------*/

void Timer0_isr(void) interrupt 1

{

 static unsigned char times,i;

 TH0=(65536-1000)/256;         //重新賦值 1ms

 TL0=(65536-1000)%256;

 

 Display(0,8);

 if(!StopFlag)

   {

  if(times==(20-Speed))//最大值18,所以最小間隔值20-18=2

   {

   times=0;

  if(FrFlag)            //偵測正反轉旗號,FrFlag=1時為正轉

   {

   switch(i)

       {

       case 0:Coil_A1;i++;break;     //正轉

        case 1:Coil_B1;i++;break;

        case 2:Coil_C1;i++;break;

        case 3:Coil_D1;i++;break;

        case 4:i=0;break;

        default:break;

       }

    }

 

   if(!FrFlag)           //偵測正反轉旗號,FrFlag=0時為反轉

    {

       switch(i)

       {

       case 0:Coil_D1;i++;break;     //反轉

        case 1:Coil_C1;i++;break;

        case 2:Coil_B1;i++;break;

        case 3:Coil_A1;i++;break;

        case 4:i=0;break;

        default:break;

       }

    }

    }

 times++;

  }

}

(簡點按鍵掃描函數之副程式) 

( 興趣嗜好其他 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=PYANG&aid=7169753