Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- #include<reg52.h> //包含头文件
- #define uint unsigned int //宏定义
- #define uchar unsigned char
- sbit led1=P1^2; //定义led控制端口
- sbit led2=P1^3;
- sbit led3=P1^4;
- sbit led4=P1^5;
- sbit led5=P1^6;
- sbit led6=P1^7;
- sbit led7=P1^1;
- sbit led8=P1^0;
- sbit beef=P2^7; //定义蜂鸣器
- sbit ww1=P2^6; //电机控制端口
- sbit ww2=P2^5;
- sbit floor1=P3^0; //楼层控制按键
- sbit floor2=P3^1;
- sbit floor3=P3^2;
- sbit floor4=P3^3;
- sbit floor5=P3^7;
- sbit floor6=P3^6;
- sbit shang=P3^5; //上下模式控制按键
- sbit xia =P3^4;
- //全局变量控制端口
- uint num,miao,ceng=1,moshi=0,a[6],b[6],jishu=0,shangorxia=0;
- uint floor=1,cishu=0,c[6]={0,4,8,12,16,20},i=0; //floor楼层,cishu键盘按键按下次数
- uint time1,time2,time3,miaoshu=0;
- uint s1=0,s2=0,s3=0,s4=0,s5=0,s6=0;
- //数码管显示
- uchar code table[]={0xf9,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
- 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
- void xianshifloor(); //楼层显示函数声明
- /***********************************************************
- ====================延时函数函数===========================
- ************************************************************/
- void delay(uint xms) //简单延时
- {
- uint o,j;
- for(o=xms;o>0;o--) for(j=110;j>0;j--);
- }
- /***********************************************************
- ====================蜂鸣器控制函数===========================
- ************************************************************/
- void beefring() //蜂鸣器控制函数
- {
- beef=1; delay(500); beef=0;
- }
- /***********************************************************
- =================电机控制各子函数===========================
- ************************************************************/
- void up() //电机上
- {
- ww1=1; ww2=1;
- }
- void down() //电机下
- {
- ww1=1; ww2=1;
- }
- void stop() //电机停止
- {
- ww1=0; ww2=0;
- }
- /***********************************************************
- ====================定时器0,1初始化函数=====================
- ************************************************************/
- void initclock() //定时器0/1控制初始化函数
- {
- TMOD=0x11; //定义定时器0/1为定时器模式
- TH0=(65536-50000)/256;//50ms初值
- TL0=(65536-50000)%256;
- ET0=1; //开定时器
- TR0=1; //启动定时器T0
- TH1=(65536-50000)/256;//50ms初值
- TL1=(65536-50000)%256;
- ET1=1; //开T1中断
- TR1=1; //启动T1
- EA=1; //开中断
- num=0; miao=0; floor=0;
- }
- /***********************************************************
- ====================用于控制模式选择函数===========================
- ************************************************************/
- void moshitest() //用于确定是上行还是下行
- {
- if(shang==0) //上行键按下
- {
- delay(5); //延时消抖
- if(shang==0) //再判
- {
- while(!shang);//等待释放
- initclock(); //初始化定时器
- P0=0xfe;
- moshi=1; //上行标志
- //xianshifloor();
- TH0=(65536-50000)/256; TL0=(65536-50000)%256;
- time1=0; time2=0;
- led7=0; delay(2500); led7=1;
- led8=0; delay(1000); led8=1;
- while(time2!=1); ////不到4秒
- TR1=1;
- miao=0; miaoshu=0;
- initclock();
- }
- }
- if(xia==0) //下行键按下
- {
- delay(5);
- if(xia==0)
- {
- while(!xia);
- initclock();
- moshi=2; //下行标志
- initclock();
- P0=0xf7;
- //xianshifloor();
- TH0=(65536-50000)/256; TL0=(65536-50000)%256;
- time1=0; time2=0;
- led7=0; delay(2500); led7=1;
- led8=0; delay(1000); led8=1;
- while(time2!=1);//不到4秒
- TR1=1;
- miao=0; miaoshu=0;
- initclock();
- }
- }
- }
- /***********************************************************
- ====================键盘检测函数===========================
- 在此函数中根据检测的先后顺序使其哪个键盘按下的先后顺序存在数组a【】中
- ****************************************************************/
- void keyscan() //判断哪个按键按下放在数组a[]中
- {
- if(floor1==0) //1层按钮按下
- {
- delay(2);
- if(floor1==0){while(!floor1);
- led1=0; //1层指示灯亮
- if(s1==0)
- {
- if(moshi==2)
- {
- if((6-floor)>1){a[i++]=1;cishu++;}
- }
- s1=2;
- }
- }
- }
- if(floor2==0) //2层按钮按下
- {
- delay(2);
- if(floor2==0){ while(!floor2);
- led2=0; //2层指示灯亮
- if(s2==0)
- {
- if(moshi==1)
- {
- if(floor<2){a[i++]=2; cishu++; }
- }
- if(moshi==2)
- {
- if((6-floor)>2){a[i++]=2;cishu++;}
- }
- s2=2;
- }
- }
- }
- if(floor3==0)//3层按钮按下
- {
- delay(2);
- if(floor3==0){while(!floor3);
- led3=0; //3层指示灯亮
- if(s3==0)
- {
- if(moshi==1)
- {
- if(floor<3){a[i++]=3;cishu++;}
- }
- if(moshi==2)
- {
- if((6-floor)>3){a[i++]=3;cishu++;}
- }
- s3=2;
- }
- }
- }
- if(floor4==0)//4层按钮按下
- {
- delay(2);
- if(floor4==0){while(!floor4);
- led4=0; //4层指示灯亮
- if(s4==0)
- {
- if(moshi==1)
- {
- if(floor<4){a[i++]=4;cishu++;}
- }
- if(moshi==2)
- {
- if((6-floor)>4){a[i++]=4;cishu++;}
- }
- s4=2;
- }
- }
- }
- if(floor5==0)//5层按钮按下
- {
- delay(2);
- if(floor5==0){while(!floor5);
- led5=0; //5层指示灯亮
- if(s5==0)
- {
- if(moshi==1)
- {
- if(floor<5){a[i++]=5;cishu++;}
- }
- if(moshi==2)
- {
- if((6-floor)>5){a[i++]=5; cishu++;}
- }
- s5=2;
- }
- }
- }
- if(floor6==0)//6层按钮按下
- {
- delay(2);
- if(floor6==0){while(!floor6);
- led6=0; //6层指示灯亮
- if(s6==0)
- {
- if(moshi==1)
- {
- if(floor<6){a[i++]=6;cishu++;}
- }
- /* if(moshi==2)
- {
- if(6-floor>5)
- {
- a[i++]=6;
- cishu++;
- }
- } */
- s6=2;
- }
- }
- }
- }
- /************************************************************
- ====================对a[]函数进行排序======================
- *************************************************************/
- void paixu()
- {
- uint u,k,p,m;
- if(moshi==1) //上行
- {
- a:
- keyscan();
- up();
- for(u=0;u<cishu;u++) //使用冒泡法进行排序
- {
- if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
- {
- goto a;
- }
- up();
- // P0=table[a[u]];
- // delay(500);
- for(k=u;k<cishu;k++)
- {
- if(a[u]>a[k])
- {
- p=a[u];
- a[u]=a[k];
- a[k]=p;
- up();
- //P0=table[a[u]];
- // delay(500);
- if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
- { goto a;
- }
- }
- }
- }
- up();
- for(m=0;m<cishu;m++)
- {
- up(); //上行
- if((a[m]*4)==miaoshu)
- {
- // P0=table[a[m]];
- // delay(500);
- stop();
- if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
- {
- goto a;
- }
- xianshifloor(); //显示楼层
- TR1=0;
- beefring(); //蜂鸣器响
- TH0=(65536-50000)/256; TL0=(65536-50000)%256;
- time1=0; time2=0;
- led7=0; delay(2500); led7=1;
- led8=0; delay(1500); led8=1;
- if(a[m]==1) { led1=1; }
- if(a[m]==2) { led2=1; }
- if(a[m]==3) { led3=1; }
- if(a[m]==4) { led4=1; }
- if(a[m]==5) { led5=1; }
- if(a[m]==6) { led6=1; }
- while(time2!=1);//不到4秒
- TR1=1;
- up(); //上行
- delay(1500);
- }
- }
- up();
- if(floor==6)
- {
- led7=0; //下行灯亮
- beefring(); //蜂鸣器响
- stop(); //电机停转
- while(1){ xianshifloor(); } //显示楼层
- }
- }
- if(moshi==2)//下行
- {
- b:
- keyscan(); //键扫描
- down(); //下行
- for(u=0;u<cishu;u++) //使用冒泡法进行排序
- {
- if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
- {
- goto b;
- }
- down();
- for(k=u;k<cishu;k++)
- {
- if(a[u]<a[k])
- {
- p=a[u];
- a[u]=a[k];
- a[k]=p;
- down();
- if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
- {
- goto b;
- }
- }
- }
- }
- down();//下行
- for(m=0;m<cishu;m++)
- {
- down();
- if((a[m]*4)==(24-miaoshu))
- {
- if(floor1==0||floor2==0||floor3==0||floor4==0||floor5==0||floor6==0)
- {
- goto b;down();
- }
- down(); //下行
- stop(); //停转
- xianshifloor();//显示楼层
- TR1=0; beefring();
- TH0=(65536-50000)/256; TL0=(65536-50000)%256;
- time1=0; time2=0;
- led7=0; delay(2500); led7=1;
- led8=0; delay(1500); led8=1;
- if(a[m]==1){led1=1; } //到1层,指示灯灭
- if(a[m]==2){led2=1; } //到2层,指示灯灭
- if(a[m]==3){led3=1; } //到3层,指示灯灭
- if(a[m]==4){led4=1;} //到4层,指示灯灭
- if(a[m]==5){led5=1; } //到5层,指示灯灭
- if(a[m]==6){led6=1; } //到6层,指示灯灭
- while(time2!=1); //不到4秒
- TR1=1; //启动T1
- down(); //下行
- delay(1300);//延时
- }
- }
- if(floor==6)
- {
- led7=0; //下行灯亮
- beefring(); //蜂鸣器响
- stop(); //电机停转
- while(1){ xianshifloor(); } //显示楼层
- }
- }
- }
- /**************************************************************
- ===========================显示楼层函数=======================
- **************************************************************/
- void xianshifloor()
- {
- if(moshi==1){ P0=table[floor]; delay(5); } //显示上行楼层
- if(moshi==2){P0=table[6-floor]; delay(5); } //显示下行楼层
- }
- /*****************************************************************
- =============================主函数=================================
- ********************************************************************/
- void main()
- {
- P1=0xff; //所有楼层指示灯灭
- initclock(); //初始化定时器
- P2=0x00;
- P0=0x00; //数码管全显示
- while(1)
- {
- moshitest();//模式测试
- xianshifloor();//显示楼层
- keyscan(); //按键扫描
- paixu(); //排序
- }
- }
- /****************************************************************
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
51电梯控制器.zip
(1.11 MB, 下载次数: 58)
|