你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】基于STM32的红绿灯设计

[复制链接]
STMCU小助手 发布时间:2022-5-24 18:31
基于protrus8设计电路原理图

6M[RO_XHPCS)~6P89$}ZBFL.png

先要思考明白十字路口红绿灯的逻辑

东西是一样的,南北是一样的。

东西红灯,南北就是绿灯,反之一样的,弄明白这些写代码就有思路了

中间的两个数码管是模拟真实红绿灯倒计时的用的,放置4个也行,但是为了方便观看就放一个了

下面放几张运行效果图,方便大家思考,我设计的是红绿灯都是倒计时30秒,黄灯倒计时3秒

`XYTS4`4U7LSM3HSRHZ%TBS.png
`%{3RB5D1ZYL4IGZ45]3{E0.png

4V0KYU1KTRBUN~[HD[(TXGF.png


代码

(注释在里面要好好思考,化为己用)

(这个小项目的代码稍微有点多,采用的是模块化编程,所以自己写程序的时侯要仔细,再认真理解,不要搞错了)

主函数 main.c
  1. #include "stm32f10x.h"
  2. #include "smg.h"
  3. #include "Delay.h"
  4. #include "led.h"

  5. uint16_t table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  6. uint16_t disp[2];
  7. uint16_t temp,i;

  8. void zxm_Init(void)                                                        //字形码函数
  9. {
  10.                         SMG_Init();                                                                //数码管初始化
  11.                         disp[1] = table[i/10];                                //数码管显示十位数字的字形码
  12.                         disp[0] = table[i%10];                                //数码管显示个位数字的字形码
  13.                         temp = (disp[1]<<8)|(disp[0]&0x0ff);        //十位数的字形码左移8位,然后与个位数的字形码合并
  14.                         GPIO_Write(GPIOC,temp);
  15.                         Delay(100);
  16. }        

  17. int main(void)
  18. {
  19.         LED_Init();                        //led初始化

  20.         while(1)
  21.         {
  22.                 for(i=30;i>0;i--)                        //数码管从30开始自减,到0结束
  23.                 {
  24.                         LED1_ON();                                        //东西红灯亮
  25.                         LED6_ON();                                        //南北绿灯亮
  26.                         zxm_Init();
  27.                 }
  28.                 for(i=3;i>0;i--)                        //上一个循环结束进入下一个,黄灯开始倒计时
  29.                 {
  30.                                 LED1_OFF();                                //东西红灯灭
  31.                                 LED6_OFF();                                //南北绿灯灭
  32.                                 LED2_ON();                                //东西黄灯亮
  33.                                 LED5_ON();                                //南北黄灯亮
  34.                                 zxm_Init();
  35.                 }
  36.                 for(i=30;i>0;i--)
  37.                 {
  38.                         LED2_OFF();                                        //东西黄灯灭
  39.                         LED5_OFF();                                        //南北黄灯灭
  40.                         LED3_ON();                                        //东西绿灯亮
  41.                         LED4_ON();                                        //南北红灯亮;
  42.                         zxm_Init();
  43.                 }
  44.                 for(i=3;i>0;i--)
  45.                 {
  46.                         LED3_OFF();                                        //东西绿灯灭
  47.                         LED4_OFF();                                        //南北红灯灭
  48.                         LED2_ON();                                        //东西黄灯亮
  49.                         LED5_ON();                                        //南北黄灯亮
  50.                         zxm_Init();
  51.                 }
  52.                 LED2_OFF();                                        //东西黄灯灭
  53.                 LED5_OFF();                                        //南北黄灯灭
  54.                
  55.                 //这样就结束了一个完整的循环,最后把黄灯灭掉,让程序一直在while里循环
  56.         }
  57. }
复制代码

数码管函数

smg.c

  1. #include "stm32f10x.h"
  2. #include "smg.h"

  3. void SMG_Init(void)
  4. {
  5.         GPIO_InitTypeDef  GPIO_InitStructure;
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);         //使能GPIOC时钟
  7.         GPIO_InitStructure.GPIO_Pin = 0xffff;                            //引脚配置
  8.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           //配置引脚为推挽输出
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //GPIOB速度为50MHz
  10.     GPIO_Init(GPIOC, &GPIO_InitStructure);                                //初始化
  11.         
  12. }
复制代码

smg.h
  1. #ifndef __SMG_H
  2. #define __SMG_H

  3. void SMG_Init(void);
  4. #endif
复制代码

LED灯函数

led.c


  1. #include "stm32f10x.h"
  2. #include "led.h"

  3. void LED_Init(void)
  4. {
  5.         GPIO_InitTypeDef  GPIO_InitStructure;
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         
  7.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2                             
  8.                                     |GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;                        
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  10.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  11.     GPIO_Init(GPIOB, &GPIO_InitStructure);                                
  12.         

  13. }
  14. void LED1_ON(void)
  15. {
  16.         GPIO_SetBits(GPIOB,GPIO_Pin_0);
  17. }
  18. void LED1_OFF(void)
  19. {
  20.         GPIO_ResetBits(GPIOB,GPIO_Pin_0);
  21. }
  22. void LED2_ON(void)
  23. {
  24.         GPIO_SetBits(GPIOB,GPIO_Pin_1);
  25. }
  26. void LED2_OFF(void)
  27. {
  28.         GPIO_ResetBits(GPIOB,GPIO_Pin_1);
  29. }
  30. void LED3_ON(void)
  31. {
  32.         GPIO_SetBits(GPIOB,GPIO_Pin_2);
  33. }
  34. void LED3_OFF(void)
  35. {
  36.         GPIO_ResetBits(GPIOB,GPIO_Pin_2);
  37. }
  38. void LED4_ON(void)
  39. {
  40.         GPIO_SetBits(GPIOB,GPIO_Pin_3);
  41. }
  42. void LED4_OFF(void)
  43. {
  44.         GPIO_ResetBits(GPIOB,GPIO_Pin_3);
  45. }
  46. void LED5_ON(void)
  47. {
  48.         GPIO_SetBits(GPIOB,GPIO_Pin_4);
  49. }
  50. void LED5_OFF(void)
  51. {
  52.         GPIO_ResetBits(GPIOB,GPIO_Pin_4);
  53. }
  54. void LED6_ON(void)
  55. {
  56.         GPIO_SetBits(GPIOB,GPIO_Pin_5);
  57. }
  58. void LED6_OFF(void)
  59. {
  60.         GPIO_ResetBits(GPIOB,GPIO_Pin_5);
  61. }
复制代码

led.h

  1. #ifndef __LED_H
  2. #define __LED_H

  3. void LED_Init(void);

  4. void LED1_ON(void);
  5. void LED1_OFF(void);
  6. void LED2_ON(void);
  7. void LED2_OFF(void);
  8. void LED3_ON(void);
  9. void LED3_OFF(void);
  10. void LED4_ON(void);
  11. void LED4_OFF(void);
  12. void LED5_ON(void);
  13. void LED5_OFF(void);
  14. void LED6_ON(void);
  15. void LED6_OFF(void);
  16. #endif
复制代码

延时函数

Delay.c

  1. #include "stm32f10x.h"

  2. void Delay(unsigned int count)                                                
  3. {
  4.         unsigned int i;
  5.         for(;count!=0;count--)
  6.         {
  7.                 i=5000;
  8.                 while(i--);
  9.         }        
  10. }
复制代码

Delay.h

  1. #ifndef __DELAY_H
  2. #define __DELAY_H

  3. void Delay(unsigned int count);
  4. #endif
复制代码





收藏 评论0 发布时间:2022-5-24 18:31

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版