stm32控制的四層電梯設(shè)計原理與程序代碼_第1頁
stm32控制的四層電梯設(shè)計原理與程序代碼_第2頁
stm32控制的四層電梯設(shè)計原理與程序代碼_第3頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

stm32與程序代碼列出這個設(shè)計中要用到的STM32的各個引腳及實際用途如表(1)所示,硬件電路圖如圖(2)控制要求總體控制要求:電梯由安裝在各樓層電梯口的上升下降呼叫按鈕(U1U2U3D3D4,電梯轎廂內(nèi)樓層選擇按鈕(S1、S2、S3、S4,上升下降指示(UPDOWN,各樓層到位行程開關(guān)(SQ1、SQ2、SQ3SQ4)組成。電梯自動執(zhí)行呼叫。電梯在上升的過程中只響應(yīng)向上的呼叫,在下降的過程中只響應(yīng)向下的呼叫,電梯向上或向下的呼叫執(zhí)行完成后再執(zhí)行反向呼叫。電梯停止運行等待呼叫時,同時有不同呼叫時,誰先呼叫執(zhí)行誰。具有呼叫記憶、內(nèi)選呼叫指示功能。具有樓層顯示、方向指示、到站聲音提示功能。設(shè)計中用到的各引腳分布:輸入B11->B14一層到四層的內(nèi)選按鈕輸入B8->B10二層到四層的下呼按鈕輸入B5->B7一層到三層的上呼按鈕輸入B1->B4行程控制輸出C12->C15當(dāng)前樓層指示輸出C11橋箱下降指示輸出C10橋箱上升指示輸出C6->C9一層到四層的內(nèi)選指示燈輸出C3->C5二層到四層的下呼指示燈輸出C0->C2一層到三層的上呼指示燈輸出D12八音盒,到站聲輸出D8->D11數(shù)碼管的控制端子表(1)硬件電路圖如下圖所示:up1up1DS1abcdDPYafgbc0c1c2c3reachfeefgcc4c5c6c7c8c9c10c11c12c13c14c15C7VSAVDDAD0/S1ND1/SOUTnRTD12D8D9D10D11VDDVSSb1b2b3b4b5b6b7b8b9b10b11b12b13b14d[LEDgn]DPYagbdc[LEDgn]d8d9d10d117126ABCDabcdefgDPYagb3.3v345LT9e15f14g567ee cfgd[LEDgn]c6 fnow1c12a1DS2ab2bc3cfd4de5eef6fup2c1up2c1insl2tc7fnow2c13up3c2insl3tc8fnow3c14down2c3insl4tc9fnow4c15down3c4upingc10down4c5downnigc11g7gDS313a1a12b2b11c3cf10d4dgo1go2go3go4up1up2down2down3down4go1go2go3go4up1up2down2down3down4b1 b6b2 b7b3 b8b4 b9b10

3.3

v

105

74L48DS4abcdDPYafgbeefgdc[LEDgn]inslt1b11inslt2b12inslt3b13inslt4b14

VCC VCC程序的流程圖如圖(3

圖(2)開始開始程序的初始化判斷電梯當(dāng)前的樓層并顯示有無需要電N梯的樓層Y上下前方向Y當(dāng)前層是不當(dāng)前層是不Y是欲至層或是欲至層或下呼層上呼層開門延時開門延時并顯示NN并顯示NN反向上面層有無需下面層有無需反向要電梯的樓層要電梯的樓層YY上移一層下移一層并顯示并顯示圖(3)程序代碼如下:#include"stm32f10x_lib.h"#include"stdio.h"voidRCC_Configuration(void); //時鐘配置函數(shù)voidGPIO_Configuration(void); //I/Ovoidask_Scan(void);voiddelay(vu32Count); // 延時unsignedcharinslt[4]={0},dnask[3]={0},upask[3]={0},fnow[4]={0};signedcharnnum=0,dnnum=0,upnum=0,innum=0,i=0;//inslt[4]四層內(nèi)選,dnask下呼請求,upask[3]上呼請求,fnow當(dāng)前樓層u8updnFlag=0; //上呼與下呼標(biāo)main(void){#ifdefDEBUGdebug();#endifRCC_Configuration();GPIO_Configuration();GPIO_ResetBits(GPIOC,GPIO_ResetBits(GPIOC,GPIO_ResetBits(GPIOC,GPIO_Pin_2); //GPIO_ResetBits(GPIOC,GPIO_Pin_3);GPIO_ResetBits(GPIOC,GPIO_Pin_4);GPIO_ResetBits(GPIOC,GPIO_Pin_5); //GPIO_ResetBits(GPIOC,GPIO_Pin_6);GPIO_ResetBits(GPIOC,GPIO_Pin_7);GPIO_ResetBits(GPIOC,GPIO_Pin_8);GPIO_ResetBits(GPIOC,GPIO_Pin_9); //各層的內(nèi)選請求清零GPIO_ResetBits(GPIOC,GPIO_Pin_10);GPIO_ResetBits(GPIOC,GPIO_Pin_11);GPIO_ResetBits(GPIOC,GPIO_Pin_12);GPIO_ResetBits(GPIOC,GPIO_Pin_13);GPIO_ResetBits(GPIOC,GPIO_Pin_14);

//橋箱上升請求清零//橋箱下降請求清零GPIO_ResetBits(GPIOC,GPIO_Pin_15); //GPIO_ResetBits(GPIOD,GPIO_Pin_8);GPIO_ResetBits(GPIOD,GPIO_Pin_9);GPIO_ResetBits(GPIOD,GPIO_Pin_10);GPIO_ResetBits(GPIOD,GPIO_Pin_11); //GPIO_ResetBits(GPIOD,GPIO_Pin_12); //到站聲清零while(1){void wait_display_scan(void) //等待狀態(tài)掃描{ void nowfloor_scan(void) //掃描當(dāng)前電梯所在的樓層{ if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1){fnow[0]=1;nnum=1;}if(GPIO_ReadIntputDataBit(GPIOB,GPIO_Pin_2)==1){fnow[1]=1;nnum=2;}if(GPIO_ReadIntputDataBit(GPIOB,GPIO_Pin_3)==1){fnow[2]=1;nnum=3;}if(GPIO_ReadIntputDataBit(GPIOB,GPIO_Pin_4)==1){fnow[3]=1;nnum=4;}}void nowfloor_display(void){ switch(nnum){case1:GPIO_SetBits(GPIOC,GPIO_Pin_6); //第一層指示燈GPIO_Write(GPIOD,0x01<<8); //顯示第一層break;case2:GPIO_SetBits(GPIOC,GPIO_Pin_7); //2層指示燈亮GPIO_Write(GPIOD,0x02<<8); //2break;case3:GPIO_SetBits(GPIOC,GPIO_Pin_8); //3層指示燈亮GPIO_Write(GPIOD,0x03<<8); //3層break;case4:GPIO_SetBits(GPIOC,GPIO_Pin_9);//第4層指示燈亮GPIO_Write(GPIOD,0x04<<8); //顯示第4層break;}}voidask_scan(void) //判斷有沒有上呼、下呼、內(nèi)選請求{if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1){upask[0]=1;upnum=1;updnFlag==0;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1){upask[1]=1;upnum=2;updnFlag==0;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1){upask[1]=1;upnum=3;updnFlag==0;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1){dnask[0]=1;upnum=2;updnFlag==1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1){dnask[1]=1;upnum=3;updnFlag==1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1){dnask[2]=1;upnum=4;updnFlag==1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==1){inslt[0]=1;innum=1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==1){inslt[1]=1;innum=2;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1){inslt[2]=1;innum=3;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==1){inslt[3]=1;innum=4;}}voidask_display(void){ switch(upnum){case1:GPIO_SetBits(GPIOC,GPIO_Pin_0); //1層上呼指示燈亮break;case2GPIO_SetBits(GPIOC,GPIO_Pin_1); //2break;case3:GPIO_SetBits(GPIOC,GPIO_Pin_2); //3層上呼指示燈亮break;}switch(dnnum){case2:GPIO_SetBits(GPIOC,GPIO_Pin_3); //2break;case3:GPIO_SetBits(GPIOC,GPIO_Pin_4); //3break;case4:GPIO_SetBits(GPIOC,GPIO_Pin_5); //4break;}switch(innum){case1:GPIO_SetBits(GPIOC,GPIO_Pin_6); //1break;case2:GPIO_SetBits(GPIOC,GPIO_Pin_7); //2break;case3:GPIO_SetBits(GPIOC,GPIO_Pin_8); //3break;case4:GPIO_SetBits(GPIOC,GPIO_Pin_9); //3break;}}if(upnum==0|dnnum==0|innum==0)//如果沒有呼叫請void wait_display_scan(void);//等待并顯示當(dāng)前樓層elseswitch(updnFlag){case(0){voidupask_dispose(void){if(nnun==upnum|nnum==innum){GPIO_setBits(GPIOD,GPIO_Pin_12);//開門、警報到void nowfloor_display(void);voiddelay(vu32Count); //開門延時}else{for (i=nnum+1;i<=4;i++){if(upnum[i]==1|dnnum[i]==1|inslt[i]==1) //當(dāng)前層的上面有請求,上移一層,在看是否是{ nnum++; //想要去的層或呼叫void nowfloor_display(void);voidask_display(void);voidupask_dispose(void);}else{updnFlag==1void wait_display_scan(void); //若下面沒有請求了,反GPIO_SetBits(GPIOC,GPIO_Pin_11); //橋箱下降指示燈亮}}}}break;}case(1){voiddnask_dispose(void){if(nnun==dnnum|nnum==innum){GPIO_setBits(GPIOD,GPIO_Pin_12);//開門、警報到void nowfloor_scan(void);voiddelay(vu32Count);//開門延時}else{for (i=nnum-1;i>=1;i--){if(upnum[i]==1|dnnum[i]==1|inslt[i]==1) //當(dāng)前層的下面有請求,下移一層,在看是否是nnum--; //想要去的層或呼叫層voidask_display(void);void nowfloor_display(void)voiddnask_dispose(void);}else{updnFlag==0void wait_display_scan(void); //若下面沒有請求了,反GPIO_SetBits(GPIOC,GPIO_Pin_10); //橋箱上升指示燈亮}}}}break;}}}}}voidRCC_Configuration(void) //時鐘配置函數(shù){ErrorStatusHSEStartUpStatus;u8SYSCLKSourceValue;RCC_DeInit(); //RCC復(fù)位RCC_HSEConfig(RCC_HSE_ON); //HSE時鐘HSEStartUpStatus=RCC_WaitForHSEStartUp();//取HSE是否準(zhǔn)備好標(biāo)志if(HSEStartUpStatus==SUCCESS) //HSE是否準(zhǔn)備好{/*EnablePrefetchBuffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*Flash2waitstate*/FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div2);

//配置AHB時鐘為系統(tǒng)時鐘//APB1時鐘為系統(tǒng)時鐘的一半//APB2時鐘為系統(tǒng)時鐘的一半RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//對HSE進行倍頻,倍頻因子為9,倍頻后時鐘頻率為72MHZRCC_PLLCmd(ENABLE); //使能倍頻后的時鐘while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)RESET)//PLL{}RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //將倍頻后的時鐘設(shè)置為系統(tǒng)時鐘SYSCLKSourceValue=RCC_GetSYSCLKSource();while(SYSCLKSourceValue!=0x08){

//取時鐘頻率值//判斷系統(tǒng)時鐘是否為倍頻后的時鐘//-0x00:HSIusedassystemclock} //-0x04:HSEusedassystemclock//-0x08:PLLusedassystemclock}RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOB,ENABLE); //APB2GPIOAGPIOC的時鐘}voidGPIO_Configuration(void) //I/O端口配置函數(shù){GPIO_InitTypeDefGPIO_InitStructure;/*ConfigureGPIOCpin0,pin1,pin2andpin3asOutputpush-pull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論