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

QQ登錄

只需一步,快速開始

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

請(qǐng)各位大師指導(dǎo),以下寫的單片機(jī)函數(shù)是否可以控制兩個(gè)電機(jī)正常運(yùn)行?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:889206 發(fā)表于 2021-3-10 22:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 kpljn 于 2021-3-11 22:47 編輯

本人剛學(xué)單片機(jī),感覺寫的函數(shù)不一定正確,請(qǐng)各位大師多多指教,謝謝!
      程序的目的:用一個(gè)啟動(dòng)開關(guān)控制兩個(gè)電機(jī)按次序運(yùn)行,兩個(gè)電機(jī)都設(shè)有原位感應(yīng)開關(guān)及限位感應(yīng)開關(guān)。只有兩個(gè)機(jī)械部件恢復(fù)至原位并按下各自的感應(yīng)開關(guān),觸發(fā)一下啟動(dòng)開關(guān)就可以控制兩個(gè)電機(jī)開始運(yùn)行。
     目的流程如下:1、檢測(cè)兩個(gè)原位開關(guān)為0狀態(tài),當(dāng)啟動(dòng)開關(guān)狀態(tài)觸發(fā)一下時(shí),開始啟動(dòng)M2電機(jī)運(yùn)行,控制第一個(gè)機(jī)械部件離開原位感應(yīng)開關(guān)S3,往限位感應(yīng)開關(guān)S4前進(jìn)。2、到達(dá)S4后,M2電機(jī)停轉(zhuǎn)兩秒鐘。3、M2電機(jī)恢復(fù)運(yùn)行,機(jī)械部件離開S4,往S3前進(jìn)。4、第一個(gè)機(jī)械部件回到原位后,M2電機(jī)停止,兩秒后開始啟動(dòng)M1電機(jī),控制第二個(gè)機(jī)械部件離開原位感應(yīng)開關(guān)S1,往限位感應(yīng)開關(guān)S2前進(jìn)。5、到達(dá)S2后,M1電機(jī)停轉(zhuǎn)兩秒鐘。6、M1電機(jī)開始反向運(yùn)行,機(jī)械部件離開S2,往原位S1返回。7、返回S1后,M1電機(jī)也停止。8、系統(tǒng)回到初始狀態(tài),等待啟動(dòng)開關(guān)的被按下后執(zhí)行下一個(gè)周期的動(dòng)作。
  代碼如下:
#include<STC12C2052AD.H> //頭文件
#define uchar unsigned char
#define uint unsigned int
sbit M1F=P1^0;
sbit M1B=P1^1;
sbit M2F=P1^2;
sbit M2B=P1^3;
sbit SS1=P1^7;            //定義啟動(dòng)開關(guān)
sbit S1=P3^0;             //定義托盤原位感應(yīng)開關(guān)
sbit S2=P3^1;             //定義托盤限位感應(yīng)開關(guān)
sbit S3=P3^2;                                                        //定義剪切原位感應(yīng)開關(guān)
sbit S4=P3^3;                                                        //定義剪切限位感應(yīng)開關(guān)

unsigned int num;               //無符號(hào)整型變量
void Delay10Ms()              //去抖延時(shí)子函數(shù),暫時(shí)不引用
{
        TMOD=0x01;                                                        //設(shè)置定時(shí)器0的工作方式為1(M1M0為01)
        TH0=(65536-10000)/256;        //裝初值12M晶振定時(shí)10ms數(shù)為55536
        TL0=(65536-10000)%256;        
        EA=1;                                                                                //開總中斷
        ET0=1;                                                                        //開定時(shí)器0中斷
        TR0=1;                                                                        //啟動(dòng)定時(shí)器0
}
void Second2()              //等待2秒的子函數(shù)
         {
                 TMOD=0x01;
                 TH0=(65536-50000)/256; //重裝初值        
          TL0=(65536-50000)%256;
          EA=1;                                                                                //開總中斷
                ET0=1;                                                                        //開定時(shí)器0中斷
                TR0=1;
          num=0;
          num++;                                                                 //num每次加1
          if(num==40)                                                 //num到40,說明2秒時(shí)間到
           {
            num=0;                                                         //然后把num清0,重新再計(jì)40次
              }
            }
void main()        //主函數(shù)
{
        {
        SS1=1;                                                                        //啟動(dòng)開關(guān)初值置1
        S2=1;                                                                          //托盤限位感應(yīng)開關(guān)置1
        S4=1;                                                                          //剪切限位感應(yīng)開關(guān)置1
        M1F=0;                                                                        //托盤電機(jī)正極置0
        M1B=0;                                                                        //托盤電機(jī)負(fù)極置0
        M2F=0;                                                                        //剪切電機(jī)正極置0
        M2B=0;                                                                        //剪切電機(jī)負(fù)極置0
       if(S1==0&&S3==0)        //判斷兩個(gè)原位感應(yīng)開關(guān)狀態(tài)被按下  
                if(SS1==0)               //再判斷啟動(dòng)開關(guān)也被觸發(fā)一下(再學(xué)習(xí)了一下,發(fā)現(xiàn)這兩行代碼用if不對(duì),請(qǐng)大師指導(dǎo)啥寫才正確)
        while(S4)                           //剪切限位感應(yīng)開關(guān)被按下之前執(zhí)行以下兩行代碼
        {
        S3=1;                      //剪切原位感應(yīng)開關(guān)置1
        M2F=1;                   //啟動(dòng)M2電機(jī)
        }
        }                             //剪切限位感應(yīng)開關(guān)被按下后執(zhí)行以下兩行代碼
        M2F=0;                   //暫停M2電機(jī)
        Second2();              //等待2秒
        while(S3)                //剪切原位感應(yīng)開關(guān)未按下之前執(zhí)行以下一行代碼
        {
        M2F=1;                   //啟動(dòng)M2電機(jī)
        }                            //剪切原位感應(yīng)開關(guān)被按下之后執(zhí)行以下三行代碼
        M2F=0;                   //停止M2電機(jī)
        Second2();              //等待2秒
        while(S2)                //托盤限位感應(yīng)開關(guān)未按下之前執(zhí)行以下三行代碼               
        {
        S1=1;                    //托盤原位感應(yīng)開關(guān)置1
        M1F=1;                  //M1電機(jī)正向運(yùn)行
        M2B=0;
        }
        M1F=0;                   //暫停M1電機(jī)
        Second2();               //等待2秒
        while(S1)                 //托盤原位感應(yīng)開關(guān)未按下之前執(zhí)行以下兩行代碼
        {
        M1F=0;                   //M1電機(jī)反向運(yùn)行
        M1B=1;
        }
        M1B=0;                   //托盤原位感應(yīng)開關(guān)被按下后,停止M2電機(jī)   最后這一行是否要添加return,等待下一次觸發(fā)啟動(dòng)鍵?
}

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

使用道具 舉報(bào)

沙發(fā)
ID:889206 發(fā)表于 2021-3-11 08:09 | 只看該作者
今天測(cè)試了一下,加電后發(fā)現(xiàn)電機(jī)在亂轉(zhuǎn)。
回復(fù)

使用道具 舉報(bào)

板凳
ID:827243 發(fā)表于 2021-3-11 11:01 | 只看該作者
無語,Second2() 根本就無法等待2秒,也許1ms就結(jié)束了。
if(num==40)                                                 //num到40,說明2秒時(shí)間到
這個(gè)能執(zhí)行幾次?

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:889206 發(fā)表于 2021-3-11 12:27 | 只看該作者
daemondong 發(fā)表于 2021-3-11 11:01
無語,Second2() 根本就無法等待2秒,也許1ms就結(jié)束了。
if(num==40)                                    ...

電機(jī)亂轉(zhuǎn)不是這個(gè)定時(shí)子函數(shù)引起的,好像是最前面的if語句有問題引致的,但自己水平有限,分析不出問題。另外,Sencond2()這個(gè)只是大概的時(shí)間值,要求不太高的話,是可以接受的。我將Second2()放在控制LED閃亮的函數(shù)里面測(cè)試,是可以控制LED作間隔大約2秒的閃亮動(dòng)作。
回復(fù)

使用道具 舉報(bào)

5#
ID:889206 發(fā)表于 2021-3-11 12:34 | 只看該作者
延時(shí)子函數(shù)的出處 http://www.torrancerestoration.com/bbs/dpj-129451-1.html
回復(fù)

使用道具 舉報(bào)

6#
ID:889206 發(fā)表于 2021-3-11 20:03 | 只看該作者
頂一頂,求大神指導(dǎo)。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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