欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 基于51單片機的步進電機控制系統(tǒng)設(shè)計 源程序 [打印本頁]

作者: Southerly    時間: 2022-3-8 15:15
標題: 基于51單片機的步進電機控制系統(tǒng)設(shè)計 源程序
[attach]291637[/attach]本設(shè)計介紹了一種基于51單片機的步進電機控制系統(tǒng),該設(shè)計采用STC89C51單片機為主控芯片,步進電機由ULN2003A驅(qū)動跟單片機相連接,LCD顯示屏實時顯示步進電機信息。步進電機采用八拍運行方式,由單片機發(fā)出脈沖信號控制步進電機的通電順序,從而達到控制步進電機運轉(zhuǎn)的目的。開啟后,通過矩陣鍵盤向單片機輸入脈沖控制信號,以此來實現(xiàn)步進電機的正反轉(zhuǎn)、加減速、角度設(shè)置,最終基本達到了預(yù)期目標。

利用單片機,實現(xiàn)用鍵盤控制步進電機的運轉(zhuǎn),包括設(shè)定步進電機運轉(zhuǎn)的角度,方向及速度,并顯示其信息。

主控模塊使用STC89C51單片機來作為控制芯片。

輸入模塊的選擇中,考慮到需要設(shè)置步進電機運轉(zhuǎn)角度和其他的功能以及單片機接口的限制,獨立鍵盤的按鍵數(shù)量不能滿足要求,所以本設(shè)計中采用4×4矩陣鍵盤;只需占用一個I/O口,就可以提供16個按鍵。

顯示模塊的選擇,有LED和LCD兩種顯示方式可供選擇,但考慮到需要顯示的內(nèi)容較多,LED顯示需要許多的LED數(shù)碼管;這樣會占用大量的控制芯片的資源使得顯示模塊的實現(xiàn)極為復(fù)雜。考慮到這些因素,本次設(shè)計中采用LCD的顯示方式,對比了幾款LCD顯示屏,最終選擇了LCD1602作為顯示模塊。LCD1602可以顯示16×2個字符,可以滿足設(shè)計需求。

驅(qū)動模塊的選擇,因控制芯片發(fā)出的控制信號過于微弱,無法直接驅(qū)動被控單元;所以必須在控制芯片與被控單元之間加入一個信號放大模塊,經(jīng)過幾種信號放大方式的對比,最終決定采用最為可靠的ULN2003A作為驅(qū)動模塊。ULN2003A具有很高的直流電流增益,可以很好的驅(qū)動步進電機。

被控單元的選擇,本設(shè)計采用了常見的28-BYJ-48步進電機。它是一款永磁式、減速型,四相八拍步進電機,有三種工作模式可供選擇。

經(jīng)過不斷的對比選擇,最終采用了以下方案完成設(shè)計;STC89C51單片機作為主控芯片,4×4矩陣鍵盤輸入步進電機控制信息,步進電機采用28-BYJ-48步進電機。因單片機無法直接驅(qū)動起電機,所以我們采用ULN2003A驅(qū)動芯片來驅(qū)動電機,步進電機的運行信息由最后由LCD1602液晶顯示屏顯示。

單片機最小系統(tǒng),也叫做單片機最小應(yīng)用系統(tǒng),是指用最少的原件組成單片機可以工作的系統(tǒng)。單片機最小系統(tǒng)的三要素就是電源、時鐘電路、復(fù)位電路,電源可使用外部穩(wěn)定的5V電源供電模塊供給。
復(fù)位電路分為按鍵復(fù)位和上電復(fù)位。上電復(fù)位通常在復(fù)位引腳RST上連接一個電容到VCC,再連接一個電阻到GND,由此形成一個RC充放電回路保證單片機在上電時RST腳上有足夠時間的高電平進行復(fù)位,在RST引腳上加兩個周期的高電平即可使單片機復(fù)位,隨后回歸到低電平進入正常工作狀態(tài),這個電阻和電容的典型值為10K和10uF。按鍵復(fù)位就是在復(fù)位電容上并聯(lián)一個開關(guān),當開關(guān)按下時電容被放電、RST也被拉到高電平,而且由于電容的充電,會保持一段時間的高電平來使單片機復(fù)位。
因單片機內(nèi)部帶有振蕩電路,所以外部只要連接一個晶振和兩個電容即可,電容容量一般在15pF至30pF之間。電容的作用是幫助晶振起振,并維持振蕩信號的穩(wěn)定。
3.1 單片機最小系統(tǒng)原理圖
LCD1602是一種工業(yè)字符型液晶,能夠同時顯示16x2即32個字符。LCD1602液晶顯示的原理是利用液晶的物理特性,通過電壓對其顯示區(qū)域進行控制,有電就有顯示,這樣即可以顯示出圖形。1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。
LCD1602主要參數(shù):顯示容量16×2個字符;芯片工作電4.5—5.5V;工作電流2.0mA,模塊最佳工作電壓5.0V。

與單片機的連接:D0-D7并行連接單片機的P0口,作為數(shù)據(jù)傳輸;RS,RW,E分別連接單片機P2.5,P2.6,P2.7。RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。

3.3  驅(qū)動模塊

ULN2003A是高耐壓、大電流復(fù)合晶體管陣列,由七個硅NPN 復(fù)合晶體管組成,每一對達林頓都串聯(lián)一個2.7K 的基極電阻,在5V 的工作電壓下它能與TTL 和CMOS 電路直接相連,可以直接處理原先需要標準邏輯緩沖器來處理的數(shù)據(jù)。ULN2003A 具有電流增益高、工作電壓高、溫度范圍寬、帶負載能力強等特點,適應(yīng)于各類要求高速大功率驅(qū)動的系統(tǒng)。
3.3 ULN2003A模塊圖
3.4  矩陣鍵盤原理及電路圖
矩陣鍵盤又稱行列鍵盤,如圖3.4所示,它是用四條I/O線作為行線,四條I/O線作為列線組成的鍵盤。在行線和列線的每個交叉點上設(shè)置一個按鍵。這樣鍵盤上按鍵的個數(shù)就為4×4個。使用矩陣鍵盤時我們用掃描法識別按鍵,按鍵按下時,與此鍵相連的行線與列線導(dǎo)通,行線在無按鍵按下時處在高電平。如果
所有的列線都處在高電平,則按鍵按下與否不會引起行線電平的變化,因此必須使所有列線處在電平。這樣當有按鍵按下時,該鍵所在的行電平才會由高變低,才能判斷相應(yīng)的行有鍵按下。
3.4 矩陣鍵盤
3-4矩陣鍵盤說明表
鍵號
功能
按鍵‘0-9’
對應(yīng)數(shù)字的輸入
按鍵‘開始’
設(shè)置完成按下啟動
按鍵‘清零’
輸錯可以用來歸零
按鍵‘方向’
設(shè)置步進電機的正反轉(zhuǎn)
按鍵‘加速’
加速運轉(zhuǎn)
按鍵‘減速’
減速運轉(zhuǎn)
     
4 系統(tǒng)軟件設(shè)計
4.1 系統(tǒng)軟件流程圖
系統(tǒng)軟件設(shè)計是本次系統(tǒng)設(shè)計的重要組成部分,基于硬件電路條件,整個程序細分為若干個功能模塊來完成,主要有顯示程序模塊、按鍵程序模塊、步進電機模塊。
STC89C51單片機的P1口用來連接矩陣鍵盤,P0口與P2口的P2^5、P2^6、P2^6連接LCD602、最后由P3口借助一個驅(qū)動芯片ULN2003與步進電機連接。單片機程序中的主函數(shù)完成對LCD1602顯示屏初始化之后,依次調(diào)用顯示函數(shù)、按鍵查詢函數(shù)、角度設(shè)置函數(shù)。主程序流程圖如圖4.1所示。
4.2  LCD1602顯示流程圖
本設(shè)計用LCD1602液晶屏作為顯示,主要是將步進電機的角度、速度、方向等信息在LCD1602上面顯示出來,以便于用戶操作。如圖4.2所示為液晶屏顯示控制子程序流程圖。


測試結(jié)果及其分析

在模擬仿真階段,本設(shè)計采用了kile與proteus聯(lián)合仿真調(diào)試,確保所寫程序可以實現(xiàn)本設(shè)計所需要的功能。經(jīng)過不斷的調(diào)試和仿真,在仿真環(huán)境下實現(xiàn)了預(yù)期的功能。隨后,利用開發(fā)板搭建了電路,經(jīng)過測試ULN2003模塊可以正常驅(qū)動電機;下載程序之后,矩陣鍵盤可以正常輸入控制信息,LCD1602液晶顯示正常,步進電機按輸入控制信息能夠正常運轉(zhuǎn)。但因步進電機減速比的影響,顯示角度與電機實際角度存在誤差。
本文設(shè)計了一種基于單片機的步進電機控制系統(tǒng),采用4×4矩陣鍵盤作為輸入,使用LCD1602顯示信息,如運轉(zhuǎn)的角度,方向及速度?赏ㄟ^鍵盤輸入讓步進電機運轉(zhuǎn)的角度,方向和運轉(zhuǎn)速度。采用了ULN2003驅(qū)動模塊,可以很好的驅(qū)動步進電機。實現(xiàn)了對步進電機較為精確的控制。

單片機源程序如下:
  1. #include<stdio.h>
  2. #include<reg51.h>
  3. #include<lcd1602.h>
  4. #define Motor P3
  5. void SetAngle(uint angle);
  6. uchar keyscan();
  7. uchar code Motortab[]={0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x01};
  8. uchar flag=2;
  9. uint T=5;  
  10. void main()
  11. {   
  12.         static int keyvalue=0;
  13.         static int num=0;        
  14.         Init();
  15.     printf("Angle=%5d",0);   
  16.         while(1)
  17.         {     
  18.                 keyvalue=keyscan();
  19.         if(keyvalue)        
  20.         {        
  21.                             if(keyvalue>=0&&keyvalue<=10)
  22.                             {                        
  23.                         if(keyvalue==10)
  24.                                             keyvalue=0;
  25.                                             num=num*10+keyvalue;
  26.                         SetRowCol(0,0);
  27.                                             printf("Angle=%5d%s",num,"  ");//角度輸入
  28.                             }
  29.                                 else if(keyvalue==15)
  30.                                 {
  31.                                    T--;
  32.                                    if(T<1)
  33.                                    T=10;
  34.                                    SetRowCol(1,6);
  35.                    printf("speed=%2d%s",T,"  ");
  36.                                    
  37.                                 }
  38.                                 else if(keyvalue==16)
  39.                                 {
  40.                                    T++;
  41.                                    if(T>10)
  42.                                    T=0;
  43.                                    SetRowCol(1,6);
  44.                    printf("speed=%2d%s",T,"  ");
  45.                                  
  46.                                 }
  47.                             else if(keyvalue==11)  //開始
  48.                             {           
  49.                    if(flag==0)
  50.                     {
  51.                         SetRowCol(1,0);
  52.                         printf("STRAT");
  53.                                         SetAngle(-(num)*11.5);
  54.                         SetRowCol(1,0);
  55.                         printf("END  ");
  56.                         SetRowCol(1,4);
  57.                         printf("NAngle=%d%s",-num,"    ");
  58.                                         num=0;
  59.                         SetRowCol(0,0);
  60.                         printf("Angle=%5d%s",num,"  ");
  61.                         flag=2;
  62.                     }
  63.                     else if(flag==1)
  64.                     {
  65.                        SetRowCol(1,0);
  66.                         printf("STRAT");
  67.                                         SetAngle(num*11.5);
  68.                         SetRowCol(1,0);
  69.                         printf("END  ");
  70.                         SetRowCol(1,4);
  71.                         printf("NAngle=%s%d%s"," ",num,"   ");
  72.                                         num=0;
  73.                         SetRowCol(0,0);
  74.                         printf("Angle=%5d%s",num,"  ");
  75.                         flag=2;
  76.                     }
  77.                     else
  78.                     {
  79.                         SetRowCol(0,0);
  80.                         printf("Angle=%5d%s",num,"  ");
  81.                         flag=2;                  
  82.                     }

  83.                             }                                   
  84.                             else if(keyvalue==12)   //輸入清零
  85.                             {
  86.                     num=0;
  87.                     SetRowCol(0,0);
  88.                     printf("Angle=%5d%s",num,"      ");
  89.                     SetRowCol(1,0);
  90.                     printf("                 ");        
  91.                 }
  92.                 else if(keyvalue==13)   //正反轉(zhuǎn)
  93.                 {
  94.                     flag=!flag;
  95.                     if(flag==0)
  96.                     {  
  97.                         SetRowCol(0,0);                 
  98.                         printf("Angle=%5d%s",num,"   FZ");
  99.                        
  100.                     }
  101.                     else if(flag==1)
  102.                     {
  103.                             SetRowCol(0,0);
  104.                             printf("Angle=%5d%s",num,"   ZZ");                  
  105.                     }
  106.                 }   
  107.                 else if(keyvalue==14)//點動
  108.                 {
  109.                     if(flag==0)
  110.                     {  
  111.                            num--;
  112.                            SetRowCol(0,0);  
  113.                            printf("Angle=%5d%s",num,"   FZ");
  114.                            SetAngle(num*11.5);
  115.                     }
  116.                     else if(flag==1)
  117.                     {
  118.                            num++;
  119.                            SetRowCol(0,0);  
  120.                            printf("Angle=%5d%s",num,"   ZZ");
  121.                            SetAngle(num*11.5);
  122.                     }                                   
  123.                 }
  124.                                 
  125.       }
  126.     }
  127. }
  128. void SetAngle(uint angle)
  129. {
  130.         static        uint FirAngle=0;
  131.         static uint i=0;
  132.         int d;   
  133.         uint j;
  134.         d=angle-FirAngle;
  135.         if(d>0)
  136.         {
  137.                 for(j=0;j<d;j++)
  138.                 {
  139.                         i++;
  140.                         i=(i&0x0007);
  141.                         Motor=Motortab[i];
  142.                         delay(T);
  143.                 }
  144.            FirAngle=angle;
  145.         }
  146.         else
  147.         {
  148.                 for(j=0;j<-d;j++)
  149.                 {
  150.                         i--;
  151.                         i=i&0x0007;
  152.                         Motor=Motortab[i];
  153.                         delay(T);
  154.                 }
  155.            FirAngle=angle;
  156.         }
  157. }        
復(fù)制代碼

以上圖文的Word格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便大家保存):
基于51單片機的步進電機控制系統(tǒng).docx (391.54 KB, 下載次數(shù): 48)

3.png (54.04 KB, 下載次數(shù): 138)

3.png

作者: jovew    時間: 2022-3-9 21:23
Rebuild started: Project: Calendar
Rebuild target 'Target 1'
compiling Cal.c...
C51 FATAL-ERROR -
  ACTION:  PARSING SOURCE-FILE
  ERROR:    PREPROCESSOR: MACROS TOO NESTED
C51 TERMINATED.
Target not created.
Build Time Elapsed:  00:00:00
編譯不能通過,怎么辦?
作者: Southerly    時間: 2022-3-12 13:27
jovew 發(fā)表于 2022-3-9 21:23
Rebuild started: Project: Calendar
Rebuild target 'Target 1'
compiling Cal.c...

每個驅(qū)動程序看一下是否添加對





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1