字體:小 中 大 | |
|
|
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++; } } (簡點按鍵掃描函數之副程式) |
|
( 興趣嗜好|其他 ) |