28BYJ-48步進電機掌握程序是怎樣的

下面我們固然完成了用中綴掌握電機遷移轉變的程序,但實踐上這個程序照樣沒若干適用價值的,我們不克不及每次想讓它遷移轉變的時分都上下電啊,是吧。還有就是它不只能正轉還得能反轉啊,也就是說不只能轉過來,還得能轉回來呀。好吧,我們就來做一個實例程序吧,聯合第 8 章的按鍵程序,我們設計如許一個功用程序:按數字鍵 1~9,掌握電機轉過 1~9 圈;合營上下鍵改動遷移轉變偏向,按向上鍵后正向轉 1~9 圈,向下鍵則反向轉 1~9 圈;左鍵固定正轉 90 度,右鍵固定反轉 90;esc 鍵終止遷移轉變。經過這個程序,我們也可以進一步領會到若何用按鍵來掌握程序完成復雜的功用,以及掌握和履行模塊之間若何調和任務,而你的編程程度也可以在如許的理論演習中失掉錘煉和晉升。

			#include?<reg52.h>?sbit?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]?=?{?//矩陣按鍵編號到規范鍵盤鍵碼的映射表?{?0x31,?0x32,?0x33,?0x26?},?//數字鍵?1、數字鍵?2、數字鍵?3、向上鍵?{?0x34,?0x35,?0x36,?0x25?},?//數字鍵?4、數字鍵?5、數字鍵?6、向左鍵?{?0x37,?0x38,?0x39,?0x28?},?//數字鍵?7、數字鍵?8、數字鍵?9、向下鍵?{?0x30,?0x1B,?0x0D,?0x27?}?//數字鍵?0、ESC?鍵、?回車鍵、?向右鍵?};?unsigned?char?KeySta[4][4]?=?{?//全體矩陣按鍵的以后形態?{1,?1,?1,?1},?{1,?1,?1,?1},?{1,?1,?1,?1},?{1,?1,?1,?1}?};?signed?long?beats?=?0;?//電機遷移轉變節奏總數?void?KeyDriver();?void?main(){?EA?=?1;?//使能總中綴?TMOD?=?0x01;?//設置?T0?為形式?1?TH0?=?0xFC;?//為?T0?賦初值?0xFC67,準時?1ms?TL0?=?0x67;?ET0?=?1;?//使能?T0?中綴?TR0?=?1;?//啟動?T0?while?(1){?KeyDriver();?//挪用按鍵驅動函數?}?}?/*?步進電機啟動函數,angle-需轉過的角度?*/?void?StartMotor(signed?long?angle){?//在盤算前封閉中綴,完成后再翻開,以防止中綴打斷盤算進程而形成毛病?EA?=?0;?beats?=?(angle?*?4076)?/?360;?//實測為?4076?拍遷移轉變一圈?EA?=?1;?}?/*?步進電機中止函數?*/?void?StopMotor(){?EA?=?0;?beats?=?0;?EA?=?1;?}?/*?按鍵舉措函數,依據鍵碼履行響應的操作,keycode-按鍵鍵碼?*/?void?KeyAction(unsigned?char?keycode){?static?bit?dirMotor?=?0;?//電機遷移轉變偏向?//掌握電機遷移轉變?1-9?圈?if?((keycode&gt;=0x30)?&amp;&amp;?(keycode?0){?//節奏數大于?0?時正轉?index++;?//正轉時節奏輸入索引遞增?index?=?index?&amp;?0x07;?//用&amp;操作完成到?8?歸零?beats--;?//正轉時節奏計數遞加?}else{?//節奏數小于?0?時反轉?index--;?//反轉時節奏輸入索引遞加?index?=?index?&amp;?0x07;?//用&amp;操作異樣可以完成到-1?時歸?7?beats++;?//反轉時節奏計數遞增?}?tmp?=?P1;?//用?tmp?把?P1?口以后值暫存?tmp?=?tmp?&amp;?0xF0;?//用&amp;操作清零低?4?位?tmp?=?tmp?|?BeatCode[index];?//用|操作把節奏代碼寫到低?4?位?P1?=?tmp;?//把低?4?位的節奏代碼和高?4?位的原值送回?P1?}else{?//節奏數為?0?則封閉電機一切的相?P1?=?P1?|?0x0F;?}?}?/*?T0?中綴效勞函數,用于按鍵掃描與電機遷移轉變掌握?*/?void?interruptTimer0()?interrupt?1{?static?bit?div?=?0;?TH0?=?0xFC;?//從新加載初值?TL0?=?0x67;?KeyScan();?//履行按鍵掃描?//用一個靜態?bit?變量完成二分頻,即?2ms?準時,用于掌握電機?div?=?~div;?if?(div?==?1){?TurnMotor();?}?}</reg52.h>

這個程序是第 8 章和本章常識的一個綜合——用按鍵掌握步進電機遷移轉變。程序中有這么幾點值得留意,我們分述如下:

  • 針對電機要完成正轉和反轉兩個分歧的操作,我們并沒有運用正轉啟動函數和反轉啟動函數這么兩個函數來完成,也沒有在啟動函數界說的時分添加一個方式參數來指明其偏向。我們這里的啟動函數 void StartMotor(signed long angle)與單向正轉時的啟動函數獨一的差別就是把方式參數 angle 的類型從 unsigned long 改為了 signed long,我們用有符號數固有的正負特征來辨別正轉與反轉,負數表現正轉 angle 度,正數就表現反轉 angle 度,如許處置是不是很簡練又很清楚明了呢?而你對有符號數和無符號數的差別用法是不是也更有領會了?

  • 針對終止電機遷移轉變的操作,我們界說了一個獨自的 StopMotor 函數來完成,雖然這個函數十分復雜,雖然它也只在 Esc 按鍵分支內被挪用了,但我們依然把它獨自提出來作為了一個函數。而這種做法就是基于如許一條編程準繩:盡能夠用獨自的函數來完成硬件的某種操作,當一個硬件包括多個操作時,把這些操作函數組織在一同,構成一個對下層的一致接口。如許的條理化處置,會使得全部程序層次明晰,既有利于程序的調試保護,又有利于功用的擴大。

  • 中綴函數中要處置按鍵掃描和電機驅動兩件工作,而為了防止中綴函數過于復雜,我們就又分出了按鍵掃描和電機驅動兩個函數(這也異樣契合上述 2 的編程準繩),而中綴函數的邏輯就變得簡練而明晰了。這里還有個矛盾,就是按鍵掃描我們選擇的準時工夫是 1ms,而本章之前的實例中電機節奏繼續工夫多是 2ms;很顯然,用 1ms 的準時可以定出 2ms 的距離,而用 2ms 的準時卻得不到精確的 1ms 距離;所以我們的做法就是,準時器仍然準時 1ms,然后用一個 bit 變量做標記,每 1ms 改動一次它的值,而我們只選擇值為 1 的時分履行一次舉措,如許就是 2ms 的距離了;假如我要 3ms、4ms呢,把 bit 改為 char 或 int 型,然后對它們遞增,判別到哪個值該歸零,就可以了。這就是在硬件準時器的根底上完成精確的軟件準時。

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享