標題:
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開發(fā)板LED數(shù)量
#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--); //循環(huán)
}
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三態(tài)為無
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; //設置觸發(fā)模式為上升沿觸發(fā)
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; //設置先占優(yōu)先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //設置響應優(yōu)先級
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三態(tài)為無
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; //設置觸發(fā)模式為上升沿觸發(fā)
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; //設置先占優(yōu)先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //設置響應優(yōu)先級
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三態(tài)為無
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; //設置觸發(fā)模式為上升沿觸發(fā)
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; //設置先占優(yōu)先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //設置響應優(yōu)先級
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三態(tài)為無
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; //設置觸發(fā)模式為上升沿觸發(fā)
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; //設置先占優(yōu)先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //設置響應優(yōu)先級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷向量
NVIC_Init(&NVIC_InitStructure); //中斷向量初始化
}
/*******************************************************************************
* Function Name : LED_STATURE(int s)
* Description : LED控制
* Input : s : LED狀態(tài)位
* 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 : 蜂鳴器狀態(tài)位
* 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 ) //判斷中斷是否被觸發(fā)
{
if ( STM_EVAL_KEYGetState(KEY1)==1 ) //讀取按鍵狀態(tài)
{
if(lx<5)
lx++;
else
lx=1;
EXTI_ClearITPendingBit(KEY1_EXTI_LINE); //中斷線狀態(tài)清零
}
}
}
/*******************************************************************************
* 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 ) //判斷中斷是否被觸發(fā)
{
if ( STM_EVAL_KEYGetState(KEY2)==1 ) //讀取按鍵狀態(tài)
{
if(lx>0)
lx--;
else
lx=4;
EXTI_ClearITPendingBit(KEY2_EXTI_LINE); //中斷線狀態(tài)清零
}
}
}
void EXTI0_IRQHandler(void)
{
if ( EXTI_GetITStatus(KEY4_EXTI_LINE) != RESET ) //判斷中斷是否被觸發(fā)
{
Delay(0x5000); //延時
if ( STM_EVAL_KEYGetState(KEY4)==1 ) //讀取按鍵狀態(tài)
{
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); //中斷線狀態(tài)清零
}
}
}
}
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; //設置引腳三態(tài)類型為無
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, 下載次數(shù): 27)
2019-12-2 16:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2019-12-4 17:31
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者:
蝦仁豬心粥
時間:
2023-6-29 01:41
想要看看原理圖長什么樣子
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1