找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 22737|回復: 35
收起左側(cè)

兩個限位開關(guān)如何通過51單片機控制一個直流電機正反轉(zhuǎn)

  [復制鏈接]
ID:183120 發(fā)表于 2017-4-10 21:41 | 顯示全部樓層 |閱讀模式
現(xiàn)有兩個限位開關(guān),想通過51/52單片機控制一個直流電機的正反轉(zhuǎn),請問各位高手有什么思路嗎
回復

使用道具 舉報

ID:188246 發(fā)表于 2017-4-10 23:04 | 顯示全部樓層
先說硬件電路,電機正反轉(zhuǎn)需要用晶體管搭一個H橋,并用單片機的四個輸出口驅(qū)動,剩下的選兩個口作為開關(guān)檢測端。程序應該不復雜,就兩個開關(guān)的判斷,然后根據(jù)需求驅(qū)動電機就行

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:47286 發(fā)表于 2017-4-11 01:23 | 顯示全部樓層
不知道你什么電機 小電機用9110片子直接就可以了 那個片子用兩個管腳 1高1低正轉(zhuǎn) 1低1高就是翻轉(zhuǎn) 其它的H橋也是類似道理 就是功率大些 實驗的話這種小驅(qū)動片子足夠了

然后你的單片機另外用兩個管腳感知兩個行程開關(guān) 在一邊的時候 開關(guān)A導通開板B斷開 端口就是10 這是驅(qū)動電機往一個方向移動 端口狀態(tài)就應該是00 到另一頭就是01

如果你只是表面提的這些需求 就是這樣了 很簡單 非常簡單

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:47286 發(fā)表于 2017-4-11 02:13 | 顯示全部樓層
本帖最后由 dzbj 于 2017-4-11 09:48 編輯

困了 隨便弄了一下 可能有很多錯誤 電路圖畫的不細 不能直接用 缺一些下拉電阻什么的 程序沒仔細想 按思路大致寫的 大概是個意思 僅供參考

電路圖

電路圖.png

程序

uchar m=0;
bit flag_moto=0;

void moto()
{
        if(m==0)                //停止
        {
                P1.1=1;
                P1.2=1;
        }
        if(m==1)                //正轉(zhuǎn)
        {
                P1.1=1;
                P1.2=0;
        }
        if(m==2)                //反轉(zhuǎn)
        {
                P1.1=0;
                P1.2=1;
        }
        if(m==3)                //剎車
        {
                P1.1=0;
                P1.2=0;
        }
}

void main()
{
        while(1)
        {
                moto();        //電機驅(qū)動 電機啟動后在兩點之間時設(shè)這個函數(shù)獨立控制電機繼續(xù)運動

                if(key3==1)                        //如果 啟動開關(guān)開啟
                {
                        if(flag_moto==0)        //如果 電機工作標記為0
                        {
                                if(key1==1)                        //如果 一端開關(guān)閉合
                                {
                                        m=3;                                //剎車 這個是為了自動回程后再反復
                                        moto();                                //調(diào)用 電機驅(qū)動函數(shù)
                                        Delay(xx);                        //延時50~100ms 這個函數(shù)太簡單了 沒寫出來
                                        m=1;                                //正轉(zhuǎn)
                                        moto();                                //調(diào)用 電機驅(qū)動函數(shù)
                                        flag_moto=1;                //電機工作標記置1
                                }
                        }
                        else                                //否則 即 電機工作標記為1
                        {
                                if(key2==1)                        //如果 另一端開關(guān)閉合
                                {
                                        m=3;                                //剎車
                                        moto();                                //調(diào)用 電機驅(qū)動函數(shù)
                                        Delay(xx);                        //延時50~100ms 這個函數(shù)太簡單了 沒寫出來
                                        m=2;                                //反轉(zhuǎn)
                                        moto();                                //調(diào)用 電機驅(qū)動函數(shù)
                                        flag_moto=0;                //電機工作標記清零
                                }
                        }
                        
                }
                else                                //否則 即 啟動開關(guān)關(guān)閉
                {
                        m=0;                                //停止
                        moto();                                //調(diào)用 電機驅(qū)動函數(shù)
                }
        }
}

評分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:94554 發(fā)表于 2017-4-11 13:24 | 顯示全部樓層
#include<reg52.h>



sbit K1=P3^6;   //正轉(zhuǎn)(逆時針)按鍵 對應實驗板上的K1

sbit K2=P3^7;//反轉(zhuǎn)(順時針)按鍵  對應實驗板上的K2

sbit K3=P3^2;//停止鍵    對應實驗板上的K3



sbit P10=P0^0;//控制端

sbit P11=P0^1;//控制端



sbit BEEP = P2^2; //蜂鳴器控制端口P22



void delay(unsigned int n)

{

unsigned char i;

while(n--)

  for(i=0;i<112;i++);

}



void beep()       //500HZ的聲音

{

unsigned char i;

for(i=0;i<100;i++){

  BEEP=~BEEP;

  delay(1);

}

BEEP=1;

}



void main()

{

P10=1;  // 關(guān)閉直流電機

P11=1;

while(1){

  if(K1==0){

   delay(15);  //消陡

   if(K1==0){

    beep();

    P10=0;

    P11=1;

    while(K1==0);  //等待按鍵釋放

   }

  }

  if(K2==0){

   delay(15);

   if(K2==0){

    beep();

    P10=1;

    P11=0;

    while(K2==0);

   }

  }

  if(K3==0){

   delay(15);

   if(K3==0){

    beep();

    P10=1;

    P11=1;

    while(K3==0);

   }

  }

}

}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:7485 發(fā)表于 2017-4-11 14:18 | 顯示全部樓層
你自己是什么思路?有什么樣的基礎(chǔ)?
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-11 18:26 | 顯示全部樓層
網(wǎng)上漁翁 發(fā)表于 2017-4-10 23:04
先說硬件電路,電機正反轉(zhuǎn)需要用晶體管搭一個H橋,并用單片機的四個輸出口驅(qū)動,剩下的選兩個口作為開關(guān)檢 ...

搭建H橋后,程序該怎么寫呢
回復

使用道具 舉報

ID:188246 發(fā)表于 2017-4-11 19:10 | 顯示全部樓層
代碼這個真不是我的強項,且也有6、7年沒有搞了,最近忽然心血來潮想搞個數(shù)控的備用電源,所以我也還在學習中。
樓上已經(jīng)有現(xiàn)成的代碼,二樓的用了專用驅(qū)動電路,硬件電路就更簡單了,思路都差不多。要是你用全分離件的驅(qū)動電路,樓上的代碼稍微修改一下也能用,只要是H橋的對角功率管導通就可以了。其他都一樣

評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-11 19:35 | 顯示全部樓層
dzbj 發(fā)表于 2017-4-11 02:13
困了 隨便弄了一下 可能有很多錯誤 電路圖畫的不細 不能直接用 缺一些下拉電阻什么的 程序沒仔細想 按思路 ...

請問,m 代表的是什么,  剎車又是什么意思
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-11 19:36 | 顯示全部樓層
使用的是L298N電機驅(qū)動模塊
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-11 19:38 | 顯示全部樓層

按您的意思就是說沒有使用什么電機驅(qū)動模塊了?
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-11 19:43 | 顯示全部樓層
ahshmj 發(fā)表于 2017-4-11 14:18
你自己是什么思路?有什么樣的基礎(chǔ)?

首先有限位開關(guān)2個,直流電機1個,L298N電機驅(qū)動模塊,假設(shè):當擋板碰到限位開關(guān)1,電機停止,并當有正轉(zhuǎn)信號收入時,電機正轉(zhuǎn),當碰到限位開關(guān)2時,電機停止,并且當有反轉(zhuǎn)信號收入時,電機反轉(zhuǎn),往返期間可以通過按鍵使電機立即停止轉(zhuǎn)動
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-11 21:22 | 顯示全部樓層
dzbj 發(fā)表于 2017-4-11 02:13
困了 隨便弄了一下 可能有很多錯誤 電路圖畫的不細 不能直接用 缺一些下拉電阻什么的 程序沒仔細想 按思路 ...

圖二之后的四張看不清,不知key1,key2,key3代表的是什么
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-11 22:14 | 顯示全部樓層
dzbj 發(fā)表于 2017-4-11 02:13
困了 隨便弄了一下 可能有很多錯誤 電路圖畫的不細 不能直接用 缺一些下拉電阻什么的 程序沒仔細想 按思路 ...

再請教一個哈,就是你是只用了一個限位開關(guān)嗎
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-11 22:18 | 顯示全部樓層

你好,控制端指的是限位開關(guān)的端口嗎?
回復

使用道具 舉報

ID:47286 發(fā)表于 2017-4-11 23:09 | 顯示全部樓層
彬Lsl 發(fā)表于 2017-4-11 21:22
圖二之后的四張看不清,不知key1,key2,key3代表的是什么

k1和k2是你說的兩個開關(guān) 一個正程一個反程 k3是我加上去的 我想你總需要有個開關(guān)控制整體是否工作吧 總不會靠插拔電源決定是否工作 對么
回復

使用道具 舉報

ID:47286 發(fā)表于 2017-4-11 23:23 | 顯示全部樓層
彬Lsl 發(fā)表于 2017-4-11 19:35
請問,m 代表的是什么,  剎車又是什么意思

m是個變量 通過它改變電機狀態(tài)

剎車是電機工作中的一種狀態(tài) 直流電機帶負載后斷電還會繼續(xù)轉(zhuǎn)一點角度 如果直接反轉(zhuǎn)容易燒片子 嚴重了可以燒電機

我出的圖和程序只是核心內(nèi)容 缺周邊的東西 比如單片機的晶振沒畫 開關(guān)防抖也沒寫

大概思路是按你說的兩個限位開關(guān)K1 K2控制正反轉(zhuǎn) K3控制系統(tǒng)是否工作

K3為1 系統(tǒng)開始工作

默認開始時電機位置在key1的地方 就是key1導通狀態(tài) 當然也可以寫成任意位置 這就是個思路不是成品 沒寫那么細

其它邏輯你讀程序 不復雜的

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-12 15:05 | 顯示全部樓層
dzbj 發(fā)表于 2017-4-11 23:09
k1和k2是你說的兩個開關(guān) 一個正程一個反程 k3是我加上去的 我想你總需要有個開關(guān)控制整體是否工作吧 總不 ...

哦哦,對的
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-12 15:07 | 顯示全部樓層
dzbj 發(fā)表于 2017-4-11 23:23
m是個變量 通過它改變電機狀態(tài)

剎車是電機工作中的一種狀態(tài) 直流電機帶負載后斷電還會繼續(xù)轉(zhuǎn)一點角度  ...

好的,我試試看看行不行
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-12 15:10 | 顯示全部樓層
網(wǎng)上漁翁 發(fā)表于 2017-4-11 19:10
代碼這個真不是我的強項,且也有6、7年沒有搞了,最近忽然心血來潮想搞個數(shù)控的備用電源,所以我也還在學習 ...

好,謝謝啦
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-13 22:19 | 顯示全部樓層
dzbj 發(fā)表于 2017-4-11 02:13
困了 隨便弄了一下 可能有很多錯誤 電路圖畫的不細 不能直接用 缺一些下拉電阻什么的 程序沒仔細想 按思路 ...

大師啊還是不行啊,你是有用H橋驅(qū)動電機的嗎?我用的是L298N,你看看你還能寫下代碼參考參考嗎

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:189542 發(fā)表于 2017-4-14 14:53 | 顯示全部樓層
在多機通信中,主機必須要能對各個從機進行識別,在51系列單片機中可以通過SCON寄存器的SM2位來實現(xiàn)。當串口以方式2或方式3發(fā)送數(shù)據(jù)時,每一幀信息都是11位,第9位是數(shù)據(jù)可編程位,通過給TB8置1或置0來區(qū)別地址幀和數(shù)據(jù)幀,當該位為1時,發(fā)送地址幀;該位為0時,發(fā)送數(shù)據(jù)幀。 在多機通信過程中,主機先發(fā)送某一從機的地址,等待從機的應答,所有的從機接收到地址幀后與本機地址進行比較,若相同,則將SM2置0準備接收數(shù)據(jù);若不同,則丟棄當前數(shù)據(jù),SM2位不變。
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-14 14:58 | 顯示全部樓層
XIN_XIN 發(fā)表于 2017-4-14 14:53
在多機通信中,主機必須要能對各個從機進行識別,在51系列單片機中可以通過SCON寄存器的SM2位來實現(xiàn)。當串 ...

大神啊,我的基礎(chǔ)差,看不懂
回復

使用道具 舉報

ID:47286 發(fā)表于 2017-4-14 15:26 | 顯示全部樓層
彬Lsl 發(fā)表于 2017-4-13 22:19
大師啊還是不行啊,你是有用H橋驅(qū)動電機的嗎?我用的是L298N,你看看你還能寫下代碼參考參考嗎[em3 ...

我現(xiàn)在在上班 沒法給你寫 看了一下L298N的手冊 和我用的9110基本上是一樣的控制方法 多兩個EN使能端 見下圖 LN298.png


你控制一個電機 那么L298N的2 3腳接你的電機 ENA接到單片機上 在我上面寫的程序里 電機驅(qū)動函數(shù)中 進入時加個ENA=1; 退出時加個ENA=0; 應該就可以了 其它的 你照這個線路圖接 省掉下面那路電機即可
回復

使用道具 舉報

ID:47286 發(fā)表于 2017-4-14 15:33 | 顯示全部樓層
彬Lsl 發(fā)表于 2017-4-14 14:58
大神啊,我的基礎(chǔ)差,看不懂

補充

原來的IA到298的IN1 原來的IB到298的IN2

程序里 你另外定義一個端口是ENA

sbit ENA=PX^X;

void moto()
{
ENA=1;
...........//原來的程序
ENA=0;
}

回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-14 19:44 | 顯示全部樓層
dzbj 發(fā)表于 2017-4-14 15:26
我現(xiàn)在在上班 沒法給你寫 看了一下L298N的手冊 和我用的9110基本上是一樣的控制方法 多兩個EN使能端 見下 ...

我覺得接上限位開關(guān)后,還是不行,試過挺多方式還是不行
回復

使用道具 舉報

ID:47286 發(fā)表于 2017-4-14 19:55 | 顯示全部樓層
彬Lsl 發(fā)表于 2017-4-14 19:44
我覺得接上限位開關(guān)后,還是不行,試過挺多方式還是不行

那就不是我這么臆測能解決了 需要你自己一步一步檢查 至少 你要描述出每一步的狀況才能幫你了 一切皆有可能 看不見摸不著的無從下手啊 一句不行解決不了任何問題 天天念叨不行它也不會行

給你簡單說一下步驟吧

1. 確保編譯沒問題 給你的程序不是成品 你需要把缺的補上 可以把你寫好的發(fā)上來看下
2. 確保下載正確 程序和硬件端口對應關(guān)系沒問題
3. 給系統(tǒng)上電但不帶電機 萬用表 按邏輯模擬狀態(tài) 測量你定義的每個管腳是否正常 不正常找片子 電路板 程序的原因 正常 則檢查電機情況 機械結(jié)構(gòu) 電源帶載能力等

我自己做東西都要搭實驗臺 模擬使用環(huán)境的 也不是一次成功 上去不行太正常了 肯定哪有問題唄
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-15 09:04 | 顯示全部樓層
dzbj 發(fā)表于 2017-4-14 19:55
那就不是我這么臆測能解決了 需要你自己一步一步檢查 至少 你要描述出每一步的狀況才能幫你了 一切皆有可 ...

代碼有點問題,現(xiàn)在有點像自己要的結(jié)果了
回復

使用道具 舉報

ID:183120 發(fā)表于 2017-4-22 10:20 | 顯示全部樓層
dzbj 發(fā)表于 2017-4-11 02:13
困了 隨便弄了一下 可能有很多錯誤 電路圖畫的不細 不能直接用 缺一些下拉電阻什么的 程序沒仔細想 按思路 ...

請問如果再加上點觸開關(guān)控制正反轉(zhuǎn),碰到限位就停,思路又是怎樣的呢
回復

使用道具 舉報

ID:327273 發(fā)表于 2018-5-11 00:45 來自手機 | 顯示全部樓層
萌新一個,怎樣將限位開關(guān)接在51單片機控制的控制電路上。控制電路接驅(qū)動器控制步進電機正反轉(zhuǎn)的
回復

使用道具 舉報

ID:324786 發(fā)表于 2018-8-13 17:30 | 顯示全部樓層
sxxy 發(fā)表于 2018-5-11 00:45
萌新一個,怎樣將限位開關(guān)接在51單片機控制的控制電路上�?刂齐娐方域�(qū)動器控制步進電機正反轉(zhuǎn)的

請問知道了嗎。我也是萌新
回復

使用道具 舉報

ID:324786 發(fā)表于 2018-8-13 17:30 | 顯示全部樓層
sxxy 發(fā)表于 2018-5-11 00:45
萌新一個,怎樣將限位開關(guān)接在51單片機控制的控制電路上�?刂齐娐方域�(qū)動器控制步進電機正反轉(zhuǎn)的

我也是萌新請問你會了嗎
回復

使用道具 舉報

ID:324786 發(fā)表于 2018-8-13 17:31 | 顯示全部樓層
sxxy 發(fā)表于 2018-5-11 00:45
萌新一個,怎樣將限位開關(guān)接在51單片機控制的控制電路上。控制電路接驅(qū)動器控制步進電機正反轉(zhuǎn)的

我也是萌新請問你會了嗎
回復

使用道具 舉報

ID:393142 發(fā)表于 2018-9-15 21:10 | 顯示全部樓層

不知道你什么電機
回復

使用道具 舉報

ID:444385 發(fā)表于 2020-5-29 05:44 | 顯示全部樓層

這個程序是按下一次開關(guān)電機正轉(zhuǎn)馬上就停止,怎么改程序才能讓它一直轉(zhuǎn),直到按下反向鍵呢?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表