超級規(guī)范,詳細(xì)的注釋代碼,可以參考學(xué)習(xí)一下
本步進(jìn)電機正反轉(zhuǎn)調(diào)速系統(tǒng)控制設(shè)計課題實際開發(fā)采用的軟件名稱和版本如下 (如果出現(xiàn)程序打開異常或文件打開不太對,請先檢查軟件版本) Keil uVision5(keilc51-v9.54),Proteus 8.3 SP1,Altium Designer 14,LabVIEW2014,office2013,VSPD,stc-isp-15xx-v6.85I.exe 1、單片機是通用的無論51還是52、無論STC還是AT都一樣,引腳功能都一樣。程序也是一樣的。 2、原理圖,請用Altium Designer 14軟件打開,我已幫您轉(zhuǎn)換成word格式和pdf格式的了。 3、本店提供的USB轉(zhuǎn)串口線芯片是PL2303HX(部分帶上位機寶貝提供),請在電腦上安裝驅(qū)動PL2303_Prolific_DriverInstaller_v1_12_0,方可正常使用 4、可以按照正面布局,盡量不要按照實物的背面焊接,很容易看錯,建議參考本店提供的實物圖片布局參考,都是優(yōu)化之后的布局,省時省力。要按照原理圖焊接,不要按照仿真圖焊接,因為仿真只是模擬一個現(xiàn)象。 5、焊接之前一定要提前閱讀 制作實物詳解(含焊接) 文件夾里的焊接技巧和器件說明,可大大提高焊接的成功率。
8、關(guān)于本套設(shè)計使用說明請看視頻:
步進(jìn)電機正反轉(zhuǎn)調(diào)速系統(tǒng)的仿真原理圖:
步進(jìn)電機正反轉(zhuǎn)調(diào)速系統(tǒng)源程序:
- //-----------------------------------------------------------------
- // 名稱:步進(jìn)電機(28BYJ-48)程序
- //-----------------------------------------------------------------
- //---1~9檔的轉(zhuǎn)速------------------------------------------------
- //DEE4 定時時間 8.476ms , 轉(zhuǎn)速 1.73r/min
- //E1EC 定時時間 7.7ms , 轉(zhuǎn)速 1.90r/min
- //E5D4 定時時間 6.7ms, 轉(zhuǎn)速 2.19r/min
- //E9BC 定時時間 5.7ms, 轉(zhuǎn)速 2.57r/min
- //EDA4 定時時間 4.7ms, 轉(zhuǎn)速 3.12r/min
- //F18C 定時時間 3.7ms, 轉(zhuǎn)速 3.96r/min
- //F574 定時時間 2.7ms, 轉(zhuǎn)速 5.43r/min
- //F95C 定時時間 1.7ms, 轉(zhuǎn)速 8.62r/min
- //FC18 定時時間 1ms , 轉(zhuǎn)速 14.65r/min
- //-----------------------------------------------------------------
- //轉(zhuǎn)一圈需要節(jié)拍數(shù):360/(5.625/64) = 4096 個節(jié)拍
- //轉(zhuǎn)速r/min = (60*1000) / (4096 * 定時時間)
- //-----------------------------------------------------------------
- #include "Key.h"
- //0~9 的共陽數(shù)碼管段碼,最后一個是黑屏
- const uchar SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
- //輸出勵磁序列的頻率參數(shù){TH1,TL1}
- const uchar Timer[9][2]={{0xDE,0xE4},{0xE1,0xEC},{0xE5,0xD4},{0xE9,0xBC}, //8.476 ~ 1ms
- {0xEd,0xA4},{0xF1,0x8C},{0xF5,0x74},{0xF9,0x5C},{0xFC,0x18}};
- //步進(jìn)電機正轉(zhuǎn)的勵磁序列
- const uchar FFW[] = {0x1F,0x3F,0x2F,0x6F,0x4F,0xCF,0x8F,0x9F}; //DCBAXXXX
- //步進(jìn)電機反轉(zhuǎn)的勵磁序列
- const uchar REV[] = {0x9F,0x8F,0xCF,0x4F,0x6F,0x2F,0x3F,0x1F}; //DCBAXXXX
- //枚舉變量--正反轉(zhuǎn)標(biāo)志
- typedef enum
- {FwdRun, RevRun} RunFlag;
- RunFlag flag1 = FwdRun;
- uchar speed = 0;
- //函數(shù)聲明
- void T0_Init(); //定時器0初始化函數(shù)聲明
- void T1_Init(); //定時器1初始化函數(shù)聲明
- void KeyService(); //按鍵服務(wù)函數(shù)聲明
- void delay_ms(uint t); //毫秒延時函數(shù)聲明
-
- //-----------------------------------------------------------------
- // 主程序
- //-----------------------------------------------------------------
- void main()
- {
- T0_Init(); //定時器0初始化
- T1_Init(); //定時器1初始化
- FWD_LED = 0; //正轉(zhuǎn)指示燈亮,默認(rèn)初始化是正轉(zhuǎn)
-
- delay_ms(500); //延時500ms,待各個模塊上電穩(wěn)定
- EA = 1; //開啟中斷
- while(1)
- {
- KeyService(); //按鍵服務(wù)程序
- }
- }
- //-----------------------------------------------------------------
- // Timer0 初始化,模式1,允許中斷,1ms定時
- // Timer0 用于按鍵掃描
- //-----------------------------------------------------------------
- void T0_Init()
- {
- TMOD &= 0xF0;
- TMOD |= 0x01; //T0工作于模式1,16位定時器
- TH0 = (65536 - 1000) >> 8; //1ms定時
- TL0 = (65536 - 1000) & 0xFF;
- ET0 = 1; //允許T0中斷
- TR0 = 1; //啟動T0
- }
- //-----------------------------------------------------------------
- // Timer1 初始化,模式1,允許中斷
- // Timer1 用于改變步進(jìn)電機轉(zhuǎn)速
- //-----------------------------------------------------------------
- void T1_Init()
- {
- TMOD &= 0x0F;
- TMOD |= 0x10; //定時器1工作于模式1,16位定時器
- TH1 = Timer[speed][0];
- TL1 = Timer[speed][1]; //定時器1,定時用于步進(jìn)電機轉(zhuǎn)速控制
- ET1 = 1; //允許T1中斷
- PT1 = 1; //定時器1優(yōu)先級高
- TR1 = 0; //關(guān)閉定時器1
- }
- //-----------------------------------------------------------------
- // Timer0 中斷服務(wù)程序
- //-----------------------------------------------------------------
- void InterruptTime0() interrupt 1
- {
- TH0 = (65536 - 1000) >> 8; //1ms
- TL0 = (65536 - 1000) & 0xFF;
- KeyScan(); //按鍵掃描
- }
- //-----------------------------------------------------------------
- // Timer1 中斷服務(wù)程序
- //-----------------------------------------------------------------
- void InterruptTime1() interrupt 3
- {
- static step1 = 0;
- static step2 = 0;
- TH1 = Timer[speed - 1][0]; //根據(jù)不同的轉(zhuǎn)速檔位,給定時器1賦定時器值
- TL1 = Timer[speed - 1][1];
-
- //按照定時器1的頻率循環(huán)發(fā)送正轉(zhuǎn)勵磁序列的脈沖給步進(jìn)電機,使其不停地轉(zhuǎn)動
- if(flag1 == FwdRun)//正轉(zhuǎn)
- {
- MotorDriver = FFW[step1++];
- if(step1 == 8) step1 = 0;
- }
-
- //按照定時器1的頻率循環(huán)發(fā)送反轉(zhuǎn)勵磁序列的脈沖給步進(jìn)電機,使其不停地轉(zhuǎn)動
- else if(flag1 == RevRun)
- {
- MotorDriver = REV[step2++];
- if(step2 == 8) step2 = 0;
- }
- }
- //-----------------------------------------------------------------
- // 按鍵服務(wù)程序
- //-----------------------------------------------------------------
- void KeyService()
- {
- switch (KeyCode)
- {
- case 1: flag1 = FwdRun; //正轉(zhuǎn)
- FWD_LED = 0; REV_LED = 1; //正轉(zhuǎn)指示燈亮
- KeyCode = 0;
- break;
- case 2: flag1 = RevRun; //反轉(zhuǎn)
- FWD_LED = 1; REV_LED = 0; //反轉(zhuǎn)指示燈亮
- KeyCode = 0;
- break;
- case 3: speed++; //速度加
- if(speed == 10) speed = 1;
- SpeedShow = SEG_CODE[speed];
- if(TR1 == 0) TR1 = 1;
- KeyCode = 0;
- break;
- case 4: speed--; //速度減
- if(speed == 0 || speed == -1 ) speed = 9;
- SpeedShow = SEG_CODE[speed];
- if(TR1 == 0) TR1 = 1;
- KeyCode = 0;
- break;
- case 5: TR1 = 0; //停止
- SpeedShow = 0xFF;
- MotorDriver = 0x00;
- KeyCode = 0;
- break;
- default: ;
- }
- }
- //-----------------------------------------------------------------
- //函數(shù)名稱: void delay_ms(uint t)
- //函數(shù)功能: 延時ms程序(粗略)
- //調(diào)用子函數(shù): 無
- //輸入?yún)?shù): t
- //返回值: 無
- //-----------------------------------------------------------------
- void delay_ms(uint t)
- {
- uchar i; while(t--) for(i = 0; i < 125; i++);
- }
復(fù)制代碼
- //-----------------------------------------------------------------
- // 名稱:按鍵處理程序(獨立鍵盤)
- //-----------------------------------------------------------------
- #include "Key.h"
- uchar KeyCode = 0; //按鍵編碼值
- //共5個獨立機械按鍵,通過短按實現(xiàn)5種按鍵編碼值
- uint KeyTimeCnt[5] = {0,0,0,0,0}; //按鍵去抖動延時計數(shù)器,分別對應(yīng)KEY1/2/3/4/5
- uchar KeyLock[5] = {0,0,0,0,0}; //按鍵觸發(fā)后自鎖的變量標(biāo)志,分別對應(yīng)KEY1/2/3/4/5
- //-----------------------------------------------------------------
- //函數(shù)名稱: void KeyScan()
- //函數(shù)功能: 按鍵掃描程序,放在定時中斷里,可較快實現(xiàn)按鍵響應(yīng)
- //調(diào)用子函數(shù): 無
- //輸入?yún)?shù): 無
- //返回值: 無,說明:返回的按鍵編碼值保存在KeyCode變量里
- //-----------------------------------------------------------------
- void KeyScan()
- {
- //------KEY1實現(xiàn)-------------------------------------------------
- if(KEY1 == 1) //IO是高電平,說明按鍵沒有被按下,這時要及時清零一些標(biāo)志位
- { KeyLock[0] = 0; //按鍵自鎖變量標(biāo)志清零
- KeyTimeCnt[0] = 0; //按鍵去抖動延時計數(shù)器清零
- }
- else if(KeyLock[0] == 0)
- {
- KeyTimeCnt[0]++;
- if(KeyTimeCnt[0] > KEY_TIME_SHORT)
- {
- KeyTimeCnt[0] = 0;
- KeyLock[0] = 1; //自鎖按鍵置位,避免一直觸發(fā)
- KeyCode = 1;
- }
- }
-
- //------KEY2實現(xiàn)-----------------------------------
- if(KEY2 == 1)
- { KeyLock[1] = 0;
- KeyTimeCnt[1] = 0;
- }
- else if(KeyLock[1] == 0)
- {
- KeyTimeCnt[1]++;
- if(KeyTimeCnt[1] > KEY_TIME_SHORT) //消抖
- {
- KeyTimeCnt[1] = 0; //按鍵去抖動延時計數(shù)器清零
- KeyLock[1] = 1; //自鎖按鍵置位,避免一直觸發(fā)
- KeyCode = 2;
- }
- }
- //------KEY3實現(xiàn)-----------------------------------
- if(KEY3 == 1)
- { KeyLock[2] = 0;
- KeyTimeCnt[2] = 0;
- }
- else if(KeyLock[2] == 0)
- {
- KeyTimeCnt[2]++;
- if(KeyTimeCnt[2] > KEY_TIME_SHORT)
- {
- KeyTimeCnt[2] = 0;
- KeyLock[2] = 1;
- KeyCode = 3;
- }
- }
- //------KEY4實現(xiàn)-----------------------------------
- if(KEY4 == 1)
- { KeyLock[3] = 0;
- KeyTimeCnt[3] = 0;
- }
- else if(KeyLock[3] == 0)
- {
- KeyTimeCnt[3]++;
- if(KeyTimeCnt[3] > KEY_TIME_SHORT)
- {
- KeyTimeCnt[3] = 0;
- KeyLock[3] = 1;
- KeyCode = 4;
- }
- }
-
- //------KEY5實現(xiàn)-----------------------------------
- if(KEY5 == 1)
- { KeyLock[4] = 0;
- KeyTimeCnt[4] = 0;
- }
- else if(KeyLock[4] == 0)
- {
- KeyTimeCnt[4]++;
- if(KeyTimeCnt[4] > KEY_TIME_SHORT)
- {
- KeyTimeCnt[4] = 0;
- KeyLock[4] = 1;
- KeyCode = 5;
- }
- }
- }
復(fù)制代碼 程序有些問題 無法轉(zhuǎn)動:
步進(jìn)電機正反轉(zhuǎn)調(diào)速系統(tǒng)設(shè)計.7z
(3.73 MB, 下載次數(shù): 244)
2023-1-3 16:51 上傳
點擊文件名下載附件
|