當前位置:首頁 > 單片機 > 單片機
[導讀]上面我們雖然完成了用中斷控制電機轉動的程序,但實際上這個程序還是沒多少實用價值的,我們不能每次想讓它轉動的時候都上下電啊,是吧。還有就是它不但能正轉還得能反轉啊,也就是說不但能轉過去,還得能轉回來呀。

上面我們雖然完成了用中斷控制電機轉動的程序,但實際上這個程序還是沒多少實用價值的,我們不能每次想讓它轉動的時候都上下電啊,是吧。還有就是它不但能正轉還得能反轉啊,也就是說不但能轉過去,還得能轉回來呀。好吧,我們就來做一個實例程序吧,結合第8章的按鍵程序,我們設計這樣一個功能程序:按數(shù)字鍵1~9,控制電機轉過1~9圈;配合上下鍵改變轉動方向,按向上鍵后正向轉1~9圈,向下鍵則反向轉1~9圈;左鍵固定正轉90度,右鍵固定反轉90;Esc 鍵終止轉動。通過這個程序,我們也可以進一步體會到如何用按鍵來控制程序完成復雜的功能,以及控制和執(zhí)行模塊之間如何協(xié)調工作,而你的編程水平也可以在這樣的實踐練習中得到鍛煉和提升。

#includesbitKEY_IN_1=P2^4;sbitKEY_IN_2=P2^5;sbitKEY_IN_3=P2^6;sbitKEY_IN_4=P2^7;sbitKEY_OUT_1=P2^3;sbitKEY_OUT_2=P2^2;sbitKEY_OUT_3=P2^1;sbitKEY_OUT_4=P2^0;unsignedcharcodeKeyCodeMap[4][4]={//矩陣按鍵編號到標準鍵盤鍵碼的映射表{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鍵、回車鍵、向右鍵};unsignedcharKeySta[4][4]={//全部矩陣按鍵的當前狀態(tài){1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};signedlongbeats=0;//電機轉動節(jié)拍總數(shù)voidKeyDriver();voidmain(){EA=1;//使能總中斷TMOD=0x01;//設置T0為模式1TH0=0xFC;//為T0賦初值0xFC67,定時1msTL0=0x67;ET0=1;//使能T0中斷TR0=1;//啟動T0while(1){KeyDriver();//調用按鍵驅動函數(shù)}}/*步進電機啟動函數(shù),angle-需轉過的角度 */void StartMotor(signed long angle){    //在計算前關閉中斷,完成后再打開,以避免中斷打斷計算過程而造成錯誤    EA = 0;    beats = (angle * 4076) / 360; //實測為4076拍轉動一圈    EA = 1;}/* 步進電機停止函數(shù) */void StopMotor(){    EA = 0;    beats = 0;    EA = 1;}/* 按鍵動作函數(shù),根據(jù)鍵碼執(zhí)行相應的操作,keycode-按鍵鍵碼 */void KeyAction(unsigned char keycode){    static bit dirMotor = 0; //電機轉動方向    //控制電機轉動 1-9 圈    if ((keycode>=0x30) && (keycode<=0x39)){        if (dirMotor == 0){            StartMotor(360*(keycode-0x30));        }else{            StartMotor(-360*(keycode-0x30));        }    }else if (keycode == 0x26){ //向上鍵,控制轉動方向為正轉        dirMotor = 0;    }else if (keycode == 0x28){ //向下鍵,控制轉動方向為反轉        dirMotor = 1;    }else if (keycode == 0x25){ //向左鍵,固定正轉90度        StartMotor(90);    }else if (keycode == 0x27){ //向右鍵,固定反轉90度        StartMotor(-90);    }else if (keycode == 0x1B){ //Esc 鍵,停止轉動        StopMotor();    }}/* 按鍵驅動函數(shù),檢測按鍵動作,調度相應動作函數(shù),需在主循環(huán)中調用 */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++){ //循環(huán)檢測4*4的矩陣按鍵        for (j=0; j<4; j++){            if (backup[i][j] != KeySta[i][j]){ //檢測按鍵動作                if (backup[i][j] != 0){ //按鍵按下時執(zhí)行動作                    KeyAction(KeyCodeMap[i][j]); //調用按鍵動作函數(shù)                }                backup[i][j] = KeySta[i][j]; //刷新前一次的備份值            }        }    }}/* 按鍵掃描函數(shù),需在定時中斷中調用,推薦調用間隔 1 ms */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個按鍵值移入緩沖區(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個按鍵,所以循環(huán)4次        if ((keybuf[keyout][i] & 0x0F) == 0x00){            //連續(xù)4次掃描值為0,即 4*4 ms 內都是按下狀態(tài)時,可認為按鍵已穩(wěn)定的按下            KeySta[keyout][i] = 0;        }else if ((keybuf[keyout][i] & 0x0F) == 0x0F){            //連續(xù)4次掃描值為1,即 4*4 ms 內都是彈起狀態(tài)時,可認為按鍵已穩(wěn)定的彈起            KeySta[keyout][i] = 1;        }    }    //執(zhí)行下一次的掃描輸出    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;    }}/* 電機轉動控制函數(shù) */void TurnMotor(){    unsigned char tmp; //臨時變量    static unsigned char index = 0; //節(jié)拍輸出索引    unsigned char code BeatCode[8] = { //步進電機節(jié)拍對應的 IO 控制代碼        0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6    };    if (beats != 0){ //節(jié)拍數(shù)不為0則產生一個驅動節(jié)拍        if (beats > 0){ //節(jié)拍數(shù)大于0時正轉            index++; //正轉時節(jié)拍輸出索引遞增            index = index & 0x07; //用&操作實現(xiàn)到8歸零            beats--; //正轉時節(jié)拍計數(shù)遞減            }else{ //節(jié)拍數(shù)小于0時反轉            index--; //反轉時節(jié)拍輸出索引遞減            index = index & 0x07; //用&操作同樣可以實現(xiàn)到-1時歸7            beats++; //反轉時節(jié)拍計數(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則關閉電機所有的相        P1 = P1 | 0x0F;    }}/* T0 中斷服務函數(shù),用于按鍵掃描與電機轉動控制 */void InterruptTimer0() interrupt 1{    static bit div = 0;    TH0 = 0xFC; //重新加載初值    TL0 = 0x67;    KeyScan(); //執(zhí)行按鍵掃描    //用一個靜態(tài) bit 變量實現(xiàn)二分頻,即 2 ms 定時,用于控制電機    div = ~div;    if (div == 1){        TurnMotor();    }}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉