STM32入门教程-示例步伐(按键控制LED&光敏传感器控制蜂鸣器) ...

打印 上一主题 下一主题

主题 1025|帖子 1025|积分 3075

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. LED  Blink(闪耀)

代码主体包罗:LED.c      key.c    main.c    delay.c(延时防按键抖动)

步伐代码如下(涉及RCC与GPIO两个外设):
1.使用RCC使能GPIO时钟


  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                 //打开APB2时钟 
复制代码
2.GPIO-Init函数初始化GPIO


 使用该函数,需要首先举行布局体的初始化
  1.     /*GPIO初始化*/
  2.     GPIO_InitTypeDef GPIO_InitStructure;                    //定义结构体变量
  3.     
  4.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //GPIO模式,赋值为推挽输出模式----GPIO模式共8种模式,4种输入,4种输出
  5.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                //GPIO引脚,赋值为第0号引脚
  6.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //GPIO速度,赋值为50MHz
  7. GPIO_Init(GPIOA, &GPIO_InitStructure);                    //将赋值后的构体变量传递给GPIO_Init函数
  8.                                                             //函数内部会自动根据结构体的参数配置相应寄存器
  9.                                                             //实现GPIOA的初始化
复制代码
3.使用输出或输入函数控制GPIO口(设置端口的高低电平)


将I/O口置高电平---三种方法(库函数)
         GPIO_SetBits(GPIOA, GPIO_Pin_0);                    //将PA0引脚设置为高电平

         GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);            //将PA0引脚设置为高电平

        GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);        //将PA0引脚设置为高电平 
将I/O口置低电平---三种方法(库函数)
        GPIO_ResetBits(GPIOA, GPIO_Pin_0);                    //将PA0引脚设置为低电平

        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);        //将PA0引脚设置为低电平

        GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);        //将PA0引脚设置为低电平
  1. /*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
  2.                
  3.                 /*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/
  4.                 GPIO_ResetBits(GPIOA, GPIO_Pin_0);                                        //将PA0引脚设置为低电平
  5.                 Delay_ms(500);                                                                                //延时500ms
  6.                 GPIO_SetBits(GPIOA, GPIO_Pin_0);                                        //将PA0引脚设置为高电平
  7.                 Delay_ms(500);                                                                                //延时500ms
  8.                
  9.                 /*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/
  10.                 GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);                //将PA0引脚设置为低电平
  11.                 Delay_ms(500);                                                                                //延时500ms
  12.                 GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);                        //将PA0引脚设置为高电平
  13.                 Delay_ms(500);                                                                                //延时500ms
  14.                
  15.                 /*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/
  16.                 GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);                //将PA0引脚设置为低电平
  17.                 Delay_ms(500);                                                                                //延时500ms
  18.                 GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);                //将PA0引脚设置为高电平
  19.                 Delay_ms(500);                                                                                //延时500ms
复制代码

2.蜂鸣器 buzzer        

原理与LED类似,都是打开对应的GPIO口,赋高低电平
1.使用RCC使能GPIO时钟

2.GPIO-Init函数初始化GPIO

3.使用输出或输入函数控制GPIO口(设置端口的高低电平)

  1. int main(void)
  2. {
  3.         /*开启时钟*/
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        //开启GPIOB的时钟
  5.                                                                                                                         //使用各个外设前必须开启时钟,否则对外设的操作无效
  6.        
  7.         /*GPIO初始化*/
  8.         GPIO_InitTypeDef GPIO_InitStructure;                                        //定义结构体变量
  9.        
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                //GPIO模式,赋值为推挽输出模式
  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                                //GPIO引脚,赋值为第12号引脚
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //GPIO速度,赋值为50MHz
  13.        
  14.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                        //将赋值后的构体变量传递给GPIO_Init函数
  15.                                                                                                                         //函数内部会自动根据结构体的参数配置相应寄存器
  16.                                                                                                                         //实现GPIOB的初始化
  17.        
  18.         /*主循环,循环体内的代码会一直循环执行*/
  19.         while (1)
  20.         {
  21.                 GPIO_ResetBits(GPIOB, GPIO_Pin_12);                //将PB12引脚设置为低电平,蜂鸣器鸣叫
  22.                 Delay_ms(100);                                                        //延时100ms
  23.                 GPIO_SetBits(GPIOB, GPIO_Pin_12);                //将PB12引脚设置为高电平,蜂鸣器停止
  24.                 Delay_ms(100);                                                        //延时100ms
  25.                 GPIO_ResetBits(GPIOB, GPIO_Pin_12);                //将PB12引脚设置为低电平,蜂鸣器鸣叫
  26.                 Delay_ms(100);                                                        //延时100ms
  27.                 GPIO_SetBits(GPIOB, GPIO_Pin_12);                //将PB12引脚设置为高电平,蜂鸣器停止
  28.                 Delay_ms(700);                                                        //延时700ms
  29.         }
  30. }
复制代码
3.按键控制LED

key.c部分

类似的,在key.c中首先举行初始化按键端口初始化
1.使用RCC使能GPIO时钟
2.GPIO-Init函数初始化GPIO
  1. /**
  2.   * 函    数:按键初始化
  3.   * 参    数:无
  4.   * 返 回 值:无
  5.   */
  6. void Key_Init(void)
  7. {
  8.         /*开启时钟*/
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                //开启GPIOB的时钟
  10.        
  11.         /*GPIO初始化*/
  12.         GPIO_InitTypeDef GPIO_InitStructure;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                                //将PB1和PB11引脚初始化为上拉输入
  17. }
复制代码
其次,按键获取键码,通过库函数来读取寄存器的值
  1. GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
复制代码

  1. /**
  2.   * 函    数:按键获取键码
  3.   * 参    数:无
  4.   * 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下
  5.   * 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手
  6.   */
  7. uint8_t Key_GetNum(void)
  8. {
  9.         uint8_t KeyNum = 0;                //定义变量,默认键码值为0
  10.        
  11.         if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)                        //读PB1输入寄存器的状态,如果为0,则代表按键1按下
  12.         {
  13.                 Delay_ms(20);                                                                                        //延时消抖
  14.                 while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);        //等待按键松手
  15.                 Delay_ms(20);                                                                                        //延时消抖
  16.                 KeyNum = 1;                                                                                                //置键码为1
  17.         }
  18.        
  19.         if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)                        //读PB11输入寄存器的状态,如果为0,则代表按键2按下
  20.         {
  21.                 Delay_ms(20);                                                                                        //延时消抖
  22.                 while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);        //等待按键松手
  23.                 Delay_ms(20);                                                                                        //延时消抖
  24.                 KeyNum = 2;                                                                                                //置键码为2
  25.         }
  26.        
  27.         return KeyNum;                        //返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0
  28. }
复制代码

LED.c部分

将这两步封装为   初始化函数,第三步输出高低电平封装为功能函数
1.使用RCC使能GPIO时钟
2.GPIO-Init函数初始化GPIO
  1. /**
  2.   * 函    数:LED初始化
  3.   * 参    数:无
  4.   * 返 回 值:无
  5.   */
  6. void LED_Init(void)
  7. {
  8.         /*开启时钟*/
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                //开启GPIOA的时钟
  10.        
  11.         /*GPIO初始化*/
  12.         GPIO_InitTypeDef GPIO_InitStructure;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);                                                //将PA1和PA2引脚初始化为推挽输出
  17.        
  18.         /*设置GPIO初始化后的默认电平*/
  19.         GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);                                //设置PA1和PA2引脚为高电平
  20. }
复制代码
  1. /**
  2.   * 函    数:LED1开启
  3.   * 参    数:无
  4.   * 返 回 值:无
  5.   */
  6. void LED1_ON(void)
  7. {
  8.         GPIO_ResetBits(GPIOA, GPIO_Pin_1);                //设置PA1引脚为低电平
  9. }
  10. /**
  11.   * 函    数:LED1关闭
  12.   * 参    数:无
  13.   * 返 回 值:无
  14.   */
  15. void LED1_OFF(void)
  16. {
  17.         GPIO_SetBits(GPIOA, GPIO_Pin_1);                //设置PA1引脚为高电平
  18. }
  19. /**
  20.   * 函    数:LED1状态翻转
  21.   * 参    数:无
  22.   * 返 回 值:无
  23.   */
  24. void LED1_Turn(void)
  25. {
  26.         if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)                //获取输出寄存器的状态,如果当前引脚输出低电平
  27.         {
  28.                 GPIO_SetBits(GPIOA, GPIO_Pin_1);                                        //则设置PA1引脚为高电平
  29.         }
  30.         else                                                                                                        //否则,即当前引脚输出高电平
  31.         {
  32.                 GPIO_ResetBits(GPIOA, GPIO_Pin_1);                                        //则设置PA1引脚为低电平
  33.         }
  34. }
  35. /**
  36.   * 函    数:LED2开启
  37.   * 参    数:无
  38.   * 返 回 值:无
  39.   */
  40. void LED2_ON(void)
  41. {
  42.         GPIO_ResetBits(GPIOA, GPIO_Pin_2);                //设置PA2引脚为低电平
  43. }
  44. /**
  45.   * 函    数:LED2关闭
  46.   * 参    数:无
  47.   * 返 回 值:无
  48.   */
  49. void LED2_OFF(void)
  50. {
  51.         GPIO_SetBits(GPIOA, GPIO_Pin_2);                //设置PA2引脚为高电平
  52. }
  53. /**
  54.   * 函    数:LED2状态翻转
  55.   * 参    数:无
  56.   * 返 回 值:无
  57.   */
  58. void LED2_Turn(void)
  59. {
  60.         if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)                //获取输出寄存器的状态,如果当前引脚输出低电平
  61.         {                                                  
  62.                 GPIO_SetBits(GPIOA, GPIO_Pin_2);                               //则设置PA2引脚为高电平
  63.         }                                                  
  64.         else                                                               //否则,即当前引脚输出高电平
  65.         {                                                  
  66.                 GPIO_ResetBits(GPIOA, GPIO_Pin_2);                             //则设置PA2引脚为低电平
  67.         }
  68. }
复制代码
main.c部分
  1. int main(void)
  2. {
  3.         /*模块初始化*/
  4.         LED_Init();                //LED初始化
  5.         Key_Init();                //按键初始化
  6.        
  7.         while (1)
  8.         {
  9.                 KeyNum = Key_GetNum();                //获取按键键码
  10.                
  11.                 if (KeyNum == 1)                        //按键1按下
  12.                 {
  13.                         LED1_Turn();                        //LED1翻转
  14.                 }
  15.                
  16.                 if (KeyNum == 2)                        //按键2按下
  17.                 {
  18.                         LED2_Turn();                        //LED2翻转
  19.                 }
  20.         }
  21. }
复制代码




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

滴水恩情

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表