找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

AT89C2051單片機控制自動門的程序求各位大神解釋一下看不太懂

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:331018 發(fā)表于 2018-5-16 09:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1黑幣
1、  PWM發(fā)生子程序
由前面介紹可知,通過調(diào)節(jié)PWM脈沖的占空比就能夠調(diào)節(jié)電機的轉(zhuǎn)動速度,從而控制開關(guān)門的速度。由于AT89C2051單片機內(nèi)部沒有PWM功能模塊,因此只能通過程序控制單片機的某個引腳輸出高低電平,從而模擬產(chǎn)生PWM脈沖。脈沖的高低電平時間由定時器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的各種方式并啟動T0運行,其后T0不斷溢出,產(chǎn)生中斷,在T0的中斷服務(wù)程序中,通過將P3.4引腳值取反并輸出,從而產(chǎn)生高低交替的電平信號。通過重新設(shè)置T0的計數(shù)初始值,從而產(chǎn)生不同時間的高低電平,由此可以調(diào)節(jié) PWM脈沖的占空比。本設(shè)計中電機快轉(zhuǎn)時占空比為80%,慢轉(zhuǎn)時占空比為20%,因此T0的計數(shù)初始值0xFCE0、0xFFE8。
StartMotol子程序用于啟動電機,子程序根據(jù)電機轉(zhuǎn)速設(shè)置T0計數(shù)初始值并啟動T0運行。根據(jù)電機轉(zhuǎn)動方向,設(shè)置P1.3、P1.4引腳輸出相應電平。程序如下:
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)門子程序
開門子程序用于控制自動門開門的整個過程。當有人靠近自動門或有物體被夾住時,該程序首先控制電機快速開門;當?shù)竭_減速位置時,程序控制電機慢速開門;當?shù)竭_停止位置時,程序控制電機停轉(zhuǎn),并定時5秒。在定時過程中,程序不斷判斷是否有人靠近自動門,若有則重新定時。程序代碼如下:
void OpenDoor ()
{
         uchar tcnt;
         if((gatesensor ==1)&&(comparator == 1))
             return;
         StartMotol (1,1);
         while (sensorB2 ==0);   //判斷是否減速
         StartMotol (1,0);
         while(sensorB1 ==0);   //判斷是否停止運動
         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)動
        {
            if(gatesensor == 1)
                return;
            if(comparator == 0)
                return;
             }
         StopMotol();
}
測試主程序
該程序主要調(diào)用相關(guān)子程序,實現(xiàn)了自動門的開關(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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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