stm32控制地四层电梯设计原理与程序代码.docx
- 文档编号:7281845
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:12
- 大小:90.03KB
stm32控制地四层电梯设计原理与程序代码.docx
《stm32控制地四层电梯设计原理与程序代码.docx》由会员分享,可在线阅读,更多相关《stm32控制地四层电梯设计原理与程序代码.docx(12页珍藏版)》请在冰点文库上搜索。
stm32控制地四层电梯设计原理与程序代码
列出这个设计中要用到的STM32的各个引脚及实际用途如表
(1)所示,硬件电路图如图
(2)所示。
控制要求
1总体控制要求:
电梯由安装在各楼层电梯口的上升下降呼叫按钮(U1、U2、U3、D2、D3、D4),电梯轿厢内楼层选择按钮(S1、S2、S3、S4),上升下降指示(UP、DOWN),各楼层到位行程开关(SQ1、SQ2、SQ3、SQ4)组成。
电梯自动执行呼叫。
2电梯在上升的过程中只响应向上的呼叫,在下降的过程中只响应向下的呼叫,电梯向上或向下的呼叫执行完成后再执行反向呼叫。
3电梯停止运行等待呼叫时,同时有不同呼叫时,谁先呼叫执行谁。
4具有呼叫记忆、内选呼叫指示功能。
5具有楼层显示、方向指示、到站声音提示功能。
设计中用到的各引脚分布:
输入
B11->B14
一层到四层的内选按钮
输入
B8->B10
二层到四层的下呼按钮
输入
B5->B7
一层到三层的上呼按钮
输入
B1->B4
行程控制
输出
C12->C15
当前楼层指示
输出
C11
桥箱下降指示
输出
C10
桥箱上升指示
输出
C6->C9
一层到四层的内选指示灯
输出
C3->C5
二层到四层的下呼指示灯
输出
C0->C2
一层到三层的上呼指示灯
输出
D12
八音盒,到站声
输出
D8->D11
数码管的控制端子
表
(1)
硬件电路图如下图所示:
图
(2)
程序的流程图如图(3):
图(3)
程序代码如下:
#include"stm32f10x_lib.h"
#include"stdio.h"
voidRCC_Configuration(void);//时钟配置函数
voidGPIO_Configuration(void);//通用I/O口配置函数
voidask_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]四层内选,dnask下呼请求,upask[3]上呼请求,fnow当前楼层;
u8updnFlag=0;//上呼与下呼标
main(void)
{
#ifdefDEBUG
debug();
#endif
RCC_Configuration();
GPIO_Configuration();
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
GPIO_ResetBits(GPIOC,GPIO_Pin_1);
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);//各层的内选请求清零
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)
{
voidwait_display_scan(void)//等待状态扫描
{voidnowfloor_scan(void)//扫描当前电梯所在的楼层
{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;}
}
voidnowfloor_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);//显示第2层
break;
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)//判断有没有上呼、下呼、内选请求
{
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;
case2
GPIO_SetBits(GPIOC,GPIO_Pin_1);//第2层上呼指示灯亮
break;
case3:
GPIO_SetBits(GPIOC,GPIO_Pin_2);//第3层上呼指示灯亮
break;
}
switch(dnnum)
{
case2:
GPIO_SetBits(GPIOC,GPIO_Pin_3);//第2层下呼指示灯亮
break;
case3:
GPIO_SetBits(GPIOC,GPIO_Pin_4);//第3层下呼指示灯亮
break;
case4:
GPIO_SetBits(GPIOC,GPIO_Pin_5);//第4层下呼指示灯亮
break;
}
switch(innum)
{
case1:
GPIO_SetBits(GPIOC,GPIO_Pin_6);//第1层内选指示灯亮
break;
case2:
GPIO_SetBits(GPIOC,GPIO_Pin_7);//第2层内选指示灯亮
break;
case3:
GPIO_SetBits(GPIOC,GPIO_Pin_8);//第3层内选指示灯亮
break;
case4:
GPIO_SetBits(GPIOC,GPIO_Pin_9);//第3层内选指示灯亮
break;
}
}
if(upnum==0|dnnum==0|innum==0)//如果没有呼叫请求
voidwait_display_scan(void);//等待并显示当前楼层
else
switch(updnFlag)
{case(0)
{
voidupask_dispose(void)
{
if(nnun==upnum|nnum==innum)
{
GPIO_setBits(GPIOD,GPIO_Pin_12);//开门、警报到站
voidnowfloor_display(void);
voiddelay(vu32Count);//开门延时
}
else
{
for(i=nnum+1;i<=4;i++)
{
if(upnum[i]==1|dnnum[i]==1|inslt[i]==1)//当前层的上面有请求,上移一层,在看是否是
{nnum++;//想要去的层或呼叫层
voidnowfloor_display(void);
voidask_display(void);
voidupask_dispose(void);
}
else
{
updnFlag==1
voidwait_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);//开门、警报到站
voidnowfloor_scan(void);
voiddelay(vu32Count);//开门延时
}
else
{
for(i=nnum-1;i>=1;i--)
{
if(upnum[i]==1|dnnum[i]==1|inslt[i]==1)//当前层的下面有请求,下移一层,在看是否是
{nnum--;//想要去的层或呼叫层
voidask_display(void);
voidnowfloor_display(void);
voiddnask_dispose(void);
}
else
{
updnFlag==0
voidwait_display_scan(void);//若下面没有请求了,反向
GPIO_SetBits(GPIOC,GPIO_Pin_10);//桥箱上升指示灯亮
}
}
}
}
break;
}
}
}
}
}
voidRCC_Configuration(void)//时钟配置函数
{
ErrorStatusHSEStartUpStatus;
u8SYSCLKSourceValue;
RCC_DeInit();//对RCC复位
RCC_HSEConfig(RCC_HSE_ON);//使能HSE时钟
HSEStartUpStatus=RCC_WaitForHSEStartUp();//取HSE是否准备好标志
if(HSEStartUpStatus==SUCCESS)//判断HSE是否准备好
{
/*EnablePrefetchBuffer*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*Flash2waitstate*/
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB时钟为系统时钟
RCC_PCLK1Config(RCC_HCLK_Div2);//配置低速APB1时钟为系统时钟的一半
RCC_PCLK2Config(RCC_HCLK_Div2);//配置高速APB2时钟为系统时钟的一半
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//对HSE进行倍频,倍频因子为9,倍频后时钟频率为72MHZ
RCC_PLLCmd(ENABLE);//使能倍频后的时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等待PLL时钟启用成功
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//将倍频后的时钟设置为系统时钟
SYSCLKSourceValue=RCC_GetSYSCLKSource();//取时钟频率值
while(SYSCLKSourceValue!
=0x08)//判断系统时钟是否为倍频后的时钟
{//-0x00:
HSIusedassystemclock
}//-0x04:
HSEusedassystemclock
//-0x08:
PLLusedassystemclock
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|
RCC_APB2Periph_GPIOD|
RCC_APB2Periph_GPIOB,ENABLE);//使能APB2的外设GPIOA和GPIOC的时钟
}
voidGPIO_Configuration(void)//通用I/O端口配置函数
{
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|
GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|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_9GPIO_Pin_10||GPIO_Pin_11|
GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
voiddelay(vu32Count)
{for(Count;Count!
=0;Count--);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32 控制 电梯 设计 原理 程序代码
![提示](https://static.bingdoc.com/images/bang_tan.gif)