標(biāo)題: 單片機(jī)控制直流電機(jī)程序(注釋詳細(xì))與Proteus仿真 [打印本頁]

作者: H昌S    時間: 2019-4-15 15:43
標(biāo)題: 單片機(jī)控制直流電機(jī)程序(注釋詳細(xì))與Proteus仿真
仿真基本效果
1.       按下正轉(zhuǎn)按鈕,綠燈長亮,電機(jī)低速正轉(zhuǎn),檔位為1檔。2.       按下正轉(zhuǎn)按鈕,綠燈長亮,電機(jī)低速正轉(zhuǎn),檔位為1檔。3.       在未達(dá)到最高檔(3檔)的情況下,按下加速按鈕,電機(jī)檔位加一,綠燈閃爍8次,每次閃爍的時間間隔為1秒。如果達(dá)到最高檔,按下加速按鈕,電機(jī)檔位不變。然后判斷電機(jī)的轉(zhuǎn)動方向,如果正轉(zhuǎn),綠燈常亮;如果反轉(zhuǎn),紅燈常亮。4.       在未達(dá)到最低檔位(1檔)的情況下,按下減速按鈕,電機(jī)檔位減一,紅燈閃爍8秒,每次閃爍的室間隔為1秒。如果達(dá)到最低檔,按下減速按鈕,電機(jī)檔位不變。然后判斷電機(jī)的轉(zhuǎn)動方向,如果正轉(zhuǎn),綠燈常亮;如果反轉(zhuǎn),紅燈常亮。5.       按下停止按鈕,蜂鳴器報警,且所有LED燈滅,電機(jī)停止,并使電機(jī)檔位置1檔。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar m;               //用來標(biāo)志速度檔位
  5. uint t;                           //計(jì)數(shù)標(biāo)志
  6. sbit k1=P2^0;     //正轉(zhuǎn)按鈕
  7. sbit k2=P2^1;      //反轉(zhuǎn)按鈕  
  8. sbit k3=P2^2;             //停止按鈕
  9. sbit k4=P2^3;           //加速按鈕
  10. sbit k5=P2^4;           //減速按鈕
  11. sbit k6=P1^0;
  12. sbit k7=P1^1;           //控制電動機(jī)的兩個輸入
  13. sbit pwm1=P1^4;           //PWM信號從P1^4輸出
  14. void init() ;      //定義定時器的初始化函數(shù)         
  15. void delay(uint x)        //延時程序,延時x ms
  16. {
  17.       uint i,j;
  18.       for(i=x;i>0;i--)
  19.        for(j=110;j>0;j--);
  20. }

  21. main()
  22. {   
  23.    init();                        //定時器的初始化
  24.    while(1)
  25.    {      
  26.        if(k1==0)           //檢測是否按下正轉(zhuǎn)按鈕
  27.         {
  28.            delay(10);  // 消抖10ms
  29.            if(k1==0)   //如果正轉(zhuǎn)按鈕按下
  30.            {  
  31.             P1=0x01;        //IN1=1,IN2=0;控制電動機(jī)正轉(zhuǎn)
  32.             P0=0X00;        //綠燈常亮
  33.            }
  34.            while(!k1);        //判斷按鈕是否松開,不松開一直死循環(huán),松開后跳出循環(huán),繼續(xù)執(zhí)行
  35.         }
  36.       
  37.         if(k2==0)                //檢測是否按下反轉(zhuǎn)按鈕
  38.         {
  39.            delay(10);        //消抖10ms
  40.            if(k2==0)        //如果按下反轉(zhuǎn)按鈕
  41.            {
  42.              P1=0x02;         //IN1=0,IN2=1,控制電動機(jī)反轉(zhuǎn)
  43.              P0=0X01;         //紅燈常亮
  44.            }
  45.            while(!k2);           //判斷按鈕是否松開,不松開一直死循環(huán),松開后跳出循環(huán),繼續(xù)執(zhí)行      
  46.         }
  47.         if(k3==0)                  //檢測是否按下停止按鈕
  48.         {
  49.            delay(10);                //消抖10ms
  50.            if(k3==0)                //如果按下停止按鈕
  51.            {
  52.                     m=1;                         //電動機(jī)重置為1檔
  53.             P1=0X00;                 //IN1=0.IN2=0,電動機(jī)停止
  54.             P0=0x02;                 //蜂鳴器響
  55.             delay(1000);         //延時1秒
  56.                         P0=0XFF;                  //燈全熄滅,蜂鳴器不響
  57.             pwm1=0;                         //PWM輸出低電平
  58.            }
  59.         while(!k3);                         //判斷按鈕是否松開,不松開一直死循環(huán),松開后跳出循環(huán),繼續(xù)執(zhí)行
  60.         }
  61.         if(k4==0)                          //檢測加速按鈕是否按下
  62.         {
  63.            delay(10);                   //消抖10ms
  64.            if(k4==0)                        //如果加速按鈕按下
  65.            {  
  66.              m++;                                 //檔位加一
  67.                          if(m<4){                         //在不超過最高3檔的情況下,按下加速按鈕,執(zhí)行以下
  68.               for(t=8;t>0;t--){         //綠燈閃爍8次
  69.                 P0=0x03;
  70.                 delay(500);
  71.                 P0=0X07;
  72.                 delay(500);} }
  73.                                 if(k6==1&&k7==0)          //如果電動機(jī)正轉(zhuǎn),綠燈常亮
  74.                                 P0=0X00;
  75.                                 else if(k6==0&&k7==1)         //如果電動機(jī)反轉(zhuǎn),紅燈常亮
  76.                                 P0=0X01;
  77.                                 else P0=0X07;                        //如果電動機(jī)停止,燈全熄滅
  78.            }
  79.            while(!k4);                                   //判斷按鈕是否松開,不松開一直死循環(huán),松開后跳出循環(huán),繼續(xù)執(zhí)行
  80.         }
  81.         if(k5==0)                                           //檢測減速按鈕是否按下
  82.         {
  83.             delay(10);                                   //消抖10ms
  84.             if(k5==0)                                   //如果減速按鈕按下
  85.              {  
  86.               m--;                                                //檔位減一
  87.                           if(m>0){                                        //當(dāng)檔位未小于一檔,按下減速按鈕,執(zhí)行以下
  88.                for(t=8;t>0;t--){                 //紅燈閃爍8次
  89.                 P0=0x04;
  90.                 delay(500);
  91.                 P0=0X07;
  92.                 delay(500);}}
  93.                                 if(k6==1&&k7==0)                 //如果電動機(jī)正轉(zhuǎn),綠燈常亮
  94.                                 P0=0X00;
  95.                                 else if(k6==0&&k7==1)          //如果電動機(jī)反轉(zhuǎn),紅燈常亮
  96.                                 P0=0X01;
  97.                                 else P0=0X07;                          //如果電動機(jī)停止,燈全熄滅
  98.              }
  99.              while(!k5);                         //判斷按鈕是否松開,不松開一直死循環(huán),松開后跳出循環(huán),繼續(xù)執(zhí)行
  100.         }
  101.                 if(m>3)m=3;                                          //檔位最大為3檔
  102.                 if(m<1)m=1;                                     //檔位最小為1檔
  103.      }
  104. }
  105. void init()                                                         //定義定時器的初始化
  106. {
  107.    
  108.    TMOD=0X01;                                                 //工作方式寄存器,選用定時器0的工作方式1
  109.    TH0=(65536-50000)/256;
  110.    TL0=(65536-50000)%256;                          //裝載初值
  111.    TR0=1;                                                         //開始計(jì)數(shù)
  112.    ET0=1;                                                          //開啟定時器中斷使能
  113.    EA=1;                                                          //開啟總中斷
  114.    P0=0Xff;                                                          //設(shè)定開始時燈全熄滅,蜂鳴器不響
  115.    P1=0X00;                                                     //電動機(jī)不運(yùn)轉(zhuǎn)
  116.    P2=0Xff;                                                     //P2端口全置1
  117.    m=1;                                                                   //開啟電動機(jī)為1檔
  118. }
  119. ……………………

  120. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
單片機(jī)電機(jī)控制.zip (31.46 KB, 下載次數(shù): 355)


作者: 南宮云亦    時間: 2019-6-20 15:17
有問題的好吧

作者: 米明    時間: 2020-3-6 11:24
多謝分享!
作者: majiedong2020    時間: 2020-3-7 12:42
連接單片機(jī)與電機(jī)之間的那個叫什么,可以介紹一下嗎?
作者: MYSD    時間: 2020-3-14 14:16
不對啊  有錯
作者: 繁星、、、    時間: 2020-4-24 11:58
電機(jī)都不轉(zhuǎn)
作者: 須臾9q    時間: 2020-4-30 18:28
這這有重大錯誤,沒法仿真


作者: 阿giao    時間: 2020-6-17 17:35

電機(jī)都不轉(zhuǎn),有錯誤
作者: dingxin1    時間: 2021-6-12 13:38
功能很齊全,電機(jī)也可以運(yùn)轉(zhuǎn)
作者: 1253113386    時間: 2021-9-7 20:49
真的很不多
作者: 香鍋麻rua燙    時間: 2022-5-22 20:57
dingxin1 發(fā)表于 2021-6-12 13:38
功能很齊全,電機(jī)也可以運(yùn)轉(zhuǎn)

你的電機(jī)是轉(zhuǎn)的啊





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