找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 17134|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)控制直流電機(jī)程序(注釋詳細(xì))與Proteus仿真

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
仿真基本效果
1.       按下正轉(zhuǎn)按鈕,綠燈長(zhǎng)亮,電機(jī)低速正轉(zhuǎn),檔位為1檔。2.       按下正轉(zhuǎn)按鈕,綠燈長(zhǎng)亮,電機(jī)低速正轉(zhuǎn),檔位為1檔。3.       在未達(dá)到最高檔(3檔)的情況下,按下加速按鈕,電機(jī)檔位加一,綠燈閃爍8次,每次閃爍的時(shí)間間隔為1秒。如果達(dá)到最高檔,按下加速按鈕,電機(jī)檔位不變。然后判斷電機(jī)的轉(zhuǎn)動(dòng)方向,如果正轉(zhuǎn),綠燈常亮;如果反轉(zhuǎn),紅燈常亮。4.       在未達(dá)到最低檔位(1檔)的情況下,按下減速按鈕,電機(jī)檔位減一,紅燈閃爍8秒,每次閃爍的室間隔為1秒。如果達(dá)到最低檔,按下減速按鈕,電機(jī)檔位不變。然后判斷電機(jī)的轉(zhuǎn)動(dòng)方向,如果正轉(zhuǎn),綠燈常亮;如果反轉(zhuǎn),紅燈常亮。5.       按下停止按鈕,蜂鳴器報(bào)警,且所有LED燈滅,電機(jī)停止,并使電機(jī)檔位置1檔。

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


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar m;               //用來(lái)標(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;           //控制電動(dòng)機(jī)的兩個(gè)輸入
  13. sbit pwm1=P1^4;           //PWM信號(hào)從P1^4輸出
  14. void init() ;      //定義定時(shí)器的初始化函數(shù)         
  15. void delay(uint x)        //延時(shí)程序,延時(shí)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();                        //定時(shí)器的初始化
  24.    while(1)
  25.    {      
  26.        if(k1==0)           //檢測(cè)是否按下正轉(zhuǎn)按鈕
  27.         {
  28.            delay(10);  // 消抖10ms
  29.            if(k1==0)   //如果正轉(zhuǎn)按鈕按下
  30.            {  
  31.             P1=0x01;        //IN1=1,IN2=0;控制電動(dòng)機(jī)正轉(zhuǎn)
  32.             P0=0X00;        //綠燈常亮
  33.            }
  34.            while(!k1);        //判斷按鈕是否松開(kāi),不松開(kāi)一直死循環(huán),松開(kāi)后跳出循環(huán),繼續(xù)執(zhí)行
  35.         }
  36.       
  37.         if(k2==0)                //檢測(cè)是否按下反轉(zhuǎn)按鈕
  38.         {
  39.            delay(10);        //消抖10ms
  40.            if(k2==0)        //如果按下反轉(zhuǎn)按鈕
  41.            {
  42.              P1=0x02;         //IN1=0,IN2=1,控制電動(dòng)機(jī)反轉(zhuǎn)
  43.              P0=0X01;         //紅燈常亮
  44.            }
  45.            while(!k2);           //判斷按鈕是否松開(kāi),不松開(kāi)一直死循環(huán),松開(kāi)后跳出循環(huán),繼續(xù)執(zhí)行      
  46.         }
  47.         if(k3==0)                  //檢測(cè)是否按下停止按鈕
  48.         {
  49.            delay(10);                //消抖10ms
  50.            if(k3==0)                //如果按下停止按鈕
  51.            {
  52.                     m=1;                         //電動(dòng)機(jī)重置為1檔
  53.             P1=0X00;                 //IN1=0.IN2=0,電動(dòng)機(jī)停止
  54.             P0=0x02;                 //蜂鳴器響
  55.             delay(1000);         //延時(shí)1秒
  56.                         P0=0XFF;                  //燈全熄滅,蜂鳴器不響
  57.             pwm1=0;                         //PWM輸出低電平
  58.            }
  59.         while(!k3);                         //判斷按鈕是否松開(kāi),不松開(kāi)一直死循環(huán),松開(kāi)后跳出循環(huán),繼續(xù)執(zhí)行
  60.         }
  61.         if(k4==0)                          //檢測(cè)加速按鈕是否按下
  62.         {
  63.            delay(10);                   //消抖10ms
  64.            if(k4==0)                        //如果加速按鈕按下
  65.            {  
  66.              m++;                                 //檔位加一
  67.                          if(m<4){                         //在不超過(guò)最高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)          //如果電動(dòng)機(jī)正轉(zhuǎn),綠燈常亮
  74.                                 P0=0X00;
  75.                                 else if(k6==0&&k7==1)         //如果電動(dòng)機(jī)反轉(zhuǎn),紅燈常亮
  76.                                 P0=0X01;
  77.                                 else P0=0X07;                        //如果電動(dòng)機(jī)停止,燈全熄滅
  78.            }
  79.            while(!k4);                                   //判斷按鈕是否松開(kāi),不松開(kāi)一直死循環(huán),松開(kāi)后跳出循環(huán),繼續(xù)執(zhí)行
  80.         }
  81.         if(k5==0)                                           //檢測(cè)減速按鈕是否按下
  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)                 //如果電動(dòng)機(jī)正轉(zhuǎn),綠燈常亮
  94.                                 P0=0X00;
  95.                                 else if(k6==0&&k7==1)          //如果電動(dòng)機(jī)反轉(zhuǎn),紅燈常亮
  96.                                 P0=0X01;
  97.                                 else P0=0X07;                          //如果電動(dòng)機(jī)停止,燈全熄滅
  98.              }
  99.              while(!k5);                         //判斷按鈕是否松開(kāi),不松開(kāi)一直死循環(huán),松開(kāi)后跳出循環(huán),繼續(xù)執(zhí)行
  100.         }
  101.                 if(m>3)m=3;                                          //檔位最大為3檔
  102.                 if(m<1)m=1;                                     //檔位最小為1檔
  103.      }
  104. }
  105. void init()                                                         //定義定時(shí)器的初始化
  106. {
  107.    
  108.    TMOD=0X01;                                                 //工作方式寄存器,選用定時(shí)器0的工作方式1
  109.    TH0=(65536-50000)/256;
  110.    TL0=(65536-50000)%256;                          //裝載初值
  111.    TR0=1;                                                         //開(kāi)始計(jì)數(shù)
  112.    ET0=1;                                                          //開(kāi)啟定時(shí)器中斷使能
  113.    EA=1;                                                          //開(kāi)啟總中斷
  114.    P0=0Xff;                                                          //設(shè)定開(kāi)始時(shí)燈全熄滅,蜂鳴器不響
  115.    P1=0X00;                                                     //電動(dòng)機(jī)不運(yùn)轉(zhuǎn)
  116.    P2=0Xff;                                                     //P2端口全置1
  117.    m=1;                                                                   //開(kāi)啟電動(dòng)機(jī)為1檔
  118. }
  119. ……………………

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

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

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏14 分享淘帖 頂5 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:563002 發(fā)表于 2019-6-20 15:17 | 只看該作者
有問(wèn)題的好吧
回復(fù)

使用道具 舉報(bào)

板凳
ID:140931 發(fā)表于 2020-3-6 11:24 | 只看該作者
多謝分享!
回復(fù)

使用道具 舉報(bào)

地板
ID:698914 發(fā)表于 2020-3-7 12:42 | 只看該作者
連接單片機(jī)與電機(jī)之間的那個(gè)叫什么,可以介紹一下嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:700777 發(fā)表于 2020-3-14 14:16 | 只看該作者
不對(duì)啊  有錯(cuò)
回復(fù)

使用道具 舉報(bào)

6#
ID:542607 發(fā)表于 2020-4-24 11:58 | 只看該作者
電機(jī)都不轉(zhuǎn)
回復(fù)

使用道具 舉報(bào)

7#
ID:740787 發(fā)表于 2020-4-30 18:28 | 只看該作者
這這有重大錯(cuò)誤,沒(méi)法仿真

回復(fù)

使用道具 舉報(bào)

8#
ID:748287 發(fā)表于 2020-6-17 17:35 | 只看該作者

電機(jī)都不轉(zhuǎn),有錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

9#
ID:936785 發(fā)表于 2021-6-12 13:38 | 只看該作者
功能很齊全,電機(jī)也可以運(yùn)轉(zhuǎn)
回復(fù)

使用道具 舉報(bào)

10#
ID:964699 發(fā)表于 2021-9-7 20:49 | 只看該作者
真的很不多
回復(fù)

使用道具 舉報(bào)

11#
ID:1028751 發(fā)表于 2022-5-22 20:57 | 只看該作者
dingxin1 發(fā)表于 2021-6-12 13:38
功能很齊全,電機(jī)也可以運(yùn)轉(zhuǎn)

你的電機(jī)是轉(zhuǎn)的啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表