stm32控制地四层电梯设计原理与程序代码Word文档格式.docx
- 文档编号:8366786
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:12
- 大小:90.03KB
stm32控制地四层电梯设计原理与程序代码Word文档格式.docx
《stm32控制地四层电梯设计原理与程序代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《stm32控制地四层电梯设计原理与程序代码Word文档格式.docx(12页珍藏版)》请在冰点文库上搜索。
C10
桥箱上升指示
C6->
C9
一层到四层的内选指示灯
C3->
C5
二层到四层的下呼指示灯
C0->
C2
一层到三层的上呼指示灯
D12
八音盒,到站声
D8->
D11
数码管的控制端子
表
(1)
硬件电路图如下图所示:
图
(2)
程序的流程图如图(3):
图(3)
程序代码如下:
#include"
stm32f10x_lib.h"
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<
//显示第2层
case3:
GPIO_SetBits(GPIOC,GPIO_Pin_8);
//第3层指示灯亮
GPIO_Write(GPIOD,0x03<
//显示第3层
case4:
GPIO_SetBits(GPIOC,GPIO_Pin_9);
//第4层指示灯亮
GPIO_Write(GPIOD,0x04<
//显示第4层
}
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;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1){upask[1]=1;
upnum=3;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1){dnask[0]=1;
updnFlag==1;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1){dnask[1]=1;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1){dnask[2]=1;
upnum=4;
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)
GPIO_SetBits(GPIOC,GPIO_Pin_0);
//第1层上呼指示灯亮
case2
GPIO_SetBits(GPIOC,GPIO_Pin_1);
//第2层上呼指示灯亮
GPIO_SetBits(GPIOC,GPIO_Pin_2);
//第3层上呼指示灯亮
switch(dnnum)
GPIO_SetBits(GPIOC,GPIO_Pin_3);
//第2层下呼指示灯亮
GPIO_SetBits(GPIOC,GPIO_Pin_4);
//第3层下呼指示灯亮
GPIO_SetBits(GPIOC,GPIO_Pin_5);
//第4层下呼指示灯亮
switch(innum)
//第1层内选指示灯亮
GPIO_SetBits(GPIOC,GPIO_Pin_7);
//第2层内选指示灯亮
//第3层内选指示灯亮
case4:
GPIO_SetBits(GPIOC,GPIO_Pin_9);
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);
}
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);
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_Init(GPIOC,&
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_Init(GPIOD,&
voiddelay(vu32Count)
{for(Count;
Count!
=0;
Count--);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32 控制 电梯 设计 原理 程序代码
![提示](https://static.bingdoc.com/images/bang_tan.gif)