标题:
STM32洗衣机模拟程序
[打印本页]
作者:
zkl791229231
时间:
2019-12-2 15:39
标题:
STM32洗衣机模拟程序
模拟洗衣机洗涤过程
单片机源程序如下:
#include "stm32f2xx.h"
#include "stm322xg_eval.h"
#include "stm32f2xx_exti.h"
#include "stm32f2xx_gpio.h"
#include "stm322xg_eval_lcd.h"
#include "stm32f2xx_it.h"
#include "misc.h"
#include "Printf.h"
#include <stdio.h>
#include "stm32f2xx_rcc.h"
#include "LedSegment.h"
#define RCC_GPIO_LED RCC_AHB1Periph_GPIOF //LED使用的GPIO时钟
#define LEDn 4 //STM32开发板LED数量
#define GPIO_LED GPIOF //LED灯使用的GPIO组
#define LED1_PIN GPIO_Pin_7 //LED1使用的GPIO管脚
#define LED2_PIN GPIO_Pin_8 //LED2使用的GPIO管脚
#define LED3_PIN GPIO_Pin_9 //LED3使用的GPIO管脚
#define LED4_PIN GPIO_Pin_10 //LED4使用的GPIO管脚
GPIO_InitTypeDef GPIO_InitStructure;
void Turn_On_LED(u8 LED_NUM);
void Delay(uint32_t nCount);
int i=0,j=0;
int flag=0;
u8 lx=0;
u8 ly=0;
u8 time=0;
u32 unm=0;
void Delay(uint32_t nCount)
{
for(; nCount != 0; nCount--); //循环
}
void STM_EVAL_KEY1Init(void)
{
/*Structure declaration*/
GPIO_InitTypeDef GPIO_InitStructure; //GPIO结构体声明
EXTI_InitTypeDef EXTI_InitStructure; //外部中断控制结构体声明
NVIC_InitTypeDef NVIC_InitStructure; //中断向量配置结构体声明
/* Enable the KEY Clock */
RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK, ENABLE); //使能按键时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能APB2外设时钟
/* Configure KEY pin as input */
GPIO_InitStructure.GPIO_Pin = KEY1_PIN; //设置按键引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //设置GPIO模式为输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置GPIO三态为无
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure); //按键初始化
/* Connect KEY EXTI Line to KEY GPIO Pin */
SYSCFG_EXTILineConfig(KEY1_EXTI_PORT_SOURCE, KEY1_EXTI_PIN_SOURCE); //按键外部中断线配置
/* Configure KEY EXTI line */
EXTI_InitStructure.EXTI_Line = KEY1_EXTI_LINE; //设置按键的外部中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置按键为外部中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //设置触发模式为上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断
EXTI_Init(&EXTI_InitStructure); //外部中断初始化
/* Enable and set KEY EXTI Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = KEY1_EXTI_IRQn; //设置按键中断控制通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置先占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断向量
NVIC_Init(&NVIC_InitStructure); //中断向量初始化
}
void STM_EVAL_KEY2Init(void)
{
/*Structure declaration*/
GPIO_InitTypeDef GPIO_InitStructure; //GPIO结构体声明
EXTI_InitTypeDef EXTI_InitStructure; //外部中断控制结构体声明
NVIC_InitTypeDef NVIC_InitStructure; //中断向量配置结构体声明
/* Enable the KEY Clock */
RCC_AHB1PeriphClockCmd(KEY2_GPIO_CLK, ENABLE); //使能按键时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能APB2外设时钟
/* Configure KEY pin as input */
GPIO_InitStructure.GPIO_Pin = KEY2_PIN; //设置按键引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //设置GPIO模式为输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置GPIO三态为无
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure); //按键初始化
/* Connect KEY EXTI Line to KEY GPIO Pin */
SYSCFG_EXTILineConfig(KEY2_EXTI_PORT_SOURCE, KEY2_EXTI_PIN_SOURCE); //按键外部中断线配置
/* Configure KEY EXTI line */
EXTI_InitStructure.EXTI_Line = KEY2_EXTI_LINE; //设置按键的外部中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置按键为外部中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //设置触发模式为上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断
EXTI_Init(&EXTI_InitStructure); //外部中断初始化
/* Enable and set KEY EXTI Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = KEY2_EXTI_IRQn; //设置按键中断控制通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置先占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断向量
NVIC_Init(&NVIC_InitStructure); //中断向量初始化
}
void STM_EVAL_KEY3Init(void)
{
/*Structure declaration*/
GPIO_InitTypeDef GPIO_InitStructure; //GPIO结构体声明
EXTI_InitTypeDef EXTI_InitStructure; //外部中断控制结构体声明
NVIC_InitTypeDef NVIC_InitStructure; //中断向量配置结构体声明
/* Enable the KEY Clock */
RCC_AHB1PeriphClockCmd(KEY3_GPIO_CLK, ENABLE); //使能按键时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能APB2外设时钟
/* Configure KEY pin as input */
GPIO_InitStructure.GPIO_Pin = KEY3_PIN; //设置按键引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //设置GPIO模式为输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置GPIO三态为无
GPIO_Init(KEY3_GPIO_PORT, &GPIO_InitStructure); //按键初始化
/* Connect KEY EXTI Line to KEY GPIO Pin */
SYSCFG_EXTILineConfig(KEY3_EXTI_PORT_SOURCE, KEY3_EXTI_PIN_SOURCE); //按键外部中断线配置
/* Configure KEY EXTI line */
EXTI_InitStructure.EXTI_Line = KEY3_EXTI_LINE; //设置按键的外部中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置按键为外部中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //设置触发模式为上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断
EXTI_Init(&EXTI_InitStructure); //外部中断初始化
/* Enable and set KEY EXTI Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = KEY3_EXTI_IRQn; //设置按键中断控制通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置先占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断向量
NVIC_Init(&NVIC_InitStructure); //中断向量初始化
}
void STM_EVAL_KEY4Init(void)
{
/*Structure declaration*/
GPIO_InitTypeDef GPIO_InitStructure; //GPIO结构体声明
EXTI_InitTypeDef EXTI_InitStructure; //外部中断控制结构体声明
NVIC_InitTypeDef NVIC_InitStructure; //中断向量配置结构体声明
/* Enable the KEY Clock */
RCC_AHB1PeriphClockCmd(KEY4_GPIO_CLK, ENABLE); //使能按键时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能APB2外设时钟
/* Configure KEY pin as input */
GPIO_InitStructure.GPIO_Pin = KEY4_PIN; //设置按键引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //设置GPIO模式为输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置GPIO三态为无
GPIO_Init(KEY4_GPIO_PORT, &GPIO_InitStructure); //按键初始化
/* Connect KEY EXTI Line to KEY GPIO Pin */
SYSCFG_EXTILineConfig(KEY4_EXTI_PORT_SOURCE, KEY4_EXTI_PIN_SOURCE); //按键外部中断线配置
/* Configure KEY EXTI line */
EXTI_InitStructure.EXTI_Line = KEY4_EXTI_LINE; //设置按键的外部中断线
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置按键为外部中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //设置触发模式为上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断
EXTI_Init(&EXTI_InitStructure); //外部中断初始化
/* Enable and set KEY EXTI Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = KEY4_EXTI_IRQn; //设置按键中断控制通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置先占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断向量
NVIC_Init(&NVIC_InitStructure); //中断向量初始化
}
/*******************************************************************************
* Function Name : LED_STATURE(int s)
* Description : LED控制
* Input : s : LED状态位
* Output : None
* Return : None
*******************************************************************************/
void LED_STATURE(int s)
{
if(s==0)
{
STM_EVAL_LEDOffAll(); //熄灭LED
}
else
STM_EVAL_LEDOnAll(); //点亮LED
}
/*******************************************************************************
* Function Name : BEEP_STATURE(int s)
* Description : 蜂鸣器控制
* Input : s : 蜂鸣器状态位
* Output : None
* Return : None
*******************************************************************************/
void BEEP_STATURE(int s)
{
if(s==0)
{
STM_EVAL_BeepOff(); //蜂鸣器不响
}
else
STM_EVAL_BeepOn(); //蜂鸣器响
}
/*******************************************************************************
* Function Name : EXTI9_5_IRQHandler(void)
* Description : 外部中断处理
* Input : NONE
* Output : None
* Return : None
*******************************************************************************/
void EXTI9_5_IRQHandler(void)
{
if ( EXTI_GetITStatus(KEY1_EXTI_LINE) != RESET ) //判断中断是否被触发
{
if ( STM_EVAL_KEYGetState(KEY1)==1 ) //读取按键状态
{
if(lx<5)
lx++;
else
lx=1;
EXTI_ClearITPendingBit(KEY1_EXTI_LINE); //中断线状态清零
}
}
}
/*******************************************************************************
* Function Name : EXTI15_10_IRQHandler(void)
* Description : 外部中断处理
* Input : NONE
* Output : None
* Return : None
*******************************************************************************/
void EXTI15_10_IRQHandler(void)
{
if ( EXTI_GetITStatus(KEY2_EXTI_LINE) != RESET ) //判断中断是否被触发
{
if ( STM_EVAL_KEYGetState(KEY2)==1 ) //读取按键状态
{
if(lx>0)
lx--;
else
lx=4;
EXTI_ClearITPendingBit(KEY2_EXTI_LINE); //中断线状态清零
}
}
}
void EXTI0_IRQHandler(void)
{
if ( EXTI_GetITStatus(KEY4_EXTI_LINE) != RESET ) //判断中断是否被触发
{
Delay(0x5000); //延时
if ( STM_EVAL_KEYGetState(KEY4)==1 ) //读取按键状态
{
STM_EVAL_BeepOn();//打开蜂鸣器
Delay_ms(350000000);
STM_EVAL_BeepOff(); //关闭蜂鸣器
Delay_ms(350000000);
time=lx*ly;
for(i=lx*3;i>0;i--)
{
for(j=ly;j>0;j--)
{
Delay_ms(1000);
}
STM_EVAL_BeepOn();//打开蜂鸣器
Delay_ms(350000000);
STM_EVAL_BeepOff(); //关闭蜂鸣器
Delay_ms(350000000);
STM_EVAL_BeepOn();//打开蜂鸣器
Delay_ms(350000000);
STM_EVAL_BeepOff(); //关闭蜂鸣器
Delay_ms(350000000);
STM_EVAL_BeepOn();//打开蜂鸣器
Delay_ms(350000000);
STM_EVAL_BeepOff(); //关闭蜂鸣器
Delay_ms(350000000);
EXTI_ClearITPendingBit(KEY4_EXTI_LINE); //中断线状态清零
}
}
}
}
int main(void)
{
uint8_t x, y;
char disp_str[20];
STM_EVAL_BeepInit(); //蜂鸣器初始化
/* 串口初始化 */
Printf_Init();
/* 液晶屏初始化 */
STM322xG_LCD_Init();
LCD_Clear(Blue);
LCD_SetColors(White, Blue);
LCD_DisplayStringLine(LCD_LINE_0, " STM32-LedSegment");
LCD_DisplayWelcomeStr(LCD_LINE_9);
RCC_AHB1PeriphClockCmd(RCC_GPIO_LED, ENABLE);
/*配置LED灯使用的GPIO管脚模式*/
GPIO_InitStructure.GPIO_Pin = LED1_PIN|LED2_PIN|LED3_PIN|LED4_PIN; //设置LED控制引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //设置引脚为输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //设置引脚为推挽模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置引脚最大速率为100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置引脚三态类型为无
GPIO_Init(GPIO_LED, &GPIO_InitStructure); //LED灯相关的GPIO口初始化
GPIO_SetBits(GPIO_LED,LED1_PIN|LED2_PIN|LED3_PIN|LED4_PIN);//关闭所有的LED指示灯
//SPI1初始化
SPI1_INIT();
/* Initialize KEYS available on STM32F2XX_EVAL board ************************/
STM_EVAL_LEDInitAll(); //LED初始化
STM_EVAL_LEDOffAll(); //熄灭LED1~LED4
STM_EVAL_BeepInit();
STM_EVAL_BeepOff();
/*按键KEY1~KEY4初始化*/
STM_EVAL_KEY1Init();
STM_EVAL_KEY2Init();
STM_EVAL_KEY3Init();
STM_EVAL_KEY4Init();
while(1)
{
switch(lx)
{
case 1:
GPIO_ResetBits(GPIO_LED,LED1_PIN);
GPIO_SetBits(GPIO_LED,LED2_PIN|LED3_PIN|LED4_PIN);
break;
case 2:
GPIO_ResetBits(GPIO_LED,LED2_PIN);
GPIO_SetBits(GPIO_LED,LED1_PIN|LED3_PIN|LED4_PIN);
break;
case 3:
GPIO_ResetBits(GPIO_LED,LED3_PIN);
GPIO_SetBits(GPIO_LED,LED1_PIN|LED2_PIN|LED4_PIN);
break;
case 4:
GPIO_ResetBits(GPIO_LED,LED4_PIN);
GPIO_SetBits(GPIO_LED,LED1_PIN|LED2_PIN|LED3_PIN);
break;
}
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
复制代码
Keil代码下载:
LedSegment.7z
(53.09 KB, 下载次数: 27)
2019-12-2 16:19 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-12-4 17:31
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
虾仁猪心粥
时间:
2023-6-29 01:41
想要看看原理图长什么样子
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1