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

QQ登錄

只需一步,快速開始

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

門自動(dòng)控制系統(tǒng)單片機(jī)源程序 解釋每一步代表什么含義

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:214729 發(fā)表于 2018-5-10 23:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
PWM發(fā)生子程序
由前面介紹可知,通過調(diào)節(jié)PWM脈沖的占空比就能夠調(diào)節(jié)電機(jī)的轉(zhuǎn)動(dòng)速度,從而控制開關(guān)門的速度。由于AT89C2051單片機(jī)內(nèi)部沒有PWM功能模塊,因此只能通過程序控制單片機(jī)的某個(gè)引腳輸出高低電平,從而模擬產(chǎn)生PWM脈沖。脈沖的高低電平時(shí)間由定時(shí)器T0控制。T0中斷服務(wù)程序如下:
void Timer0 ( )  interrupt 1
{
       cyclet = ~cyclet;
       TR0 = 0;
       if(cyclet)
       {
           TH0 = 0XFC;
           TL0 = 0XE0;
           if(smode == 0)
              PWMPIN = 0;
           else
              PWMPIN = 1;
        }
        else
        {
           TH0 = 0XFF;
           TL0 = 0X28;
           if (smode == 0)
             PWMPIN = 1;
           else
             PWMPIN = 0;
        }
     TR0 = 1;
}
設(shè)置好T0的各種方式并啟動(dòng)T0運(yùn)行,其后T0不斷溢出,產(chǎn)生中斷,在T0的中斷服務(wù)程序中,通過將P3.4引腳值取反并輸出,從而產(chǎn)生高低交替的電平信號(hào)。通過重新設(shè)置T0的計(jì)數(shù)初始值,從而產(chǎn)生不同時(shí)間的高低電平,由此可以調(diào)節(jié) PWM脈沖的占空比。本設(shè)計(jì)中電機(jī)快轉(zhuǎn)時(shí)占空比為80%,慢轉(zhuǎn)時(shí)占空比為20%,因此T0的計(jì)數(shù)初始值0xFCE0、0xFFE8。
StartMotol子程序用于啟動(dòng)電機(jī),子程序根據(jù)電機(jī)轉(zhuǎn)速設(shè)置T0計(jì)數(shù)初始值并啟動(dòng)T0運(yùn)行。根據(jù)電機(jī)轉(zhuǎn)動(dòng)方向,設(shè)置P1.3、P1.4引腳輸出相應(yīng)電平。程序如下:
void StartMotol (uchar direct, uchar speed)
//direct 1:正轉(zhuǎn) 0:反轉(zhuǎn) speed 1:快速 0:慢速
{
        smode = (speed == 0)?0:0xff
        TR0 = 0;
        TH0 = 0XFC;
        TL0 = 0XE0;
        TR0 = 1;
        if(direct)
        {
            motolconz = 0;
            motolconf = 1;
            }
         else
         {
            motolconz = 1;
            motolconf = 0;
            }
}
開關(guān)門子程序
開門子程序用于控制自動(dòng)門開門的整個(gè)過程。當(dāng)有人靠近自動(dòng)門或有物體被夾住時(shí),該程序首先控制電機(jī)快速開門;當(dāng)?shù)竭_(dá)減速位置時(shí),程序控制電機(jī)慢速開門;當(dāng)?shù)竭_(dá)停止位置時(shí),程序控制電機(jī)停轉(zhuǎn),并定時(shí)5秒。在定時(shí)過程中,程序不斷判斷是否有人靠近自動(dòng)門,若有則重新定時(shí)。程序代碼如下:
void OpenDoor ()
{
         uchar tcnt;
         if((gatesensor ==1)&&(comparator == 1))
             return;
         StartMotol (1,1);
         while (sensorB2 ==0);   //判斷是否減速
         StartMotol (1,0);
         while(sensorB1 ==0);   //判斷是否停止運(yùn)動(dòng)
         StopMotol ();
         tcnt = 0;
         while(tcnt<101)
         {
             TR1 = 0;
             TH1 = 0X3C;
             TL1 = 0XB0;
             TF1 = 0;
             TR1 = 1;
             while(TF1 == 0);
             TF1 = 0;
             if(gatesensor ==1)
                tcnt = 0;
             else
                tcnt = + +;
         }
         flagclose = 1;
}
關(guān)門子程序:


void CloseDoor()
{
        if(flagclose == 0)
           return;
        flagclose = 0;
        StartMotol(0,1);
        while(sensorB3 == 1)  //判斷是否減速
        {
            if(gatesensor == 1)
                return;
            if(comparator == 0)
                return;
            }
        StartMotol(0,0);
        while(sensorB4 == 0)   //判斷是否停止轉(zhuǎn)動(dòng)
        {
            if(gatesensor == 1)
                return;
            if(comparator == 0)
                return;
             }
         StopMotol();
}
測(cè)試主程序
該程序主要調(diào)用相關(guān)子程序,實(shí)現(xiàn)了自動(dòng)門的開關(guān)門及防夾等功能,代碼如下:
#include <REGX51.H>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit PWMPIN = P3^4;
sbit motolconz = P1^3;
sibt motolconf = P1^4;
uchar smode,cyclet;
sbit gatesensor = P3^2;
sbit sensorB1 = P3^1;
sbit sensorB2 = P1^5;
sbit sensorB3 = P1^6;
sbit sensorB4 = P3^0;
sbit comparator = P3^6;
bit flagcclose;
void InTimer01()
{
   TMOD = 0X11;
    ET0= 1;
    EA= 1;
    }

   void main()
    {
       InTimer01();
       while(1)
       {
            OpenDoor();
            CloseDoor();
            }
        }


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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