今天給大家介紹一下28BYJ-48步進(jìn)電機(jī)掌握程序是怎樣的。,文章的內(nèi)容小編覺(jué)得不錯(cuò),現(xiàn)在給大家分享一下,覺(jué)得有需要的朋友可以了解一下,希望對(duì)大家有所幫助,下面跟著小編的思路一起來(lái)閱讀吧。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、黎平網(wǎng)站維護(hù)、網(wǎng)站推廣。
下面我們固然完成了用中綴掌握電機(jī)遷移轉(zhuǎn)變的程序,但實(shí)踐上這個(gè)程序照樣沒(méi)若干適用價(jià)值的,我們不克不及每次想讓它遷移轉(zhuǎn)變的時(shí)分都上下電啊,是吧。還有就是它不只能正轉(zhuǎn)還得能反轉(zhuǎn)啊,也就是說(shuō)不只能轉(zhuǎn)過(guò)來(lái),還得能轉(zhuǎn)回來(lái)呀。好吧,我們就來(lái)做一個(gè)實(shí)例程序吧,聯(lián)合第 8 章的按鍵程序,我們?cè)O(shè)計(jì)如許一個(gè)功用程序:按數(shù)字鍵 1~9,掌握電機(jī)轉(zhuǎn)過(guò) 1~9 圈;合營(yíng)上下鍵改動(dòng)遷移轉(zhuǎn)變偏向,按向上鍵后正向轉(zhuǎn) 1~9 圈,向下鍵則反向轉(zhuǎn) 1~9 圈;左鍵固定正轉(zhuǎn) 90 度,右鍵固定反轉(zhuǎn) 90;Esc 鍵終止遷移轉(zhuǎn)變。經(jīng)過(guò)這個(gè)程序,我們也可以進(jìn)一步領(lǐng)會(huì)到若何用按鍵來(lái)掌握程序完成復(fù)雜的功用,以及掌握和履行模塊之間若何調(diào)和任務(wù),而你的編程程度也可以在如許的理論演習(xí)中失掉錘煉和晉升。
#includesbit KEY_IN_1 = P2^4; sbit KEY_IN_2 = P2^5; sbit KEY_IN_3 = P2^6; sbit KEY_IN_4 = P2^7; sbit KEY_OUT_1 = P2^3; sbit KEY_OUT_2 = P2^2; sbit KEY_OUT_3 = P2^1; sbit KEY_OUT_4 = P2^0; unsigned char code KeyCodeMap[4][4] = { //矩陣按鍵編號(hào)到規(guī)范鍵盤鍵碼的映射表 { 0x31, 0x32, 0x33, 0x26 }, //數(shù)字鍵 1、數(shù)字鍵 2、數(shù)字鍵 3、向上鍵 { 0x34, 0x35, 0x36, 0x25 }, //數(shù)字鍵 4、數(shù)字鍵 5、數(shù)字鍵 6、向左鍵 { 0x37, 0x38, 0x39, 0x28 }, //數(shù)字鍵 7、數(shù)字鍵 8、數(shù)字鍵 9、向下鍵 { 0x30, 0x1B, 0x0D, 0x27 } //數(shù)字鍵 0、ESC 鍵、 回車鍵、 向右鍵 }; unsigned char KeySta[4][4] = { //全體矩陣按鍵的以后形態(tài) {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1} }; signed long beats = 0; //電機(jī)遷移轉(zhuǎn)變節(jié)奏總數(shù) void KeyDriver(); void main(){ EA = 1; //使能總中綴 TMOD = 0x01; //設(shè)置 T0 為形式 1 TH0 = 0xFC; //為 T0 賦初值 0xFC67,準(zhǔn)時(shí) 1ms TL0 = 0x67; ET0 = 1; //使能 T0 中綴 TR0 = 1; //啟動(dòng) T0 while (1){ KeyDriver(); //挪用按鍵驅(qū)動(dòng)函數(shù) } } /* 步進(jìn)電機(jī)啟動(dòng)函數(shù),angle-需轉(zhuǎn)過(guò)的角度 */ void StartMotor(signed long angle){ //在盤算前封閉中綴,完成后再翻開(kāi),以防止中綴打斷盤算進(jìn)程而形成毛病 EA = 0; beats = (angle * 4076) / 360; //實(shí)測(cè)為 4076 拍遷移轉(zhuǎn)變一圈 EA = 1; } /* 步進(jìn)電機(jī)中止函數(shù) */ void StopMotor(){ EA = 0; beats = 0; EA = 1; } /* 按鍵舉措函數(shù),依據(jù)鍵碼履行響應(yīng)的操作,keycode-按鍵鍵碼 */ void KeyAction(unsigned char keycode){ static bit dirMotor = 0; //電機(jī)遷移轉(zhuǎn)變偏向 //掌握電機(jī)遷移轉(zhuǎn)變 1-9 圈 if ((keycode>=0x30) && (keycode<=0x39)){ if (dirMotor == 0){ StartMotor(360*(keycode-0x30)); }else{ StartMotor(-360*(keycode-0x30)); } }else if (keycode == 0x26){ //向上鍵,掌握遷移轉(zhuǎn)變偏向?yàn)檎D(zhuǎn) dirMotor = 0; }else if (keycode == 0x28){ //向下鍵,掌握遷移轉(zhuǎn)變偏向?yàn)榉崔D(zhuǎn) dirMotor = 1; }else if (keycode == 0x25){ //向左鍵,固定正轉(zhuǎn) 90 度 StartMotor(90); }else if (keycode == 0x27){ //向右鍵,固定反轉(zhuǎn) 90 度 StartMotor(-90); }else if (keycode == 0x1B){ //Esc 鍵,中止遷移轉(zhuǎn)變 StopMotor(); } } /* 按鍵驅(qū)動(dòng)函數(shù),檢測(cè)按鍵舉措,調(diào)劑響應(yīng)舉措函數(shù),需在主輪回中挪用 */ void KeyDriver(){ unsigned char i, j; static unsigned char backup[4][4] = { //按鍵值備份,保管前一次的值 {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1} }; for (i=0; i<4; i++){ //輪回檢測(cè) 4*4 的矩陣按鍵 for (j=0; j<4; j++){ if (backup[i][j] != KeySta[i][j]){ //檢測(cè)按鍵舉措 if (backup[i][j] != 0){ //按鍵按下時(shí)履行舉措 KeyAction(KeyCodeMap[i][j]); //挪用按鍵舉措函數(shù) } backup[i][j] = KeySta[i][j]; //刷新前一次的備份值 } } } } /* 按鍵掃描函數(shù),需在準(zhǔn)時(shí)中綴中挪用,引薦挪用距離 1ms */ void KeyScan(){ unsigned char i; static unsigned char keyout = 0; //矩陣按鍵掃描輸入索引 static unsigned char keybuf[4][4] = { //矩陣按鍵掃描緩沖區(qū) {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF} }; //將一行的 4 個(gè)按鍵值移入緩沖區(qū) keybuf[keyout][0] = (keybuf[keyout][0] << 1) | KEY_IN_1; keybuf[keyout][1] = (keybuf[keyout][1] << 1) | KEY_IN_2; keybuf[keyout][2] = (keybuf[keyout][2] << 1) | KEY_IN_3; keybuf[keyout][3] = (keybuf[keyout][3] << 1) | KEY_IN_4; //消抖后更新按鍵形態(tài) for (i=0; i<4; i++){ //每行 4 個(gè)按鍵,所以輪回 4 次 if ((keybuf[keyout][i] & 0x0F) == 0x00){ //延續(xù) 4 次掃描值為 0,即 4*4ms 內(nèi)多是按下形態(tài)時(shí),可以為按鍵已波動(dòng)的按下 KeySta[keyout][i] = 0; }else if ((keybuf[keyout][i] & 0x0F) == 0x0F){ //延續(xù) 4 次掃描值為 1,即 4*4ms 內(nèi)多是彈起形態(tài)時(shí),可以為按鍵已波動(dòng)的彈起 KeySta[keyout][i] = 1; } } //履行下一次的掃描輸入 keyout++; //輸入索引遞增 keyout = keyout & 0x03; //索引值加到 4 即歸零 //依據(jù)索引,釋放以后輸入引腳,拉低下次的輸入引腳 switch (keyout){ case 0: KEY_OUT_4 = 1; KEY_OUT_1 = 0; break; case 1: KEY_OUT_1 = 1; KEY_OUT_2 = 0; break; case 2: KEY_OUT_2 = 1; KEY_OUT_3 = 0; break; case 3: KEY_OUT_3 = 1; KEY_OUT_4 = 0; break; default: break; } } /* 電機(jī)遷移轉(zhuǎn)變掌握函數(shù) */ void TurnMotor(){ unsigned char tmp; //暫時(shí)變量 static unsigned char index = 0; //節(jié)奏輸入索引 unsigned char code BeatCode[8] = { //步進(jìn)電機(jī)節(jié)奏對(duì)應(yīng)的 IO 掌握代碼 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 }; if (beats != 0){ //節(jié)奏數(shù)不為 0 則發(fā)生一個(gè)驅(qū)動(dòng)節(jié)奏 if (beats > 0){ //節(jié)奏數(shù)大于 0 時(shí)正轉(zhuǎn) index++; //正轉(zhuǎn)時(shí)節(jié)奏輸入索引遞增 index = index & 0x07; //用&操作完成到 8 歸零 beats--; //正轉(zhuǎn)時(shí)節(jié)奏計(jì)數(shù)遞加 }else{ //節(jié)奏數(shù)小于 0 時(shí)反轉(zhuǎn) index--; //反轉(zhuǎn)時(shí)節(jié)奏輸入索引遞加 index = index & 0x07; //用&操作異樣可以完成到-1 時(shí)歸 7 beats++; //反轉(zhuǎn)時(shí)節(jié)奏計(jì)數(shù)遞增 } tmp = P1; //用 tmp 把 P1 口以后值暫存 tmp = tmp & 0xF0; //用&操作清零低 4 位 tmp = tmp | BeatCode[index]; //用|操作把節(jié)奏代碼寫到低 4 位 P1 = tmp; //把低 4 位的節(jié)奏代碼和高 4 位的原值送回 P1 }else{ //節(jié)奏數(shù)為 0 則封閉電機(jī)一切的相 P1 = P1 | 0x0F; } } /* T0 中綴效勞函數(shù),用于按鍵掃描與電機(jī)遷移轉(zhuǎn)變掌握 */ void InterruptTimer0() interrupt 1{ static bit div = 0; TH0 = 0xFC; //從新加載初值 TL0 = 0x67; KeyScan(); //履行按鍵掃描 //用一個(gè)靜態(tài) bit 變量完成二分頻,即 2ms 準(zhǔn)時(shí),用于掌握電機(jī) div = ~div; if (div == 1){ TurnMotor(); } }
這個(gè)程序是第 8 章和本章常識(shí)的一個(gè)綜合——用按鍵掌握步進(jìn)電機(jī)遷移轉(zhuǎn)變。程序中有這么幾點(diǎn)值得留意,我們分述如下:
針對(duì)電機(jī)要完成正轉(zhuǎn)和反轉(zhuǎn)兩個(gè)分歧的操作,我們并沒(méi)有運(yùn)用正轉(zhuǎn)啟動(dòng)函數(shù)和反轉(zhuǎn)啟動(dòng)函數(shù)這么兩個(gè)函數(shù)來(lái)完成,也沒(méi)有在啟動(dòng)函數(shù)界說(shuō)的時(shí)分添加一個(gè)方式參數(shù)來(lái)指明其偏向。我們這里的啟動(dòng)函數(shù) void StartMotor(signed long angle)與單向正轉(zhuǎn)時(shí)的啟動(dòng)函數(shù)獨(dú)一的差別就是把方式參數(shù) angle 的類型從 unsigned long 改為了 signed long,我們用有符號(hào)數(shù)固有的正負(fù)特征來(lái)辨別正轉(zhuǎn)與反轉(zhuǎn),負(fù)數(shù)表現(xiàn)正轉(zhuǎn) angle 度,正數(shù)就表現(xiàn)反轉(zhuǎn) angle 度,如許處置是不是很簡(jiǎn)練又很清楚明了呢?而你對(duì)有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的差別用法是不是也更有領(lǐng)會(huì)了?
針對(duì)終止電機(jī)遷移轉(zhuǎn)變的操作,我們界說(shuō)了一個(gè)獨(dú)自的 StopMotor 函數(shù)來(lái)完成,雖然這個(gè)函數(shù)十分復(fù)雜,雖然它也只在 Esc 按鍵分支內(nèi)被挪用了,但我們依然把它獨(dú)自提出來(lái)作為了一個(gè)函數(shù)。而這種做法就是基于如許一條編程準(zhǔn)繩:盡能夠用獨(dú)自的函數(shù)來(lái)完成硬件的某種操作,當(dāng)一個(gè)硬件包括多個(gè)操作時(shí),把這些操作函數(shù)組織在一同,構(gòu)成一個(gè)對(duì)下層的一致接口。如許的條理化處置,會(huì)使得全部程序?qū)哟蚊魑?,既有利于程序的調(diào)試保護(hù),又有利于功用的擴(kuò)大。
中綴函數(shù)中要處置按鍵掃描和電機(jī)驅(qū)動(dòng)兩件工作,而為了防止中綴函數(shù)過(guò)于復(fù)雜,我們就又分出了按鍵掃描和電機(jī)驅(qū)動(dòng)兩個(gè)函數(shù)(這也異樣契合上述 2 的編程準(zhǔn)繩),而中綴函數(shù)的邏輯就變得簡(jiǎn)練而明晰了。這里還有個(gè)矛盾,就是按鍵掃描我們選擇的準(zhǔn)時(shí)工夫是 1ms,而本章之前的實(shí)例中電機(jī)節(jié)奏繼續(xù)工夫多是 2ms;很顯然,用 1ms 的準(zhǔn)時(shí)可以定出 2ms 的距離,而用 2ms 的準(zhǔn)時(shí)卻得不到精確的 1ms 距離;所以我們的做法就是,準(zhǔn)時(shí)器仍然準(zhǔn)時(shí) 1ms,然后用一個(gè) bit 變量做標(biāo)記,每 1ms 改動(dòng)一次它的值,而我們只選擇值為 1 的時(shí)分履行一次舉措,如許就是 2ms 的距離了;假如我要 3ms、4ms呢,把 bit 改為 char 或 int 型,然后對(duì)它們遞增,判別到哪個(gè)值該歸零,就可以了。這就是在硬件準(zhǔn)時(shí)器的根底上完成精確的軟件準(zhǔn)時(shí)。
以上就是28BYJ-48步進(jìn)電機(jī)掌握程序是怎樣的的全部?jī)?nèi)容了,更多與28BYJ-48步進(jìn)電機(jī)掌握程序是怎樣的相關(guān)的內(nèi)容可以搜索創(chuàng)新互聯(lián)之前的文章或者瀏覽下面的文章進(jìn)行學(xué)習(xí)哈!相信小編會(huì)給大家增添更多知識(shí),希望大家能夠支持一下創(chuàng)新互聯(lián)!