您好,登錄后才能下訂單哦!
處理了精度成績,讓我們再次回到我們的電機掌握程序上吧。下面給出的兩個例程都不是適用的程序,為什么?由于程序中存在大段的延時,而在延時的時分是什么其它的事都干不了的,想想第二個程序,整整 200 秒什么其余事都干不了,這在實踐的掌握零碎中是相對不許可的。那么怎樣改革一下呢?當然照樣用準時中綴來完成了,既然每一個節奏繼續工夫是2ms,那我們直接用準時器準時 2ms 來刷新節奏就行了。改革后的程序如下:
#include <reg52.h> unsigned long beats = 0; //電機遷移轉變節奏總數 void StartMotor(unsigned long angle); void main(){ EA = 1; //使能總中綴 TMOD = 0x01; //設置 T0 為形式 1 TH0 = 0xF8; //為 T0 賦初值 0xF8CD,準時 2ms TL0 = 0xCD; ET0 = 1; //使能 T0 中綴 TR0 = 1; //啟動 T0 StartMotor(360*2+180); //掌握電機遷移轉變 2 圈半 while (1); } /* 步進電機啟動函數,angle-需轉過的角度 */ void StartMotor(unsigned long angle){ //在盤算前封閉中綴,完成后再翻開,以防止中綴打斷盤算進程而形成毛病 EA = 0; beats = (angle * 4076) / 360; //實測為 4076 拍遷移轉變一圈 EA = 1; } /* T0 中綴效勞函數,用于驅動步進電機扭轉 */ void InterruptTimer0() interrupt 1{ unsigned char tmp; //暫時變量 static unsigned char index = 0; //節奏輸入索引 unsigned char code BeatCode[8] = { //步進電機節奏對應的 IO 掌握代碼 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6 }; TH0 = 0xF8; //從新加載初值 TL0 = 0xCD; //節奏數不為 0 則發生一個驅動節奏 if (beats != 0){ tmp = P1; //用 tmp 把 P1 口以后值暫存 tmp = tmp & 0xF0; //用&操作清零低 4 位 //用|操作把節奏代碼寫到低 4 位 tmp = tmp | BeatCode[index]; //把低 4 位的節奏代碼和高 4 位的原值送回 P1 P1 = tmp; index++; //節奏輸入索引遞增 index = index & 0x07; //用&操作完成到 8 歸零 beats--; //總節奏數-1 }else{ //節奏數為 0 則封閉電機一切的相 P1 = P1 | 0x0F; } }
程序照樣比擬復雜的,電機遷移轉變的啟動函數 StartMotor 只擔任盤算一個需求的總節奏數beats,然后在中綴函數內檢測這個變量,不為 0 時就履行節奏操作,同時將其減 1,直到減到 0 為止。
這里,我們要特殊闡明一下的是 StartMotor 函數中對 EA 的兩次操作。我們可以看到對beats 的賦值盤算語句是夾在 EA=0;EA=1;這兩行語句兩頭的,也就是說這行賦值盤算語句在履行前先封閉了中綴,而等它履行完后,才又從新翻開了中綴。在它履行進程中單片機是不會呼應中綴的,即中綴函數 InterruptTimer0 不會被履行,即便這時分準時器溢出了,中綴發作了,也只能等候 EA 從新置 1 后,才干失掉呼應,中綴函數 InterruptTimer0 才會被履行。
那么為什么要這么做呢?我們來想一下:在本書開端我們就曾提到,我們所運用的STC89C52 單片機是 8 位單片機,這個 8 位的概念就是說單片機操作數據時多是按 8 位即按1 個字節停止的,那么要操作多個字節(不管是讀照樣寫)就必需分屢次停止了。而我們程序中界說的 beats 這個變量是 unsigned long 型,它要占用 4 個字節,那么對它的賦值起碼也要分 4 次才干完成了。我們想象一下,假設在完成了個中第一個字節的賦值后,恰恰中綴發作了,InterruptTimer0 函數失掉履行,而這個函數內能夠會對 beats 停止減 1 的操作,減法就有能夠發作借位,借位就會改動其它的字節,但由于此時其它的字節還沒有被賦入新值,于是毛病就會發作了,減 1 所失掉的后果就不是預期的值了!所以要防止這種毛病的發作就得先臨時封閉中綴,等賦值完成后再翻開中綴。而假如我們運用的是 char 或 bit 型變量的話,由于它們多是在 CPU 的一次操作中就完成的,所以即便不關中綴,也不會發作毛病。成績剖析清晰了,若何棄取還得依據實踐狀況來,趕上這類成績的時分多多思索思索吧。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。