西邮嵌入式实验室吧 关注:1贴子:29
  • 11回复贴,共1

【项目】基于STM32的交通灯

只看楼主收藏回复



IP属地:江苏1楼2014-08-01 10:20回复
    项目描述:暑假做的第一个项目,基于STM32的交通灯(蓝牙实时传输)。采用STM32做总控,使用外部定时器(8254),以及外部控制(8255)。实时发送交通状态并在手机客户端上显示。


    IP属地:江苏2楼2014-08-01 10:29
    回复
      2025-08-10 18:24:39
      广告
      不感兴趣
      开通SVIP免广告
      硬件设计:



      IP属地:江苏3楼2014-08-01 10:44
      收起回复
        软件设计:



        IP属地:江苏4楼2014-08-01 10:47
        回复
          下面是各个模块的驱动方法:8254(可编程的硬件定时),8255(可编程并行I/O接口芯片),74LS138(译码器),74HC595(串转并芯片),ATK-HC05(蓝牙串口模块)等芯片。


          IP属地:江苏5楼2014-08-01 10:56
          回复
            74HC595(串转并芯片):将串口数据弄成并行数据。主要连的就是
            DS:数据线
            ST_CP:移位寄存器时钟输入
            SH_CP:存储寄存器时钟输入
            void Ser_to_Pra(uchar data) //串转并
            {
            In_74HC595(data);
            Out_74HC595();
            }
            static void In_74HC595(uchar temp) //将数据存入移位寄存器中
            {
            uchar i;
            for( i = 0; i < 8; i++)
            {
            GPIO_ResetBits(GPIOC,GPIO_Pin_8);
            if((temp&0x80) == 0)
            GPIO_ResetBits(GPIOA,GPIO_Pin_5);
            else
            GPIO_SetBits(GPIOA,GPIO_Pin_5);
            temp <<= 1;
            GPIO_SetBits(GPIOC,GPIO_Pin_8);
            }
            }
            static void Out_74HC595() //将数据输出到到端口
            {
            GPIO_ResetBits(GPIOC,GPIO_Pin_7);
            delay_ms(1);
            GPIO_SetBits(GPIOC,GPIO_Pin_7);
            delay_ms(1);
            GPIO_ResetBits(GPIOC,GPIO_Pin_7);
            }


            IP属地:江苏6楼2014-08-01 12:07
            回复
              74LS138(译码器):面对两个芯片为了节省资源不同时间对不同的芯片进行操作,使用138来控制各个芯片的片选。主要连的就是:
              A0:
              A1:
              A2:
              这个就不多说了,查138去
              void Set_Cs(uchar temp) //设置片选 temp:有两个选择( 1:8254 2:8255)
              {
              if(temp==1) //选择8254
              {
              GPIO_SetBits(GPIOB,GPIO_Pin_7);
              GPIO_ResetBits(GPIOB,GPIO_Pin_5);
              GPIO_ResetBits(GPIOB,GPIO_Pin_6);
              }
              else if(temp==2) //选择8255
              {
              GPIO_ResetBits(GPIOB,GPIO_Pin_7);
              GPIO_SetBits(GPIOB,GPIO_Pin_5);
              GPIO_ResetBits(GPIOB,GPIO_Pin_6);
              }
              else
              {
              GPIO_ResetBits(GPIOB,GPIO_Pin_7);
              GPIO_ResetBits(GPIOB,GPIO_Pin_5);
              GPIO_ResetBits(GPIOB,GPIO_Pin_6);
              }
              }


              IP属地:江苏7楼2014-08-01 12:11
              回复
                8254(可编程的硬件定时):使用8254定时产生的电平变换输入到STM32实现定时。这里有人就问了,STM32不是自带定时吗?为啥不用? 。。。。呃呃呃,这就说到我们学校的实验用哪个开发箱用汇编做的交通灯。做的不咋好就用STM32试试,所以就成这样了。主要练的线有:
                /* 设置
                PA.0 为 A0
                PA.1 为 A1
                PA.6 为 CLK0 //STM32提供200HZ方波
                PB.0 为 RD
                PB.1 为 WR
                */
                void Set_Lca(uchar location) // 选择8254,8255地址线A0 A1
                {
                switch(location)
                {
                case 0:
                GPIO_ResetBits(GPIOA,GPIO_Pin_1); //写入计数器0 ||选择A口
                GPIO_ResetBits(GPIOA,GPIO_Pin_0);
                break;
                case 1:
                GPIO_ResetBits(GPIOA,GPIO_Pin_1); //写入计数器1 ||选择B口
                GPIO_SetBits(GPIOA,GPIO_Pin_0);
                break;
                case 2:
                GPIO_SetBits(GPIOA,GPIO_Pin_1); //写入计数器2 ||选择C口
                GPIO_ResetBits(GPIOA,GPIO_Pin_0);
                break;
                case 3:
                GPIO_SetBits(GPIOA,GPIO_Pin_1); //写入控制寄存器
                GPIO_SetBits(GPIOA,GPIO_Pin_0);
                break;
                default:
                break;
                }
                }
                /*向8254写入数据,data:数据 location:有4个选项(0:计数器0 1:计数器1: 2:计数器2 3:控制寄存器)*/
                void Write_8254Data(uchar data,uchar location)
                {
                Set_Cs(1);
                Set_Lca(location);
                GPIO_ResetBits(GPIOB,GPIO_Pin_1);
                GPIO_SetBits(GPIOB,GPIO_Pin_0);
                Ser_to_Pra(data);
                GPIO_SetBits(GPIOB,GPIO_Pin_1);
                Set_Cs(0);
                }


                IP属地:江苏8楼2014-08-01 12:19
                回复
                  2025-08-10 18:18:39
                  广告
                  不感兴趣
                  开通SVIP免广告
                  8255(可编程并行I/O接口芯片):用这个来控制交通灯,具体的原理也不是很清楚,讲不明白,就贴下写数据的操作。主要练的线有:
                  /* 设置
                  PA.0 为 A0
                  PA.1 为 A1
                  PB.0 为 RD
                  PB.1 为 WR
                  */
                  void Write_8255Data(uchar data,uchar location)
                  {
                  Set_Cs(0);
                  Ser_to_Pra(data);
                  Set_Cs(2);
                  Set_Lca(location);
                  GPIO_ResetBits(GPIOB,GPIO_Pin_1);
                  GPIO_SetBits(GPIOB,GPIO_Pin_0);
                  GPIO_SetBits(GPIOB,GPIO_Pin_1);
                  Set_Cs(0);
                  }


                  IP属地:江苏9楼2014-08-01 12:22
                  回复
                    ATK-HC05(蓝牙串口模块):这个模块直接将原子哥提供的模板里面的文件抠出来添加到自己的文件里就行了。具体的定义发送数据的格式什么的就在网盘提供的文件里。里面的东西就不一一说了。。


                    IP属地:江苏10楼2014-08-01 12:24
                    回复
                      完结:撒花


                      IP属地:江苏11楼2014-08-01 12:25
                      回复