专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于单片机的电梯控制程序

作者:文于鹰   来源:本站原创   点击数:  更新时间:2013年12月05日   【字体:
#include<reg52.h> //包含头文件,一般情况不需要改动,

                  //头文件包含特殊功能寄存器的定义

 

sbit SCL=P2^0;

sbit SDA=P2^1;

sbit led=P2^2;

sbit led1=P1^5;

 

sbit tz=P2^3;         //停止按钮

sbit lc1=P2^4;        //一层楼按钮

sbit lc2=P2^5;        //二层楼按钮

sbit lc3=P2^6;        //三层楼按钮

sbit lc4=P2^7;        //四层楼按钮

 

sbit mb=P0^0;         //门保险传感器处理

 

sbit dw1=P0^1;       //一层楼到位处理

sbit dw2x=P0^2;       //一层楼到位处理

sbit dw2s=P0^3;       //一层楼到位处理

sbit dw3x=P0^4;       //一层楼到位处理

sbit dw3s=P0^5;       //一层楼到位处理

sbit dw4=P0^6;       //一层楼到位处理

 

sbit jd1=P3^5;       // 停止总电源常闭继电器

sbit jd2=P3^6;       //上升继电器

sbit jd3=P3^7;       //下降继电器

 

bit fg,fg1,fg2;      //位处理

bit sb,jb;    // 上升标志位   下降标志位

 

bit dw2,dw3;    //二楼 三楼到位标志

 

bit lch12;     // 1-2楼层之间标志

bit lch23;     // 2-3楼层之间标志

bit lch34;     // 3-4楼层之间标志

 

unsigned char num,num1,num2;

 

unsigned char jylc;                // 记忆层号变量

 

void Delay(unsigned int t); //函数声明

void Init_Timer0(void);

/*------------------------------------------------

                    主函数

------------------------------------------------*/

void main (void)

{

  char i,a;

  char lch,lch1;                  // 楼层号变量   ,lch1 用在数码管扫描时只扫描一次

 

  SDA=0;

 

     lch=2; fg=1;

 

        Delay(60);

 

 

    if(dw1==0)

           { lch=1;fg=1;lc1=1; }

 

        if(dw2x==0||dw2s==0)

           { lch=2;fg=1;lc2=1;}

 

        if(dw3x==0||dw3s==0)

           { lch=3;fg=1;lc3=1;}

 

        if(dw4==0)

           { lch=4;fg=1;lc4=1; }

 

  Init_Timer0();        //定时器初始化

 

while (1)         //主循环

  {

 

 

        if(lc1==1&&lc2==1&&lc3==1&&lc4==1)

        a=1;

 

    if(lc1==0&&a==1&&dw1!=0)             //楼层选择

      {  a=0;jylc=1;lc1=0; }

 

        if(lc2==0&&a==1&&dw2!=0)

      {  a=0;jylc=2;lc2=0; }

 

        if(lc3==0&&a==1&&dw3!=0)

      {  a=0;jylc=3;lc3=0; }

 

    if(lc4==0&&a==1&&dw4!=0)

      {  a=0;jylc=4;lc4=0; } 

 

    if(tz==0||mb==1)                   //停止按钮按下

          {

              lc1=1;lc2=1;lc3=1;lc4=1;    //楼层按钮复位

          jylc=0;                     //记忆楼层复位

         

                  if(lch12==0&&lch23==0&&lch34==0&&(sb==1||jb==1))

                 {

                            fg1=1;

 

                            if(lch==1&&sb==1)

                           lch12=1;

                        if(lch==2&&sb==1)

                            lch23=1;

                        if(lch==2&&jb==1)

                           lch12=1;

                        if(lch==3&&sb==1)

                            lch34=1;

                        if(lch==3&&jb==1)

                           lch23=1;

                        if(lch==4&&jb==1)

                           lch34=1;

                        }

 

                  jd2=1;jd3=1;      //  继电器停止通电  电梯停止

          }

 

    if(dw1==0&&jb==1)

           { lch=1;fg=1;lc1=1; }

 

        if((dw2x==0&&jb==1)||(sb==1&&dw2s==0))

           { lch=2;fg=1;lc2=1;dw2=0; }

        else

           dw2=1;

 

        if((dw3x==0&&jb==1)||(sb==1&&dw3s==0))

           { lch=3;fg=1;lc3=1;dw3=0; }

        else

           dw3=1;

 

        if(dw4==0&&sb==1)

           { lch=4;fg=1;lc4=1; }

 

        if(dw1==0||dw2==0||dw3==0||dw4==0)

            {  fg1=0;lch12=0;lch23=0;lch34=0;  }

 

        if(jylc!=0)

          {

                if(jylc>lch && fg1==0)

                           {  jd2=0;jd3=1; sb=1;jb=0; led=0; }       //电梯上升

 

                if(jylc<lch && fg1==0)

                           {  jd3=0;jd2=1; sb=0;jb=1; led=1;}       //电梯下降

 

                        if(jylc==lch && fg1==0)

                           {  jd2=1;jd3=1; sb=0;jb=0;lc1=1;lc2=1;lc3=1;lc4=1; }        //电梯停止

 

                        if(lch12==1)

                           {

                                 if(jylc==1)

                                           {  jd3=0;jd2=1; sb=0;jb=1; led=1; }       //电梯下降

                                        if(jylc>=2)

                                           {  jd2=0;jd3=1; sb=1;jb=0; led=0; }       //电梯上升

                           }

 

                        if(lch23==1)

                           {

                                 if(jylc<=2)

                                           {  jd3=0;jd2=1; sb=0;jb=1; led=1; }       //电梯下降

                                        if(jylc>=3)

                                           {  jd2=0;jd3=1; sb=1;jb=0; led=0; }       //电梯上升

                           }

 

                        if(lch34==1) 

                           {

                                 if(jylc<=3)

                                           {  jd3=0;jd2=1; sb=0;jb=1; led=1; }       //电梯下降

                                        if(jylc>=4)

                                           {  jd2=0;jd3=1; sb=1;jb=0; led=0; }       //电梯上升

                           }

          }

 

 

 

         

    if(lch!=lch1||fg2==1)

     {

        fg2=0;

 

        switch(lch)

         {       

           case 1:

             {

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

                    {

                        SCL=0;

                        Delay(1);

 

                       if(i==0||i==7)

                          SDA=1;

                        else

                          SDA=0;

 

                        SCL=1;

                        Delay(1);

                    }

             }    break;

          case 2:

             {

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

                    {

                        SCL=0;

                        Delay(1);

 

                       if(i==2||i==7)

                          SDA=0;

                        else

                          SDA=1;

               

                        SCL=1;

                        Delay(1);

                    }

             }    break;

           case 3:

             {

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

                    {                   

                        SCL=0;

                        Delay(1);

 

                                           if(i==2||i==4)

                          SDA=0;

                        else

                          SDA=1;

            

                        SCL=1;

                        Delay(1);

                    }

             }    break;

         case 4:

             {

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

                    {

                        SCL=0;

                        Delay(1);

                

                        if(i==1||i==5||i==4)

                          SDA=0;

                        else

                          SDA=1;

 

                        SCL=1;

                        Delay(1);

                    }

             }    break;

         

                  

         }

 

        lch1=lch;

      }

    

          

     

  }

}

 

/*------------------------------------------------

 延时函数,含有输入参数 unsigned int t,无返回值

 unsigned int 是定义无符号整形变量,其值的范围是

 0~65535

------------------------------------------------*/

void Delay(unsigned int t)

{

 while(--t);

}

 

/*------------------------------------------------

                    定时器初始化子程序

------------------------------------------------*/

void Init_Timer0(void)

{

 TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                    

 //TH0=0x00;              //给定初值

 //TL0=0x00;

 EA=1;            //总中断打开

 ET0=1;           //定时器中断打开

 TR0=1;           //定时器开关打开

}

/*------------------------------------------------

                 定时器中断子程序

------------------------------------------------*/

void Timer0_isr(void) interrupt 1

{

 

 TH0=(65536-5000)/256;                  //重新赋值 5ms

 TL0=(65536-5000)%256;

 

 num++;

 

 if(num<20)

   {

       led1=0;

           if(jd2==1&&jd3==1&&mb==0)

               led=0;

   }

 else

   {

       led1=1; 

              if(jd2==1&&jd3==1&&mb==0)

             led=1;

   } 

 

 if(mb==1)

   {

       if(num%10==0)

             led=~led;

 

           if(num==200)

             led=1;

   }

 

 if(num==200)

   { 

       num=0;

    

       num2++;       

       if(num2==60)

         { num2=0;fg2=1; }

 

       if(tz==0)      //  长按停止键   关闭总电源

         num1++;

       else

         num1=0;

 

       if(num1>2)

          jd1=0;

          

   }

 

}
关闭窗口

相关文章