Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (48.57 KB, 下載次數: 53)
下載附件
2020-11-24 17:09 上傳
51hei.png (30.54 KB, 下載次數: 43)
下載附件
2020-11-24 17:09 上傳
51hei.png (8.46 KB, 下載次數: 46)
下載附件
2020-11-24 17:09 上傳
單片機源程序如下:
- #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)
2020-11-24 09:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|