模拟洗衣机洗涤过程
单片机源程序如下:
- #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)
|