历史上的今天
今天是:2025年01月28日(星期二)
2020年01月28日 | 单片机电梯控制器代码
2020-01-28 来源:51hei
单片机电梯控制器电路原理图如下:
单片机源程序如下:
#include #include unsigned char ucMotorDrvPuls; //电机运转时初始值 unsigned char FORREV=1; //1表示上行,0表示下行 unsigned char STOPCUR=0;//1电梯停留在当前层,0不停留 unsigned char CURFLR=1; //当前所在楼层 unsigned char count=0; //累计到COUNT即表示运行过一层 #define UCTIMES 8 //设置电机转速 #define OUTPUT P2 //电机驱动信号口 #define COUNT 8 //电机每循环8次表示电梯经过一层楼 sbit UP1=P3^4; sbit DOWN2=P3^3; sbit UP2=P3^2; sbit DOWN3=P3^1; sbit UP3=P3^0; sbit DOWN4=P1^7; sbit FLOOR1=P1^0; sbit FLOOR2=P1^1; sbit FLOOR3=P1^2; sbit FLOOR4=P1^3; sbit START=P1^4; sbit STOP=P1^5; sbit ALARM=P1^6; //报警位 sbit alarmBit=P0^4; sbit upLight=P0^5; sbit downLight=P0^6; void time(unsigned int ucMs);//延时单位:ms void outPress();//按下电梯外按钮 unsigned char inPress();//按下电梯内楼层按钮 unsigned char elevator();//到达某一层返回1,否则返回0 void storeUP(unsigned char);//存储当前所有上行请求 void storeDOWN(unsigned char);//存储当前所有下行请求 //延时函数 void time(unsigned int ucMs); //初始化所有灯 void initLights(void); //设置当前楼层 void setFloor(int floor); //设置电梯向上运行灯 void setUpLight(); //设置电梯向下运行灯 void setDownLight(); //设置电梯停止运行灯 void setStopLight(); //设置电梯向上运行灯 void setAlarmLight(); //设置电梯报警灯和喇叭 void setAlarmLight(); //关闭电梯报警灯和喇叭 void offAlarmLight(); //报警开关 int alarmSwitch=1; unsigned char UP_req[5]={0,0,0,0,0}; //上行请求 unsigned char DOWN_req[5]={0,0,0,0,0}; //下行请求 //电机定位 void position(void) { OUTPUT=0x01|(P2&0xf0);time(200); OUTPUT=0x02|(P2&0xf0);time(200); OUTPUT=0x04|(P2&0xf0);time(200); OUTPUT=0x08|(P2&0xf0);time(200); ucMotorDrvPuls=0x11; OUTPUT=0x01|(P2&0xf0); } /****************************************/ /* 主函数 */ /****************************************/ void main(void) { time(100); initLights(); position();//电机定位 ucMotorDrvPuls=0x11; OUTPUT=0x00|(P2&0xf0);//电机停止 setFloor(CURFLR); setUpLight(); time(100); while(1)//主循环 { outPress();//按下电梯外按钮 while(STOPCUR==1)//电梯在当前层,电梯不动,可以继续接受请求 { outPress(); inPress(); } if(inPress())//按下电梯内楼层按钮 { while(START)//等待启动按键按下,电梯不动,可以继续接受请求 { outPress(); inPress(); } } while(1)//电机运转循环 { if(UP_req[1]==0&&UP_req[2]==0&&UP_req[3]==0&& DOWN_req[2]==0&&DOWN_req[3]==0&&DOWN_req[4]==0) { break;//没有请求,跳出电机运转循环,电梯不动 } if(FORREV)//上行 { setUpLight();//上行灯亮 if(STOPCUR==1){break;}// if(elevator())//往上到达某一层 { if(CURFLR==4) {setDownLight();break;}//到达四楼 } OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0); ucMotorDrvPuls=_crol_(ucMotorDrvPuls,1); } if(!FORREV)//下行 { setDownLight();//下行灯亮 ; if(STOPCUR==1){break;} if(elevator())//往下到达某一层 { if(CURFLR==1) {setUpLight();break;}//到达一楼 } OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0); ucMotorDrvPuls=_cror_(ucMotorDrvPuls,1); } outPress();//按下电梯外按钮 //if(inPress())//按下电梯内楼层按钮 //{ // while(START)//等待启动按键按下 //{ // outPress(); inPress();//电梯运行时,内部按钮按下,无需按启动按钮 // } //} time(380-UCTIMES*16); ////////// }//end while-电机运转循环 OUTPUT=0x00|(P2&0xf0);//电机停止,有请求时按下启动按钮启动 }//end while-主循环 } /****************************************/ /* 按钮事件 */ /****************************************/ //按下电梯外按钮 void outPress() { //FORREV=1; if(!UP1)//1楼上 { storeUP(1); if(CURFLR>1&&STOPCUR==1)//电梯不在一楼,且当前没其他请求,电梯马上自动启动 { FORREV=0;//向下运行 STOPCUR=0; } if(CURFLR==1) { STOPCUR=1;//电梯停留在当前层 } } if(!UP2)//2楼上 { storeUP(2); if(CURFLR>2&&STOPCUR==1)//电梯在二楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<2&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==2) { STOPCUR=1; } } if(!UP3)//3楼上 { storeUP(3); if(CURFLR>3&&STOPCUR==1)//电梯在三楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<3&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==3) { STOPCUR=1; } } if(!DOWN2)//2楼下 { storeDOWN(2); if(CURFLR>2&&STOPCUR==1)//电梯在二楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<2&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==2) { STOPCUR=1; } } if(!DOWN3)//3楼下 { storeDOWN(3); if(CURFLR>3&&STOPCUR==1)//电梯在三楼以上 { FORREV=0; STOPCUR=0; } if(CURFLR<3&&STOPCUR==1) { FORREV=1; STOPCUR=0; } if(CURFLR==3) { STOPCUR=1; } } if(!DOWN4)//4楼下 { storeDOWN(4); if(CURFLR<4&&STOPCUR==1) { FORREV=1; STOPCUR=0;
史海拾趣
|
单片机的外部结构: 1、 DIP40双列直插; 2、 P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平) 3、 电源VCC(PIN40)和地线GND(PIN20); 4、 高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位) ...… 查看全部问答> |
|
在WinCE上,EVC或其它开发工具,如何写多种语言(中英等多国语言)版程序 请问, 在WinCE上,EVC或其它开发工具,如何写多种语言(中英等多国语言)版程序? 请给一些思路. 谢谢.… 查看全部问答> |
|
在arm板上写个sd卡的驱动。操作系统:linux .(C语言) 问题: 1:c语言中是如何操作寄存器,比如,知道一个寄存器的物理地址,知道它的每一位的作用。C语言下如何进行对它的操作。 2:arm ...… 查看全部问答> |
|
现在很多芯片只能在CCSv4上支持,但是CCSv4已经和CCSv3.3是完全不同的架构,是基于eclipse架构的。所以调试界面与CCSv3.3是完全不同的。 TI有CCSv4的培训视频链接http://e2e.ti.com/cn/media/p/2090.aspx。 主要还是需要亲自调试,多使用。个人觉 ...… 查看全部问答> |
|
ZigBee协调器网络的建立 一、协调器网络的建立 1、 网络的格式化 A:初始化的能量阀值为16。通过设置ZDApp_event_loop任务中的事件ID为ZDO_NETWORK_INIT以便执行B。 ...… 查看全部问答> |
|
采样率1M以上,而信号的频率范围仅37k——43k,FFT会算出大量的零,请问有办法进计算指定范围的频谱吗? 目前硬件是STM32F103ZET6,可以加硬件的。 谢谢!… 查看全部问答> |




