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

发布者:明月昊天最新更新时间:2015-05-25 来源: 51hei关键字:单片机  电梯控制 手机看文章 扫描二维码
随时随地手机看文章
#include //包含头文件,一般情况不需要改动,
 
                  //头文件包含特殊功能寄存器的定义
 
 
 
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;      //  继电器停止通电  电梯停止
 
          }
 
[page]
 
    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
 
                           {  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;
 
          
 
   }
 
 
 
}
关键字:单片机  电梯控制 引用地址:基于单片机的电梯控制程序

上一篇:51单片机的七彩LED灯渐变调光调色程序
下一篇:51单片机电子时钟程序

推荐阅读最新更新时间:2024-03-16 14:03

PIC单片机编程 (点灯程序)
IO口控制 方向寄存器 TRISA~TRISAE 比如 TRISB=0x00; // 1为输入,0为输出,这样就把portB端口全部设为输出 数据寄存器 PORTA~PORTE 比如 PORTB=0x01; // 1为置高,0为置低,这样就把portB1口置高,其它portB口置低 例:点灯程序 #include pic.h __CONFIG (0x3B31);// pic单片机需要进行寄存器配置,详见手册 void main() { TRISD=0xfe; // 把RD1端口设为输出 PORTD=0x01; // 把RD1端口置高 //RD1=1;
[单片机]
51单片机基于定时器0的硬件延时代码
1 //晶振的频率 2 #define OSC_FREQ (11059200UL) 3 4 //每个指令的振荡周期数(4,6,12),注意,这里一定要仔细查看芯片手册 5 //*12 - 早期的8051、8052及当前的绝大部分51单片机 6 //*6 - Philips 的芯片 7 //*4 - Dallas 8 #define OSC_PER_INST (12) 9 10 //TIME 为定时时间 单位MS 11 #define PRELOAD1MS (65536 - 1*(UINT16)(OSC_FREQ/(OSC_PER_INST*1000))) 12 #define PRELOAD5MS (65536
[单片机]
PIC单片机ADC的简单应用
#include pic.h __CONFIG(0X1F71); #define uchar unsigned char #define uint unsigned int const uchar Tab = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; const uchar Tab1 = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//带小数点的代码 void DisPlay(uchar date1,uchar date2,uchar date3,uchar date4); void DelayMS(uin
[单片机]
单片机反汇编是什么?
工程师编写单片机程序的时候一般是采用用汇编语言或高级语言(C或C++)编写的,这些程序代码叫原代码,当程序编写完成后,经过编译软件或编译器 的编译生成可以烧录到单片机ROM存储区里的文件,不同型号的单片机的编译器生成的文件后缀是不同的,但是常用的BIN和HEX文件,这些生成的文件在解 密行业里叫机器代码,及机器码,这样的机器码是在单片机里运行的,也可以说是只有机器能够读懂的。而反汇编即是指将这些执行文件,即机器码反编译还原成汇 编语言。但通常反编译出来的程序与原程序会存在许多不同,虽然执行效果相同,但程序代码会发生很大的变化,如果是语句比较多的汇编,一般人很难读懂,需要 自己加注释,然后去一条一条的读,是需要一定的毅力的,我曾经为
[单片机]
C8051F410单片机最小系统电路图
系统对单片机时钟的精度和温度稳定度都没有特别要求,可以直接使用C8051F410 单片机内部自带的时钟振荡器,而无需外接振荡器。使用时要注意的是,是芯片工作电源是从Vregin 引脚引入( + 3. 3V) ,VDD 是内部基准电压输出引脚,VIO 是I /O 口作为数字引脚时的电源输入引脚。电路设计时必需在紧靠这3 个引脚的位置布上滤波和退耦电容( 4. 7μ 和104p) .P1. 0~ P1. 3 是显示屏的控制线CLK、SCLK、R 和OE; P1. 7、P0. 0 ~ P0. 2是字库芯片控制线,采用SPI 接口; P2. 0 和P2. 1 是显示屏的行扫控制线A 和B; P0. 4 和P0. 5 是串口通信线,与蓝
[单片机]
C8051F410<font color='red'>单片机</font>最小系统电路图
基于MAX195转换器和AT89C51单片机实现应用接口的设计
MAX195是16位逐次逼近方式的ADC。它将高精度、高速度、低电源功耗(消耗电流仅10μA)的关闭方式等性能结合在一起。内部校准电路对线性度与偏置误差进行校正,所以无需外部调整便可达到全部额定的性能指标。电容性的DAC结构使之具有特有的85kbps跟踪/保持功能,变换时间仅需9.4μs。三态串行数据输出及引脚可选的单极性(0~VREF)或双极性(-VREF~+VREF)的输入范围使之可广泛应用于便携式仪表、医用信号采集及多传感器测量等系统中。 1 MAX195引脚及说明 MAX195有16个引脚,其排列如图1所示。 2 MAX195转换原理及时序 MAX195片内含有电容性的数字模拟变换器(DAC),可对模拟输入进行特有
[单片机]
基于MAX195转换器和AT89C51<font color='red'>单片机</font>实现应用接口的设计
20天89C51单片机总结
看了怎么久的单片机做个总结。其实就芯片来说单片机没想象的那么复杂!89C51就40个引脚。其中P0~P3口占了32个。一个接地一个接电源,两个振荡引脚。一个EA引脚ROM的起始地址选择端。一个ALE/Vpp片外地址锁存器充许引脚/线编程电源输入端。PSEN片外ROM充许使能端。当然还有个复位REST引脚。其中P3口全部都有第2功能复用:定时 中断 串行口中断。当P0~P3端口写#FFH时片内锁存器置1这是单口为双向输入 输出口。这是从芯片外围看。 从芯片的内部看的话主要的就两个独立的存储器 ROM,RAM 一个为程序指示,一个为数据处理和存放。编程时通过寻址方式区别ROM,RAM。他们都为64KB的容量。ROM的片内为4KB存储
[单片机]
基于ARM单片机的装载机障碍物监测预警系统设计
1 引言   随着信息化、智能化、网络化的发展,嵌入式系统技术获得广阔的发展空间,工业控制领域也进行着一场巨大的变革,以32位高端处理器为平台的实时嵌入式软硬件技术将应用在工业控制的各个角落。嵌入控制器因其体积小、可靠性高、功能强、灵活方便等许多优点,其应用已深入到工业、农业、教育、国防、科研以及日常生活等各个领域,对各行各业的技术改造、产品更新换代、加速自动化化 进程、提高生产率等方面起到了极其重要的推动作用 。   现今,国内外虽有部分车辆安装了超声波倒车防撞报警装置、基于DSP的智能车辆防撞系统、图像处理技术的汽车追尾预警系统等,但是用于像装载机这种广泛用于城建、矿山、公路等工程的工程机械的障碍物监测预警系统却没有发现。
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved