步進(jìn)電機(jī)驅(qū)動(dòng)程序.doc
《步進(jìn)電機(jī)驅(qū)動(dòng)程序.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《步進(jìn)電機(jī)驅(qū)動(dòng)程序.doc(19頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
步進(jìn)電機(jī)驅(qū)動(dòng)程序 采用熱轉(zhuǎn)印制作 PCB ,電路采用2相推挽全橋驅(qū)動(dòng),單片機(jī)采用 STC54C12C5404 學(xué)生的設(shè)計(jì)要求:具體的模式如下:五種模式選擇 一:停止。 二:順時(shí)針轉(zhuǎn)2分鐘,停6分鐘,循環(huán); 三:逆時(shí)針轉(zhuǎn)2分鐘,停6分鐘,循環(huán); 四:順指針轉(zhuǎn)2分鐘停6分鐘,逆時(shí)針轉(zhuǎn)2分鐘停6分鐘,循環(huán); 五:順指針轉(zhuǎn)5分鐘,逆時(shí)針轉(zhuǎn)5分鐘持續(xù)3小時(shí),停9小時(shí),循環(huán)。 請(qǐng)將模式四和五放在首選。用數(shù)字碼顯示模式 步進(jìn)電機(jī)39BYG250 品牌: 北斗 型號(hào): 39BYG 技術(shù)參數(shù) 步距角: 1.8 電流: 0.4 A 電阻: 27 Ω 重量: 0.130 kg 驅(qū)動(dòng)電壓: 12 V 相電流: 0.4 A 相數(shù): 2 環(huán)境溫度: 130 ℃ 1代表程式1,2代表程式2。。。。。 1位數(shù)碼管,1個(gè)按鈕 8圈/分, 每圈要分4步跳 //2010.8.26 /************************************************** 具體的模式如下:五種模式選擇 0:停止。 1:順時(shí)針轉(zhuǎn)2分鐘,停6分鐘,循環(huán); 2:逆時(shí)針轉(zhuǎn)2分鐘,停6分鐘,循環(huán); 3:順指針轉(zhuǎn)2分鐘停6分鐘,逆時(shí)針轉(zhuǎn)2分鐘停6分鐘,循環(huán); 4:順指針轉(zhuǎn)5分鐘,逆時(shí)針轉(zhuǎn)5分鐘持續(xù)3小時(shí),停9小時(shí),循環(huán)。 模式四和五放在首選。用數(shù)字碼顯示模式 1代表程式1,2代表程式2。。。。。 1位數(shù)碼管,1個(gè)按鈕 8圈/分,68 每圈要分4步跳 ;***************************************************************/ #include "STC12C5410AD.H"http://頭文件 #include "intrins.h"http://頭文件 #define uchar unsigned char//宏定義 #define uint unsigned int//宏定義 #define DPDR P2//并行數(shù)據(jù)接口定義 sbit key=P3^2;//按鍵 sbit AB=P3^5; sbit CP=P3^3; //sbit HHH=P1^6; sbit CLL=P3^4; bit Forward_Inversion_bit;//正轉(zhuǎn),//反轉(zhuǎn),標(biāo)志 bit bit_bit; //1:正轉(zhuǎn) //0:反轉(zhuǎn) bit Start_Stop_bit;//啟動(dòng),停止,標(biāo)志 //1:?jiǎn)?dòng) //0:停止 //uchar count_2; uint counter_3; uchar counter_4; uchar Forward_Tolerance_Counter;//正轉(zhuǎn)容錯(cuò)記數(shù)器,保持步進(jìn)電機(jī)不跳步 uchar Inversion_Tolerance_Counter;//反轉(zhuǎn)容錯(cuò)記數(shù)器,保持步進(jìn)電機(jī)不跳步 uchar Mode_Selection;//模式選擇////數(shù)碼管顯示值 //0:停止。 //1:順時(shí)針轉(zhuǎn)2分鐘,停6分鐘,循環(huán); //2:逆時(shí)針轉(zhuǎn)2分鐘,停6分鐘,循環(huán); //3:順指針轉(zhuǎn)2分鐘停6分鐘,逆時(shí)針轉(zhuǎn)2分鐘停6分鐘,循環(huán); //4:順指針轉(zhuǎn)5分鐘,逆時(shí)針轉(zhuǎn)5分鐘持續(xù)3小時(shí),停9小時(shí),循環(huán)。 uchar Time_Counter_5;//時(shí)間計(jì)數(shù)器:200*5=1秒 uchar Time_Counter_60;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 uchar Time_Counter_x;//時(shí)間計(jì)數(shù)器:1分鐘*x=x分鐘 uchar Time_3_by_3;//時(shí)間計(jì)數(shù)器:3小時(shí)*3=9小時(shí) uchar Time_30_by_30;//時(shí)間計(jì)數(shù)器:3小時(shí)*3=9小時(shí) #define ISP_IAP_BYTE_READ 0x01//讀 #define ISP_IAP_BYTE_PROGRAM 0x02//編程 #define ISP_IAP_SECTOR_ERASE 0x03//扇區(qū)擦除 #define ENABLE_ISP 0x85//等待時(shí)間,和對(duì)ISP_CONTR設(shè)置初值 #define EEPROM_ADDRESS_1 0x2800//第一扇區(qū)地址 2800-29FF #define EEPROM_ADDRESS_2 0x2A00//第二扇區(qū)地址 2A00-2BFF #define EEPROM_ADDRESS_3 0x2A01//第二扇區(qū)地址 2A00-2BFF //#define EEPROM_ADDRESS_3 0x2C00//第三扇區(qū)地址 2C00-2DFF //#define EEPROM_ADDRESS_4 0x2E00//第四扇區(qū)地址 2E00-2FFF uchar DATA_H_ADDRESS;//單片機(jī)內(nèi)部 EEPROM 地址高字節(jié) uchar DATA_L_ADDRESS;//單片機(jī)內(nèi)部 EEPROM 地址低字節(jié) uint sfr_16;//雙字節(jié)緩存對(duì)單片機(jī)內(nèi)部 EEPROM 地址字節(jié)的處理 uchar code DispTab_Digital[]={0xa0,0xf3,0x34,0x32,0x63,0x2a,0x28,0xb3,0x20,0x22,0xff};//數(shù)碼管顯示 //0;1;2;3;4;5; ; uchar code DispTab_Inversion[]={0x60,0x09,0x12,0x84};//反轉(zhuǎn) //d=+,c=-; //b=+,a=-; //c=+,d=-; //a=+,b=-; /* uchar code DispTab_Forward[]={0xa3,0x3a,0xac,0xca};//正轉(zhuǎn) //a=-,b=+;1010 0011=0xa3 //c=-,d=+;0011 1010=0x3a //a=+,b=-;1010 1100=0xac //c=+,d=-;1000 1010=0xca*/ uchar code DispTab_Forward[]={0x84,0x12,0x09,0x60};//正轉(zhuǎn) //a=-,b=+;1010 0011=0xa3 //c=-,d=+;0011 1010=0x3a //a=+,b=-;1010 1100=0xac //c=+,d=-;1000 1010=0xca void delay(uint z)//延時(shí)為 1ms { uchar x,x1; for(;z>0;z--) { for(x=0;x<114;x++) { for(x1=0;x1<1;x1++); } } } void init() { P1M1=0xff;// 設(shè)為強(qiáng)上拉0101 0101 P2M1=0xff;// 設(shè)為強(qiáng)上拉0101 0101 DPDR=0xaa; TMOD=0x11; TH1=0x16;//10ms TL1=0xed;//10ms TH0=0x16;//200ms TL0=0xed;//200ms EA=1; ET1=1; TR1=0; CLL=1; AB=1; CP=1; ET0=1; TR0=1; PT0=1; WDT_CONTR=0x3d;//看門狗//0x3c=1.2S,,,0x3d=2.2S,,,0x3e=4.5S counter_3=0; counter_4=0; bit_bit=0; Forward_Tolerance_Counter=0; Inversion_Tolerance_Counter=0; Time_Counter_5=0;//時(shí)間計(jì)數(shù)器:200*5=1秒 Time_Counter_60=0;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 Time_Counter_x=0;//時(shí)間計(jì)數(shù)器:1分鐘*x=x分鐘 Time_3_by_3=0;//時(shí)間計(jì)數(shù)器:3小時(shí)*3=9小時(shí) } void Timer0(void) interrupt 1 { //static uchar WDT_CONTR_Counter; TH0=0x16;//200ms TL0=0xed;//200ms //WDT_CONTR_Counter++; //if(WDT_CONTR_Counter==9)//4S 喂一次狗, //{ //WDT_CONTR_Counter=0; //WDT_CONTR=0x3d;//看門狗 //} //////////////////////////////////////// //0:停止。 if(Mode_Selection==0) { Start_Stop_bit=0;//停止。 } //1:順時(shí)針轉(zhuǎn)2分鐘,停6分鐘,循環(huán). else if(Mode_Selection==1)//Forward_Inversion_bit;//正轉(zhuǎn),//反轉(zhuǎn) { if(Start_Stop_bit==1) { Time_Counter_5++;//時(shí)間計(jì)數(shù)器:200*5=1秒 if(Time_Counter_5==5) { Time_Counter_5=0; Time_Counter_60++;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 if(Time_Counter_60==59) { Time_Counter_60=0; Time_Counter_x++;//1分鐘*x=x分鐘 if(Time_Counter_x==2) { Time_Counter_x=0; Start_Stop_bit=0; Forward_Inversion_bit=1; } } } } else { Time_Counter_5++;//時(shí)間計(jì)數(shù)器:200*5=1秒 if(Time_Counter_5==5) { Time_Counter_5=0; Time_Counter_60++;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 if(Time_Counter_60==59) { Time_Counter_60=0; Time_Counter_x++;//1分鐘*x=x分鐘 if(Time_Counter_x==6) { Time_Counter_x=0; Start_Stop_bit=1; Forward_Inversion_bit=1; } } } } } //2:逆時(shí)針轉(zhuǎn)2分鐘,停6分鐘,循環(huán); else if(Mode_Selection==2)//Forward_Inversion_bit;//正轉(zhuǎn),//反轉(zhuǎn) { if(Start_Stop_bit==1) { Time_Counter_5++;//時(shí)間計(jì)數(shù)器:200*5=1秒 if(Time_Counter_5==5) { Time_Counter_5=0; Time_Counter_60++;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 if(Time_Counter_60==59) //60 { Time_Counter_60=0; Time_Counter_x++;//1分鐘*x=x分鐘 if(Time_Counter_x==2) //2 { Time_Counter_x=0; Start_Stop_bit=0; Forward_Inversion_bit=0; } } } } else { Time_Counter_5++;//時(shí)間計(jì)數(shù)器:200*5=1秒 if(Time_Counter_5==5) { Time_Counter_5=0; Time_Counter_60++;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 if(Time_Counter_60==59)//60 { Time_Counter_60=0; Time_Counter_x++;//1分鐘*x=x分鐘 if(Time_Counter_x==6)//6 { Time_Counter_x=0; Start_Stop_bit=1; Forward_Inversion_bit=0; } } } } } //3:順指針轉(zhuǎn)2分鐘停6分鐘,逆時(shí)針轉(zhuǎn)2分鐘停6分鐘,循環(huán); else if(Mode_Selection==3)//Forward_Inversion_bit;//正轉(zhuǎn),//反轉(zhuǎn) { if(Start_Stop_bit==1) { Time_Counter_5++;//時(shí)間計(jì)數(shù)器:200*5=1秒 if(Time_Counter_5==5) { Time_Counter_5=0; Time_Counter_60++;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 if(Time_Counter_60==59) { Time_Counter_60=0; Time_Counter_x++;//1分鐘*x=x分鐘 if(Time_Counter_x==2) { Time_Counter_x=0; Start_Stop_bit=0; Forward_Inversion_bit=~Forward_Inversion_bit; } } } } else { Time_Counter_5++;//時(shí)間計(jì)數(shù)器:200*5=1秒 if(Time_Counter_5==5) { Time_Counter_5=0; Time_Counter_60++;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 if(Time_Counter_60==59) { Time_Counter_60=0; Time_Counter_x++;//1分鐘*x=x分鐘 if(Time_Counter_x==6) { Time_Counter_x=0; Start_Stop_bit=1; } } } } } //4:順指針轉(zhuǎn)5分鐘,逆時(shí)針轉(zhuǎn)5分鐘持續(xù)3小時(shí),停9小時(shí),循環(huán)。 else if(Mode_Selection==4) { if(Start_Stop_bit==1) { Time_Counter_5++;//時(shí)間計(jì)數(shù)器:200*5=1秒 if(Time_Counter_5==5) { Start_Stop_bit=1; Time_Counter_5=0; Time_Counter_60++;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 if(Time_Counter_60==59) //60 { Time_Counter_60=0; Time_Counter_x++;//1分鐘*x=x分鐘 if(Time_Counter_x==5) //5分鐘 { Time_Counter_x=0; Forward_Inversion_bit=!Forward_Inversion_bit; Time_3_by_3++; if(Time_3_by_3==36) //36//3鐘 { Start_Stop_bit=0; Time_3_by_3=0; TH1=0x16;//200ms TL1=0xed;//200ms TR0=0; TR1=1; } } } } } } } void Timer1(void) interrupt 3 { //static uchar count; TH1=0x16;//200ms TL1=0xed;//200ms if(Mode_Selection==4) { if(Start_Stop_bit==0) { Time_Counter_5++;//時(shí)間計(jì)數(shù)器:200*5=1秒 if(Time_Counter_5==5) { Start_Stop_bit=0; Time_Counter_5=0; Time_Counter_60++;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 if(Time_Counter_60==59) //60 { Time_Counter_60=0; Time_Counter_x++;//1分鐘*x=x分鐘 if(Time_Counter_x==59) //60分鐘 { Time_Counter_x=0; Time_3_by_3++; if(Time_3_by_3==9) //9鐘 { Start_Stop_bit=1; Time_3_by_3=0; Forward_Inversion_bit=1; TH0=0x16;//200ms TL0=0xed;//200ms TR0=1; TR1=0; } } } } } } } void IAP_Disable()//關(guān)閉 IAP { ISP_CONTR=0; ISP_CMD=0; ISP_TRIG=0; } void Byte_read()//讀 { uint sfr_sfr; sfr_sfr=sfr_16; DATA_L_ADDRESS=sfr_sfr;//低地址字節(jié) sfr_sfr>>=8; DATA_H_ADDRESS=sfr_sfr;//高地址字節(jié) ISP_CONTR=ENABLE_ISP; ISP_CMD=ISP_IAP_BYTE_READ; ISP_ADDRH=DATA_H_ADDRESS; ISP_ADDRL=DATA_L_ADDRESS; //EA=0; ISP_TRIG=0x46; ISP_TRIG=0xb9; _nop_(); //EA=1; //ISP_DATA//讀出的數(shù)據(jù)在 ISP_DATA IAP_Disable(); } void Byte_program(uchar Byte_data)////編程//Byte_data為要保存的數(shù)據(jù) { uint sfr_sfr; sfr_sfr=sfr_16; DATA_L_ADDRESS=sfr_sfr;//低地址字節(jié) sfr_sfr>>=8; DATA_H_ADDRESS=sfr_sfr;//高地址字節(jié) ISP_CONTR=ENABLE_ISP; ISP_CMD=ISP_IAP_BYTE_PROGRAM; ISP_ADDRH=DATA_H_ADDRESS; ISP_ADDRL=DATA_L_ADDRESS; ISP_DATA=Byte_data; //EA=0; ISP_TRIG=0x46; ISP_TRIG=0xb9; _nop_(); //EA=1; // IAP_Disable(); } void Sector_Erase()//扇區(qū)擦除 { uint sfr_sfr; sfr_sfr=sfr_16; DATA_L_ADDRESS=sfr_sfr;//低地址字節(jié) sfr_sfr>>=8; DATA_H_ADDRESS=sfr_sfr;//高地址字節(jié) ISP_CONTR=ENABLE_ISP; ISP_CMD=ISP_IAP_SECTOR_ERASE; ISP_ADDRH=DATA_H_ADDRESS; ISP_ADDRL=DATA_L_ADDRESS; //EA=0; ISP_TRIG=0x46; ISP_TRIG=0xb9; _nop_(); //EA=1; //IAP_Disable();//關(guān)閉 IAP } void Digital_Tube()//數(shù)碼管顯示 { //uchar ii,temp,a; //P1=DispTab_Digital[2]; P1=DispTab_Digital[Mode_Selection]; //HHH=0; } void Key_Detection()//按鍵檢測(cè) { if(Mode_Selection>4) { Mode_Selection=0; } if(key==0) { delay(20); if(key==0) { Digital_Tube();//數(shù)碼管顯示 while(key==0); delay(20); if(Mode_Selection==0) { Mode_Selection=1; Start_Stop_bit=1; Forward_Inversion_bit=1; } else if(Mode_Selection==1) { Mode_Selection=2; Start_Stop_bit=1; Forward_Inversion_bit=0; } else if(Mode_Selection==2) { Mode_Selection=3; Start_Stop_bit=1; Forward_Inversion_bit=1; } else if(Mode_Selection==3) { Mode_Selection=4; Start_Stop_bit=1; Forward_Inversion_bit=1; } else if(Mode_Selection==4) { Mode_Selection=0; Start_Stop_bit=0; Forward_Inversion_bit=1; } else if(Mode_Selection==0) { Mode_Selection=1; //Start_Stop_bit=0; //Forward_Inversion_bit=1; } Time_Counter_5=0;//時(shí)間計(jì)數(shù)器:200*5=1秒 Time_Counter_60=0;//時(shí)間計(jì)數(shù)器:1秒*60=1分鐘 Time_Counter_x=0;//時(shí)間計(jì)數(shù)器:1分鐘*x=x分鐘 Time_3_by_3=0;//時(shí)間計(jì)數(shù)器:3小時(shí)*3=9小時(shí) counter_3=0; counter_4=0; bit_bit=0; sfr_16=EEPROM_ADDRESS_1; Sector_Erase();//扇區(qū)擦除 Byte_program(Mode_Selection);////編程 IAP_Disable(); Digital_Tube();//數(shù)碼管顯示 } } } void Database_Refresh()//刷新數(shù)據(jù)庫(kù) { sfr_16=EEPROM_ADDRESS_1; Byte_read();//讀 Mode_Selection=ISP_DATA; if(Mode_Selection>4) { Mode_Selection=0; } sfr_16=EEPROM_ADDRESS_2; Byte_read();//讀 Forward_Tolerance_Counter=ISP_DATA; sfr_16=EEPROM_ADDRESS_3; Byte_read();//讀 Inversion_Tolerance_Counter=ISP_DATA; if(Mode_Selection==0) { Start_Stop_bit=0; } if(Mode_Selection==2) { Start_Stop_bit=1; Forward_Inversion_bit=0; } if((Mode_Selection==1)||(Mode_Selection==1)) { Start_Stop_bit=1; Forward_Inversion_bit=1; } //if(Mode_Selection==3) //{ // Start_Stop_bit=1; // Forward_Inversion_bit=1; //} //else //{ // Start_Stop_bit=1; // Forward_Inversion_bit=1; //} } void main() { //uchar i; init();//單片機(jī)硬件資源初始化 Database_Refresh();//刷新數(shù)據(jù)庫(kù) Digital_Tube();//數(shù)碼管顯示 TR1=0; while(1) { Key_Detection();//按鍵檢測(cè) WDT_CONTR=0x3d;//看門狗 delay(27);//27 if(Start_Stop_bit==1)//啟動(dòng),停止,標(biāo)志 { if(Forward_Inversion_bit==1)//正轉(zhuǎn),//反轉(zhuǎn),標(biāo)志 { Forward_Tolerance_Counter++; if(Forward_Tolerance_Counter>3) { Forward_Tolerance_Counter=0; } DPDR=DispTab_Forward[Forward_Tolerance_Counter]; if(Forward_Tolerance_Counter==0) { Inversion_Tolerance_Counter=1; } if(Forward_Tolerance_Counter==1) { Inversion_Tolerance_Counter=0; } if(Forward_Tolerance_Counter==2) { Inversion_Tolerance_Counter=3; } if(Forward_Tolerance_Counter==3) { Inversion_Tolerance_Counter=2; } } else if(Forward_Inversion_bit==0)//反轉(zhuǎn) { Inversion_Tolerance_Counter++; if(Inversion_Tolerance_Counter>3) { Inversion_Tolerance_Counter=0; } DPDR=DispTab_Inversion[Inversion_Tolerance_Counter]; if(Inversion_Tolerance_Counter==0) { Forward_Tolerance_Counter=1; } if(Inversion_Tolerance_Counter==1) { Forward_Tolerance_Counter=0; } if(Inversion_Tolerance_Counter==2) { Forward_Tolerance_Counter=3; } if(Inversion_Tolerance_Counter==3) { Forward_Tolerance_Counter=2; } } sfr_16=EEPROM_ADDRESS_2; Sector_Erase();//扇區(qū)擦除 Byte_program(Forward_Tolerance_Counter);////編程 sfr_16=EEPROM_ADDRESS_3; Byte_program(Inversion_Tolerance_Counter);////編程 IAP_Disable(); if(bit_bit==0) { counter_3++; if(counter_3==50) { counter_3=0; Start_Stop_bit=0; bit_bit=1; } } } if(bit_bit==1) { counter_4++; if(counter_4==20) { counter_4=0; Start_Stop_bit=1; bit_bit=0; } } if(Start_Stop_bit==0)//啟動(dòng),停止,標(biāo)志 { DPDR=0xaa; } } }- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 步進(jìn) 電機(jī) 驅(qū)動(dòng)程序
鏈接地址:http://ioszen.com/p-9552222.html