STM32
直播中

刘秀英

7年用户 1325经验值
私信 关注
[问答]

如何去实现一种基于STM32的智能交通灯控制器的设计呢

如何去实现一种基于STM32的智能交通灯控制器的设计呢?有哪几种方案呢?

回帖(1)

许青云

2021-11-26 15:35:15
智能交通灯控制器的设计。设计十字路口红绿灯的控制威廉希尔官方网站 ,根据交通规则,控制4组红绿黄共12个LED指示灯的显示。






    通过对车流量的捕获,来合理的安排各个方位的红绿黄灯的时间,从而达到更高效率的交通。采用了摄像头OV7670模块来获取车流量信息,进而通知CPU进行那种方案。
方案1::所有红绿黄灯时间分别是:红灯10S,绿灯5S,绿灯闪3S,黄灯2S。
方案2:南北红灯8S,南北绿灯7S,南北绿灯闪3S,黄灯2S。
        东西红灯12S,东西绿灯3S,东西绿灯闪3S,黄灯2S。
方案3:东西红灯8S,东西绿灯7S,东西绿灯闪3S,黄灯2S。
       南北红灯12S,南北绿灯3S,南北绿灯闪3S,黄灯2S。
通过以上方案可以合理的减缓交通堵塞的情况。

交通灯规则有一下四种状态:
1、东西绿灯闪、黄灯亮,南北红灯。
2、东西红灯,南北绿灯。
3、东西红灯,南北绿灯闪、黄灯亮。
4、东西绿灯,南北红灯。
通过该规则可以使车合理的行驶,规范交通规则。








  #ifndef __LED_H
  #define __LED_H
  #include "stm32f10x.h"
   
  #define GPIOC_ODR_Addr  (GPIOC_BASE+0x0C)
  #define PCout(n)                            *(unsigned int *)((GPIOC_ODR_Addr&0xF0000000)+0x02000000+((GPIOC_ODR_Addr&0x00FFFFFF)<<5)+(n<<2))
   
  #define GPIOC_IDR_Addr   (GPIOC_BASE+0x08)
  #define PCin(n)  *(unsigned int*)((GPIOC_IDR_Addr&0xF0000000)+0x02000000+((GPIOC_IDR_Addr&0x00FFFFFF)<<5)+(n<<2))
   
  #define ON  0
  #define OFF 1
   
  //北
  #define N_R       PCout(0)
  #define N_G PCout(1)
  #define N_Y PCout(2)
   
  //南
  #define S_R PCout(3)
  #define S_G PCout(4)
  #define S_Y PCout(5)
   
  //东
  #define E_R PCout(6)
  #define E_G PCout(7)
  #define E_Y PCout(8)
   
  //西
  #define W_R PCout(9)
  #define W_G PCout(10)
  #define W_Y PCout(11)
   
  //全灭
  #define LED_MIE GPIO_Write(GPIOC,0xffff);
  void LED_Config(void);
  void delay_ms(u32 i);
  #endif
   
   
  #include "led.h"
   
  void LED_Config()
  {
         GPIO_InitTypeDef GPIO_InitStructure;
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
        
         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|
                                                                                                           GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7|
                                                                                                           GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_11;                                                                                
         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        
         GPIO_Init(GPIOC,&GPIO_InitStructure);
        
         LED_MIE;//灯全灭
        
  }
   
  void delay_ms(u32 i)
  {
         u32 temp;
         SysTick->LOAD=9000*i;         //设置重装数值, 72MHZ时
         SysTick->CTRL=0X01;           //使能,减到零是无动作,采用外部时钟源
         SysTick->VAL=0;                    //清零计数器
         do
         {
                temp=SysTick->CTRL;        //读取当前倒计数值
         }
         while((temp&0x01)&&(!(temp&(1<<16))));       //等待时间到达
         SysTick->CTRL=0;    //关闭计数器
         SysTick->VAL=0;             //清空计数器
  }
   
   
  #include "led.h"
   
  int main()
  {
   
         LED_Config();
         while(1)
         {
                       u8 i=0;
                       delay_ms(1000);
                       while(i<5)
                       {
                              E_Y=OFF;
                              W_Y=OFF;
                              S_R=OFF;
                              N_R=OFF;
                              N_Y=OFF;
                              S_Y=OFF;
                              E_R=ON;
                              W_R=ON;
                              S_G=ON;
                              N_G=ON;//东西红灯、南北绿灯
                              delay_ms(1000);
                              i++;
                       }
                       i=0;
                       while(i<3)
                       {
                              S_G=ON;
                              N_G=ON;
                              delay_ms(500);
                              S_G=OFF;
                              N_G=OFF;
                              delay_ms(500);//东西红灯,南北绿灯闪
                              i++;
                       }
                       i=0;
                       while(i<2)
                       {                  
                              S_G=OFF;
                              N_G=OFF;
                              N_Y=ON;
                              S_Y=ON;
                              delay_ms(1000);//东西红灯,南北黄灯亮
                              i++;
                       }
                       i=0;
                       while(i<5)
                       {
                              E_R=OFF;
                              W_R=OFF;
                              N_Y=OFF;
                              S_Y=OFF;
                              E_G=ON;
                              W_G=ON;
                              S_R=ON;
                              N_R=ON;
                              delay_ms(1000);//东西绿灯,南北红灯
                              i++;
                       }
                       i=0;
                       while(i<3)
                       {
                              E_G=ON;
                              W_G=ON;
                              delay_ms(500);
                              E_G=OFF;
                              W_G=OFF;
                              delay_ms(500);//东西绿灯闪,南北红灯
                              i++;
                       }
                       i=0;
                       while(i<2)
                       {
                              E_G=OFF;
                              W_G=OFF;
                              E_Y=ON;
                              W_Y=ON;
                              delay_ms(1000);//东西黄灯亮,南北红灯
                              i++;
                       }
         }
  }
        
举报

更多回帖

发帖
×
20
完善资料,
赚取积分