模擬洗衣機洗滌過程
單片機源程序如下:
- #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
|