找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2746|回复: 2
打印 上一主题 下一主题
收起左侧

STM32洗衣机模拟程序

[复制链接]
跳转到指定楼层
楼主
ID:654171 发表于 2019-12-2 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
模拟洗衣机洗涤过程

单片机源程序如下:
  1. #include "stm32f2xx.h"
  2. #include "stm322xg_eval.h"
  3. #include "stm32f2xx_exti.h"
  4. #include "stm32f2xx_gpio.h"
  5. #include "stm322xg_eval_lcd.h"
  6. #include "stm32f2xx_it.h"
  7. #include "misc.h"
  8. #include "Printf.h"
  9. #include <stdio.h>
  10. #include "stm32f2xx_rcc.h"
  11. #include "LedSegment.h"

  12. #define RCC_GPIO_LED                    RCC_AHB1Periph_GPIOF    //LED使用的GPIO时钟
  13. #define LEDn                            4                       //STM32开发板LED数量
  14. #define GPIO_LED                        GPIOF                   //LED灯使用的GPIO组

  15. #define LED1_PIN                         GPIO_Pin_7             //LED1使用的GPIO管脚
  16. #define LED2_PIN                         GPIO_Pin_8                                      //LED2使用的GPIO管脚
  17. #define LED3_PIN                         GPIO_Pin_9                                //LED3使用的GPIO管脚
  18. #define LED4_PIN                         GPIO_Pin_10                                    //LED4使用的GPIO管脚

  19. GPIO_InitTypeDef GPIO_InitStructure;

  20. void Turn_On_LED(u8 LED_NUM);
  21. void Delay(uint32_t nCount);

  22. int i=0,j=0;
  23. int flag=0;
  24. u8 lx=0;
  25. u8 ly=0;
  26. u8 time=0;
  27. u32 unm=0;

  28. void Delay(uint32_t nCount)
  29. {
  30.   for(; nCount != 0; nCount--); //循环
  31. }
  32. void STM_EVAL_KEY1Init(void)
  33. {
  34.   /*Structure declaration*/
  35.   GPIO_InitTypeDef GPIO_InitStructure;                    //GPIO结构体声明
  36.   EXTI_InitTypeDef EXTI_InitStructure;                    //外部中断控制结构体声明
  37.   NVIC_InitTypeDef NVIC_InitStructure;                    //中断向量配置结构体声明

  38.   /* Enable the KEY Clock */
  39.   RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);           //使能按键时钟
  40.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);   //使能APB2外设时钟

  41.   /* Configure KEY pin as input */
  42.         GPIO_InitStructure.GPIO_Pin = KEY1_PIN;                 //设置按键引脚
  43.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;            //设置GPIO模式为输入
  44.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        //设置GPIO三态为无
  45.         
  46.   GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);         //按键初始化

  47.         /* Connect KEY EXTI Line to KEY GPIO Pin */
  48.         SYSCFG_EXTILineConfig(KEY1_EXTI_PORT_SOURCE, KEY1_EXTI_PIN_SOURCE);      //按键外部中断线配置

  49.         /* Configure KEY EXTI line */
  50.         EXTI_InitStructure.EXTI_Line = KEY1_EXTI_LINE;                           //设置按键的外部中断线
  51.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                      //设置按键为外部中断
  52.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                   //设置触发模式为上升沿触发
  53.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                //使能中断
  54.         EXTI_Init(&EXTI_InitStructure);                                          //外部中断初始化
  55.   
  56.         /* Enable and set KEY EXTI Interrupt to the lowest priority */
  57.         NVIC_InitStructure.NVIC_IRQChannel = KEY1_EXTI_IRQn;                     //设置按键中断控制通道
  58.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;                //设置先占优先级
  59.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                       //设置响应优先级
  60.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                          //使能中断向量

  61.         NVIC_Init(&NVIC_InitStructure);                                          //中断向量初始化
  62. }

  63. void STM_EVAL_KEY2Init(void)
  64. {
  65.   /*Structure declaration*/
  66.   GPIO_InitTypeDef GPIO_InitStructure;                    //GPIO结构体声明
  67.   EXTI_InitTypeDef EXTI_InitStructure;                    //外部中断控制结构体声明
  68.   NVIC_InitTypeDef NVIC_InitStructure;                    //中断向量配置结构体声明

  69.   /* Enable the KEY Clock */
  70.   RCC_AHB1PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);           //使能按键时钟
  71.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);   //使能APB2外设时钟

  72.   /* Configure KEY pin as input */
  73.         GPIO_InitStructure.GPIO_Pin = KEY2_PIN;                  //设置按键引脚
  74.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;             //设置GPIO模式为输入
  75.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;         //设置GPIO三态为无
  76.         
  77.   GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);          //按键初始化

  78.         /* Connect KEY EXTI Line to KEY GPIO Pin */
  79.         SYSCFG_EXTILineConfig(KEY2_EXTI_PORT_SOURCE, KEY2_EXTI_PIN_SOURCE);      //按键外部中断线配置

  80.         /* Configure KEY EXTI line */
  81.         EXTI_InitStructure.EXTI_Line = KEY2_EXTI_LINE;                           //设置按键的外部中断线
  82.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                      //设置按键为外部中断
  83.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                   //设置触发模式为上升沿触发
  84.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                //使能中断
  85.         EXTI_Init(&EXTI_InitStructure);                                          //外部中断初始化

  86.         /* Enable and set KEY EXTI Interrupt to the lowest priority */
  87.         NVIC_InitStructure.NVIC_IRQChannel = KEY2_EXTI_IRQn;                     //设置按键中断控制通道
  88.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;                //设置先占优先级
  89.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                       //设置响应优先级
  90.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                          //使能中断向量

  91.         NVIC_Init(&NVIC_InitStructure);                                          //中断向量初始化
  92. }


  93. void STM_EVAL_KEY3Init(void)
  94. {
  95.   /*Structure declaration*/
  96.   GPIO_InitTypeDef GPIO_InitStructure;                    //GPIO结构体声明
  97.   EXTI_InitTypeDef EXTI_InitStructure;                    //外部中断控制结构体声明
  98.   NVIC_InitTypeDef NVIC_InitStructure;                    //中断向量配置结构体声明

  99.   /* Enable the KEY Clock */
  100.   RCC_AHB1PeriphClockCmd(KEY3_GPIO_CLK, ENABLE);           //使能按键时钟
  101.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);   //使能APB2外设时钟

  102.   /* Configure KEY pin as input */
  103.         GPIO_InitStructure.GPIO_Pin = KEY3_PIN;                  //设置按键引脚
  104.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;             //设置GPIO模式为输入
  105.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;         //设置GPIO三态为无
  106.         
  107.   GPIO_Init(KEY3_GPIO_PORT, &GPIO_InitStructure);          //按键初始化

  108.         /* Connect KEY EXTI Line to KEY GPIO Pin */
  109.         SYSCFG_EXTILineConfig(KEY3_EXTI_PORT_SOURCE, KEY3_EXTI_PIN_SOURCE);      //按键外部中断线配置

  110.         /* Configure KEY EXTI line */
  111.         EXTI_InitStructure.EXTI_Line = KEY3_EXTI_LINE;                           //设置按键的外部中断线
  112.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                      //设置按键为外部中断
  113.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                   //设置触发模式为上升沿触发
  114.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                //使能中断
  115.         EXTI_Init(&EXTI_InitStructure);                                          //外部中断初始化

  116.         /* Enable and set KEY EXTI Interrupt to the lowest priority */
  117.         NVIC_InitStructure.NVIC_IRQChannel = KEY3_EXTI_IRQn;                     //设置按键中断控制通道
  118.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;                //设置先占优先级
  119.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                       //设置响应优先级
  120.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                          //使能中断向量

  121.         NVIC_Init(&NVIC_InitStructure);                                          //中断向量初始化
  122. }
  123. void STM_EVAL_KEY4Init(void)
  124. {
  125.   /*Structure declaration*/
  126.   GPIO_InitTypeDef GPIO_InitStructure;                    //GPIO结构体声明
  127.   EXTI_InitTypeDef EXTI_InitStructure;                    //外部中断控制结构体声明
  128.   NVIC_InitTypeDef NVIC_InitStructure;                    //中断向量配置结构体声明

  129.   /* Enable the KEY Clock */
  130.   RCC_AHB1PeriphClockCmd(KEY4_GPIO_CLK, ENABLE);           //使能按键时钟
  131.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);   //使能APB2外设时钟

  132.   /* Configure KEY pin as input */
  133.         GPIO_InitStructure.GPIO_Pin = KEY4_PIN;                  //设置按键引脚
  134.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;             //设置GPIO模式为输入
  135.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;         //设置GPIO三态为无
  136.         
  137.   GPIO_Init(KEY4_GPIO_PORT, &GPIO_InitStructure);          //按键初始化
  138.         
  139.         /* Connect KEY EXTI Line to KEY GPIO Pin */
  140.         SYSCFG_EXTILineConfig(KEY4_EXTI_PORT_SOURCE, KEY4_EXTI_PIN_SOURCE);      //按键外部中断线配置

  141.         /* Configure KEY EXTI line */
  142.         EXTI_InitStructure.EXTI_Line = KEY4_EXTI_LINE;                           //设置按键的外部中断线
  143.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                      //设置按键为外部中断
  144.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;                   //设置触发模式为上升沿触发
  145.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                //使能中断
  146.         EXTI_Init(&EXTI_InitStructure);                                          //外部中断初始化

  147.         /* Enable and set KEY EXTI Interrupt to the lowest priority */
  148.         NVIC_InitStructure.NVIC_IRQChannel = KEY4_EXTI_IRQn;                     //设置按键中断控制通道
  149.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;                //设置先占优先级
  150.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                       //设置响应优先级
  151.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                          //使能中断向量

  152.         NVIC_Init(&NVIC_InitStructure);                                          //中断向量初始化
  153. }
  154. /*******************************************************************************
  155. * Function Name  : LED_STATURE(int s)
  156. * Description    : LED控制
  157. * Input          : s : LED状态位
  158. * Output         : None
  159. * Return         : None
  160. *******************************************************************************/
  161. void LED_STATURE(int s)
  162. {
  163.   if(s==0)     
  164.         {
  165.                 STM_EVAL_LEDOffAll();                     //熄灭LED
  166. }
  167.         else
  168.     STM_EVAL_LEDOnAll();               //点亮LED
  169. }

  170. /*******************************************************************************
  171. * Function Name  : BEEP_STATURE(int s)
  172. * Description    : 蜂鸣器控制
  173. * Input          : s : 蜂鸣器状态位
  174. * Output         : None
  175. * Return         : None
  176. *******************************************************************************/
  177. void BEEP_STATURE(int s)
  178. {
  179.   if(s==0)     
  180.         {
  181.                 STM_EVAL_BeepOff();              //蜂鸣器不响
  182.   }
  183.         else
  184.                 STM_EVAL_BeepOn();               //蜂鸣器响
  185. }

  186. /*******************************************************************************
  187. * Function Name  : EXTI9_5_IRQHandler(void)
  188. * Description    : 外部中断处理
  189. * Input          : NONE
  190. * Output         : None
  191. * Return         : None
  192. *******************************************************************************/
  193. void EXTI9_5_IRQHandler(void)
  194. {
  195.         if ( EXTI_GetITStatus(KEY1_EXTI_LINE) != RESET )     //判断中断是否被触发
  196.   {        
  197.                 if ( STM_EVAL_KEYGetState(KEY1)==1 )               //读取按键状态
  198.                 {
  199.                 if(lx<5)
  200.                         lx++;
  201.                 else
  202.                         lx=1;
  203.                         EXTI_ClearITPendingBit(KEY1_EXTI_LINE);                       //中断线状态清零        
  204.           }
  205.         }
  206. }
  207. /*******************************************************************************
  208. * Function Name  : EXTI15_10_IRQHandler(void)
  209. * Description    : 外部中断处理
  210. * Input          : NONE
  211. * Output         : None
  212. * Return         : None
  213. *******************************************************************************/
  214. void EXTI15_10_IRQHandler(void)
  215. {
  216.         if ( EXTI_GetITStatus(KEY2_EXTI_LINE) != RESET )     //判断中断是否被触发
  217.   {        
  218.                 if ( STM_EVAL_KEYGetState(KEY2)==1 )               //读取按键状态
  219.                 {
  220.                         if(lx>0)
  221.                                 lx--;
  222.                         else
  223.                                 lx=4;
  224.                         EXTI_ClearITPendingBit(KEY2_EXTI_LINE);                       //中断线状态清零
  225.                 }
  226.         }


  227. }
  228. void EXTI0_IRQHandler(void)
  229. {
  230.         if ( EXTI_GetITStatus(KEY4_EXTI_LINE) != RESET )     //判断中断是否被触发
  231.   {        
  232.                 Delay(0x5000);                                     //延时
  233.                 if ( STM_EVAL_KEYGetState(KEY4)==1 )               //读取按键状态
  234.                 {
  235.                         STM_EVAL_BeepOn();//打开蜂鸣器
  236.             Delay_ms(350000000);
  237.       STM_EVAL_BeepOff();   //关闭蜂鸣器
  238.             Delay_ms(350000000);
  239.                         time=lx*ly;
  240.                         
  241.                         for(i=lx*3;i>0;i--)
  242.                         {
  243.                                 for(j=ly;j>0;j--)
  244.                                 {
  245.                                         Delay_ms(1000);
  246.                                 }
  247.                         STM_EVAL_BeepOn();//打开蜂鸣器
  248.             Delay_ms(350000000);
  249.       STM_EVAL_BeepOff();   //关闭蜂鸣器
  250.             Delay_ms(350000000);
  251.                         STM_EVAL_BeepOn();//打开蜂鸣器
  252.             Delay_ms(350000000);
  253.       STM_EVAL_BeepOff();   //关闭蜂鸣器
  254.             Delay_ms(350000000);
  255.                         STM_EVAL_BeepOn();//打开蜂鸣器
  256.             Delay_ms(350000000);
  257.       STM_EVAL_BeepOff();   //关闭蜂鸣器
  258.             Delay_ms(350000000);
  259.                         EXTI_ClearITPendingBit(KEY4_EXTI_LINE);                       //中断线状态清零        
  260.                         }
  261.                 }
  262.         }
  263. }
  264. int main(void)
  265. {
  266.   uint8_t x, y;
  267.         char disp_str[20];
  268.   
  269.         STM_EVAL_BeepInit(); //蜂鸣器初始化
  270.         
  271.         /* 串口初始化 */
  272.   Printf_Init();

  273.         /* 液晶屏初始化 */
  274.         STM322xG_LCD_Init();
  275.         LCD_Clear(Blue);
  276.         LCD_SetColors(White, Blue);
  277.         LCD_DisplayStringLine(LCD_LINE_0, "  STM32-LedSegment");
  278.         LCD_DisplayWelcomeStr(LCD_LINE_9);
  279.         
  280.         RCC_AHB1PeriphClockCmd(RCC_GPIO_LED, ENABLE);


  281.         /*配置LED灯使用的GPIO管脚模式*/
  282.         GPIO_InitStructure.GPIO_Pin = LED1_PIN|LED2_PIN|LED3_PIN|LED4_PIN; //设置LED控制引脚
  283.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //设置引脚为输出
  284.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //设置引脚为推挽模式
  285.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置引脚最大速率为100MHz
  286.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置引脚三态类型为无   

  287.         GPIO_Init(GPIO_LED, &GPIO_InitStructure);  //LED灯相关的GPIO口初始化
  288.         GPIO_SetBits(GPIO_LED,LED1_PIN|LED2_PIN|LED3_PIN|LED4_PIN);//关闭所有的LED指示灯
  289.   //SPI1初始化
  290.   SPI1_INIT();
  291.   

  292.   /* Initialize KEYS available on STM32F2XX_EVAL board ************************/
  293.   STM_EVAL_LEDInitAll();                  //LED初始化
  294.         STM_EVAL_LEDOffAll();                   //熄灭LED1~LED4
  295.         
  296.         STM_EVAL_BeepInit();
  297.         STM_EVAL_BeepOff();
  298.         
  299.         /*按键KEY1~KEY4初始化*/
  300.         STM_EVAL_KEY1Init();
  301.         STM_EVAL_KEY2Init();
  302.         STM_EVAL_KEY3Init();
  303.         STM_EVAL_KEY4Init();
  304.         
  305.   while(1)
  306.         {
  307.                         switch(lx)
  308.                         {
  309.                                 case 1:
  310.                                  GPIO_ResetBits(GPIO_LED,LED1_PIN);
  311.                                  GPIO_SetBits(GPIO_LED,LED2_PIN|LED3_PIN|LED4_PIN);
  312.                                  break;
  313.                                 case 2:
  314.                                  GPIO_ResetBits(GPIO_LED,LED2_PIN);
  315.                                  GPIO_SetBits(GPIO_LED,LED1_PIN|LED3_PIN|LED4_PIN);
  316.                                  break;
  317.                           case 3:
  318.                                  GPIO_ResetBits(GPIO_LED,LED3_PIN);
  319.                                  GPIO_SetBits(GPIO_LED,LED1_PIN|LED2_PIN|LED4_PIN);
  320.                                  break;
  321.                                 case 4:
  322.                                  GPIO_ResetBits(GPIO_LED,LED4_PIN);
  323.                                  GPIO_SetBits(GPIO_LED,LED1_PIN|LED2_PIN|LED3_PIN);
  324.                                  break;
  325.                   }
  326.          
  327. }
  328. }

  329. #ifdef  USE_FULL_ASSERT
  330. void assert_failed(uint8_t* file, uint32_t line)
  331. {
  332.   while (1)
  333.   {
  334.   }
  335. }
  336. #endif
复制代码

Keil代码下载:
LedSegment.7z (53.09 KB, 下载次数: 27)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-12-4 17:31 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:1086433 发表于 2023-6-29 01:41 | 只看该作者
想要看看原理图长什么样子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表