全部源码下载:
C语言程序.rar
(34.08 KB, 下载次数: 84)
程序预览:
- #include "reg51.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit Up_LED = P1^0; //上行LED定义
- sbit Down_LED = P1^1; //下行LED定义
- sbit Open_LED = P1^2; //开门状态LED
- sbit First = P3^7; //1楼叫上按键
- sbit Second_Down = P3^6; //2楼叫下按键
- sbit Second_Up = P3^5; //2楼叫上按键
- sbit Third_Down = P3^4; //3楼叫下按键
- sbit Third_Up = P3^3; //3楼叫上按键
- sbit Fourth = P3^2; //4楼叫下按键
- sbit Container1 = P2^4; //电梯内1楼按键
- sbit Container2 = P2^5; //电梯内2楼按键
- sbit Container3 = P2^6; //电梯内3楼按键
- sbit Container4 = P2^7; //电梯内4楼按键
- sbit Arm = P1^3; //电梯内报警按钮
- sbit Arm_Beep = P1^4; //电梯外报警器
- sbit Moto1 = P2^0; //步进电机
- sbit Moto2 = P2^1; //步进电机
- sbit Moto3 = P2^2; //步进电机
- sbit Moto4 = P2^3; //步进电机
- uchar Key_Enable[10]; //按键存储
- uchar code Tab[]={0x14,0xD7,0x32,0x52,0xD4,0x38}; //数码管数字定义
- uchar Tab_Up[]={0,0,0}; //存储上行呼叫记录
- uchar Tab_Down[]={0,0,0}; //存储下行呼叫记录
- uchar Tab_Nei[]={0,0,0,0}; //存储电梯内部呼叫记录
- uchar Now=1; //当前所在楼层
-
- void delay_Arm(uint t) //延时函数
- {
- while(t--);
- }
- void Keyboard() //按键扫描函数
- {
- uchar i;
- if(!Key_Enable[0])if(!First){Tab_Up[0]=1;} //1楼有人按下,存储到上行呼叫表
- if(!Key_Enable[1])if(!Second_Up){Tab_Up[1]=1;} //2楼上行有人按下,存储到上行呼叫表
- if(!Key_Enable[2])if(!Third_Up){Tab_Up[2]=1;} //3楼上行有人按下,存储到上行呼叫表
- if(!Key_Enable[5])if(!Fourth){Tab_Down[2]=1; } //4楼有人按下,存储到下行呼叫表
- if(!Key_Enable[4])if(!Third_Down){Tab_Down[1]=1;} //3楼下行有人按下,存储到下行呼叫表
- if(!Key_Enable[3])if(!Second_Down){Tab_Down[0]=1;} //2楼下行有人按下,存储到下行呼叫表
- if(!Key_Enable[6])if(!Container1){Tab_Nei[0]=1;} //1楼有人按下,存储到电梯内呼叫表
- if(!Key_Enable[7])if(!Container2){Tab_Nei[1]=1;} //2楼有人按下,存储到电梯内呼叫表
- if(!Key_Enable[8])if(!Container3){Tab_Nei[2]=1;} //3楼有人按下,存储到电梯内呼叫表
- if(!Key_Enable[9])if(!Container4){Tab_Nei[3]=1;} //4楼有人按下,存储到电梯内呼叫表
- First=!Tab_Up[0]; //如果有人按下就点亮对应LED
- Second_Up=!Tab_Up[1]; //如果有人按下就点亮对应LED
- Second_Down=!Tab_Down[0]; //如果有人按下就点亮对应LED
- Third_Up=!Tab_Up[2]; //如果有人按下就点亮对应LED
- Third_Down=!Tab_Down[1];//如果有人按下就点亮对应LED
-
- Fourth=!Tab_Down[2]; //如果有人按下就点亮对应LED
- Container1=!Tab_Nei[0]; //如果有人按下就点亮对应LED
- Container2=!Tab_Nei[1]; //如果有人按下就点亮对应LED
- Container3=!Tab_Nei[2]; //如果有人按下就点亮对应LED
- Container4=!Tab_Nei[3]; //如果有人按下就点亮对应LED
- if(!Arm)
- {
- P0=Tab[5];
- delay_Arm(4000); //报警器延时
- while(!Arm); //等待按键释放
- delay_Arm(2000); //报警器延时
- while(1)
- {
- delay_Arm(100); //去抖动
- i++;
- if(i>200)
- {
- i=0;
- Arm_Beep=!Arm_Beep; //取反
- }
- if(!Arm)
- {
- Arm_Beep=1;
- break;
- }
- }
- delay_Arm(4000); //报警器延时
- while(!Arm); //等待按键释放
- delay_Arm(20000); //报警器延时
- P0=Tab[Now];
- }
- }
- void delay(uint t)
- {
- while(t--)
- Keyboard();
- }
- /**wai_flag=1代表下行wai_flag=2代表上行*********
- nei_flag=1代表内部请求,nei_flag=0代表无内部请求
- **********num第几层楼****************/
- void open(uchar wai_flag,uchar nei_flag,uchar num) //开门对应闪烁LED
- {
- uchar i;
- Open_LED=0; //点亮开门LED
- Arm_Beep=0; //蜂鸣器提示到达
- for(i=0;i<12;i++) //闪烁对应的呼叫LED
- {
- if(wai_flag==1)//如果是下行就闪烁对应楼层的LED
- {
- Tab_Down[num-2]=!Tab_Down[num-2]; //按键码处理
- Key_Enable[num+1]=1; //按键码处理
- }
- if(wai_flag==2)//如果是上行就闪烁对应楼层的LED
- {
- Tab_Up[num-1]=!Tab_Up[num-1]; //按键码处理
- Key_Enable[num-1]=1; //按键码处理
- }
- if(nei_flag==1)//如果是内部就闪烁对应楼层的LED
- {
- Tab_Nei[num-1]=!Tab_Nei[num-1]; //按键码处理
- Key_Enable[num+5]=1; //按键码处理
- }
- delay(2000);
- if(i>1)Arm_Beep=1;//关闭蜂鸣器
- }
- for(i=0;i<10;i++)Key_Enable[i]=0; //清空按键码
- if(wai_flag==1)//如果是下行就闪烁对应楼层的LED
- {
- Tab_Down[num-2]=0;
- if(num==4)Fourth=1;
- if(num==3)Third_Down=1;
- if(num==2)Second_Down=1;
- }
- if(wai_flag==2)//如果是上行就闪烁对应楼层的LED
- {
- Tab_Up[num-1]=0;
- if(num==1)First=1;
- if(num==2)Second_Up=1;
- if(num==3)Third_Up=1;
- }
- if(nei_flag==1)//如果是内部就闪烁对应楼层的LED
- {
- Tab_Nei[num-1]=0;
- if(num==1)Container1=1;
- if(num==2)Container2=1;
- if(num==3)Container3=1;
- if(num==4)Container4=1;
- }
- Open_LED=1; //关闭开门LED
-
- }
- void ting()
- {
- Moto1=Moto2=Moto3=Moto4=0; //步进电机停止转动
- }
- void zheng(uint t)
- {
- while(t--)
- {
- Moto1=1;Moto2=Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
- Moto2=Moto1=1;Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
-
- Moto2=1;Moto1=Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
- Moto3=Moto2=1;Moto1=Moto4=0; delay(15); //步进电机8个节拍循环旋转
-
- Moto3=1;Moto2=Moto1=Moto4=0; delay(15); //步进电机8个节拍循环旋转
- Moto4=Moto3=1;Moto2=Moto1=0; delay(15); //步进电机8个节拍循环旋转
-
- Moto4=1;Moto2=Moto3=Moto1=0; delay(15); //步进电机8个节拍循环旋转
- Moto4=Moto1=1;Moto2=Moto3=0; delay(15); //步进电机8个节拍循环旋转
- }
- ting();
- }
- void fan(uint t)
- {
- while(t--)
- {
- Moto4=Moto1=1;Moto2=Moto3=0; delay(15); //步进电机8个节拍循环旋转
- Moto4=1;Moto2=Moto3=Moto1=0; delay(15); //步进电机8个节拍循环旋转
-
- Moto4=Moto3=1;Moto2=Moto1=0; delay(15); //步进电机8个节拍循环旋转
- Moto3=1;Moto2=Moto1=Moto4=0; delay(15); //步进电机8个节拍循环旋转
-
- Moto3=Moto2=1;Moto1=Moto4=0; delay(15); //步进电机8个节拍循环旋转
- Moto2=1;Moto1=Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
-
- Moto2=Moto1=1;Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
- Moto1=1;Moto2=Moto3=Moto4=0; delay(15); //步进电机8个节拍循环旋转
- }
- ting();
- }
- void Upward() //电梯上行步进电机正转
- {
- Up_LED=0; //打开上行LED
- Down_LED=1; //关闭下行LED
- zheng(256);
- }
- void Downward() //电梯下行步进电机反转
- {
- Down_LED=0; //打开下行LED
- Up_LED=1; //关闭上行LED
- fan(256);
- }
- void Fourth_Process() //四楼的处理函数
- {
- if(Tab_Down[2]) //查表如果第四层外部有人按下按钮
- {
- if(Tab_Nei[3]) //查表如果第四层内部也有人按下按钮
- open(1,1,4);//第四层开门-外部进电梯
- else
- open(1,0,4);//第四层开门-外部进电梯
- Tab_Down[2]=0;//清除第四层标志
- }
-
- if(Tab_Nei[3]) //查表如果第四层内部有人按下按钮
- {
- open(0,1,4);//第四层开门-内部出电梯
- Tab_Nei[3]=0;//清除第四层轿厢标志
- }
- if(Tab_Nei[2]||Tab_Nei[1]||Tab_Nei[0])//查表看内部下行请求
- {
- Downward();
- Now = 3;//下一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Up[0]||Tab_Up[1]||Tab_Up[2]||Tab_Down[0]||Tab_Down[1]) //查表有外部有请求
- {
- Downward();
- Now = 3;//下一层
- P0=Tab[Now]; //显示当前楼层
- }
- else
- {
- Up_LED=Down_LED=1; //关闭上下行LED
- }
- }
- void Third_Process() //三楼的处理函数
- {
- if(Down_LED==0)//下行中
- {
- delay(1);
- if(Tab_Down[1])//本层有人按下下行按键
- {
- if(Tab_Nei[2]) //本层有人出电梯
- open(1,1,3);//第三层下行呼叫开门
- else
- open(1,0,3);//第三层下行呼叫开门
- Tab_Down[1]=0;//清除第三层下行标志
- }
- if(Tab_Nei[2]) //本层有人出电梯
- {
- open(0,1,3);//第三层出电梯开门
- Tab_Nei[2]=0;//清除第三层轿厢标志
- }
- if(Tab_Nei[1]||Tab_Nei[0])//内部下行请求
- {
- Downward();
- Now = 2;//下一层
- P0=Tab[Now];
- }
- else if(Tab_Up[0]||Tab_Up[1]||Tab_Down[0]) //外部请求
- {
- Downward();
- Now = 2;//下一层
- P0=Tab[Now];
- }
- else
- {
- Down_LED=1; //关闭下行LED
- Up_LED=1; //关闭上行LED
- }
- }
- else if(Up_LED==0) //上行中
- {
- if(Tab_Up[2])
- {
- if(Tab_Nei[2])//本层有人出电梯
- open(2,1,3);//第三层上行呼叫开门
- else
- open(2,0,3);//第三层上行呼叫开门
- Tab_Up[2]=0;//清除第三层上行标志
- }
- if(Tab_Nei[2]) //本层有人出电梯
- {
- open(0,1,3);//第三层出电梯开门
- Tab_Nei[2]=0;//清除第三层轿厢标志
- }
- if(Tab_Nei[3]) //查表
- {
- Upward();
- Now=4;
- P0=Tab[Now];
- }
- else if(Tab_Down[2]) //外部请求
- {
- Upward();
- Now = 4;//向上运行一层
- P0=Tab[Now]; //显示当前楼层
- }
- else
- {
- Down_LED=1; //关闭下行LED
- Up_LED=1; //关闭上行LED
- }
- }
- else //电梯停在本层
- {
- if(Tab_Down[1]) //查表
- {
- if(Tab_Nei[2]) //查表
- open(1,1,3);//第三层开门-外部进电梯
- else
- open(1,0,3);//第三层开门-外部进电梯
- Tab_Down[1]=0;//清除第三层标志
- }
- if(Tab_Up[2])//本层上
- {
- if(Tab_Nei[2]) //查表
- open(2,1,3);//第三层下行呼叫开门
- else
- open(2,0,3);//第三层下行呼叫开门
- Tab_Up[2]=0;//清除第三层下行标志
- }
-
- if(Tab_Nei[2]) //查表
- {
- open(0,1,3);//第三层开门-内部出电梯
- Tab_Nei[2]=0;//清除第三层轿厢标志
- }
- if(Tab_Nei[3]) //查表
- {
- Upward();
- Now = 4;//上一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Nei[1]||Tab_Nei[0])//内部下行请求
- {
- Downward();
- Now = 2;//下一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Up[0]||Tab_Up[1]||Tab_Down[0]) //外部请求
- {
- Downward();
- Now = 2;//下一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Down[2]) //查表
- {
- Upward();
- Now = 4;//上一层
- P0=Tab[Now]; //显示当前楼层
- }
- }
-
- }
- void Second_Process() //二楼的处理函数
- {
- if(Down_LED==0)//下行中
- {
- if(Tab_Down[0])//本层下
- {
- if(Tab_Nei[1]) //本层有人出电梯
- open(1,1,2);//第二层下行呼叫开门
- else
- open(1,0,2);//第二层下行呼叫开门
- Tab_Down[0]=0;//清除第二层下行标志
- }
-
- if(Tab_Nei[1]) //本层有人出电梯
- {
- open(0,1,2);//第二层出电梯开门
- Tab_Nei[1]=0;//清除第二层轿厢标志
- }
-
- if(Tab_Nei[0])//内部下行请求
- {
- Downward();
- Now = 1;//下一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Up[0]) //外部请求
- {
- Downward();
- Now = 1;//下一层
- P0=Tab[Now]; //显示当前楼层
- }
- else
- {
- Down_LED=1; //关闭下行LED
- Up_LED=1; //关闭上行LED
- }
- }
- else if(Up_LED==0) //上行中
- {
- if(Tab_Up[1]) //查表
- {
- if(Tab_Nei[1]) //本层有人出电梯
- open(2,1,2);//第二层上行呼叫开门
- else
- open(2,0,2);//第二层上行呼叫开门
- Tab_Up[1]=0;//清除第二层上行标志
- }
- if(Tab_Nei[1]) //本层有人出电梯
- {
- open(0,1,2);//第二层出电梯开门
- Tab_Nei[1]=0;//清除第二层轿厢标志
- }
- if(Tab_Nei[2]||Tab_Nei[3]) //轿厢内有人去3或4楼
- {
- Upward();
- Now=3; //向上运行一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Down[2]||Tab_Down[1]||Tab_Up[2]) //外部请求
- {
- Upward();
- Now = 3;//向上运行一层
- P0=Tab[Now]; //显示当前楼层
- }
- else
- {
- Down_LED=1; //关闭下行LED
- Up_LED=1; //关闭上行LED
- }
- }
- else //电梯停在本层
- {
- if(Tab_Down[0])
- {
- if(Tab_Nei[1])
- open(1,1,2);//第二层开门-外部进电梯
- else
- open(1,0,2);//第二层开门-外部进电梯
- Tab_Down[0]=0;//清除第二层标志
- }
- if(Tab_Up[1])//本层上
- {
- if(Tab_Nei[1])
- open(2,1,2);//第二层下行呼叫开门
- else
- open(2,0,2);//第二层下行呼叫开门
- Tab_Up[1]=0;//清除第二层下行标志
- }
-
- if(Tab_Nei[1])
- {
- open(0,1,2);//第二 层开门-内部出电梯
- Tab_Nei[1]=0;//清除第二层轿厢标志
- }
- if(Tab_Nei[2]||Tab_Nei[3])
- {
- Upward();
- Now = 3;//上一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Nei[0])//内部下行请求
- {
- Downward();
- Now = 1;//下一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Up[0]) //外部请求
- {
- Downward();
- Now = 1;//下一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Down[1]||Tab_Down[2]||Tab_Up[2])
- {
- Upward();
- Now = 3;//上一层
- P0=Tab[Now]; //显示当前楼层
- }
- }
- }
- void First_Process() //一楼的处理函数
- {
- if(Tab_Up[0]) //查表
- {
- if(Tab_Nei[0]) //查表
- open(2,1,1);//第一层开门-外部进电梯
- else
- open(2,0,1);//第一层开门-外部进电梯
- Tab_Up[0]=0;//清除第一层标志
- }
-
- if(Tab_Nei[0]) //查表
- {
- open(0,1,1);//第一层开门-内部出电梯
- Tab_Nei[0]=0;//清除第一层轿厢标志
- }
- if(Tab_Nei[2]||Tab_Nei[1]||Tab_Nei[3])//内部上行请求
- {
- Upward();
- Now = 2;//向上运行一层
- P0=Tab[Now]; //显示当前楼层
- }
- else if(Tab_Up[1]||Tab_Up[2]||Tab_Down[0]||Tab_Down[1]||Tab_Down[2]) //外部请求
- {
- Upward(); //打开上行LED
- Now = 2;//向上运行一层
- P0=Tab[Now]; //显示当前楼层
- }
- else
- {
- Up_LED=Down_LED=1; //关闭上下行LED //关闭下行LED
- }
- }
- void main()
- {
- P0=Tab[Now];//开机电梯在1楼
- while(1)
- {
- Keyboard(); //扫描键盘
- P0=Tab[Now]; //显示当前楼层
- if(Now==4)//电梯在4楼处理方法
- {
- Fourth_Process();
- }
- if(Now==3) //电梯在3楼处理方法
- {
- Third_Process();
- }
- if(Now==2) //电梯在2楼处理方法
- {
- Second_Process();
- }
- if(Now==1) //电梯在1楼处理方法
- {
- First_Process();
- }
- }
- }
复制代码
|