纳凉夜话 发表于 2014-12-15 18:18:06

教你做 智能交通灯,一下午的成果!

       话说好久没玩arduino, 最近在玩stm32和四级考试。


      前几天朋友叫我帮他做一个智能交通灯,用振动传感器来检测有没有车辆,然后如果有车辆的话就60s换灯,没有车的话就50s 换灯。

      我一开始想了想好简单,但下午做的时候,还遇到了一些没有想到的麻烦,一个是我要用三位数码管 (别问为什么不用两位的,告诉你我现在手头没有),我不想用寄存器,但是他这个数码管又是共阴又是三个abcddefg在一起,所以就看了网上一些人的倒计时程序,发现也不好使,还是自己来写吧, 所以就用开始刷的方法,然后加数的话就用定时器2。(具体的看程序),然后就是红黄绿 三个灯的逻辑关系也搞了一会才好。
      振动传感器就是振动是输出高低电平的那种。(不想给他们打广告)
   
说一下引脚的连法,2脚是振动传感器的D0;
                           a=3; b=4; c=5; d=6;
                           e=7; f=8; g=9;p=10;
                         d4=13;d3=12;d2=11;//这几个是那个数码管的位选
                        A0,A1,A2是红黄绿三个灯(我只有红色的LED灯,所以三个都是红色的)


#include <MsTimer2.h>

#define SensorLED   13
#define SensorINPUT   2

unsigned char state = 0;

int a=3;
int b=4;
int c=5;
int d=6;
int e=7;
int f=8;
int g=9;
int p=10;
int d4=13;
int d3=12;
int d2=11;

long n=60;
int x=100;
int del=1;
int h=0;
int m=1;

void setup()
{
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(c,OUTPUT);
pinMode(d,OUTPUT);
pinMode(e,OUTPUT);
pinMode(f,OUTPUT);
pinMode(g,OUTPUT);
pinMode(p,OUTPUT);
pinMode(d4,OUTPUT);
pinMode(d3,OUTPUT);
pinMode(d2,OUTPUT);
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
   pinMode(SensorLED, OUTPUT);
pinMode(SensorINPUT, INPUT);
attachInterrupt(0, blink, FALLING);//D2口为外部中断0,当有下降沿触发的时候调用blink函数

MsTimer2::set(1000, flash);      // 中断设置函数,每 500ms 进入一次中断
MsTimer2::start();//开始计时

}
void loop()
{
               
clearLEDs();
pickDigit(2);
pickNumber(n%10);
delay(del);

clearLEDs();
pickDigit(3);
pickNumber(n/10);
delay(del);
if(n>=4)
{
   
   digitalWrite(A2,0);
   digitalWrite(A0,h);
   digitalWrite(A1,~h);
}
else
{
digitalWrite(A2      loooooo,1);
digitalWrite(A0,0);
digitalWrite(A1,0);
}

if(n==0)
{
   h=~h;

   if(state!=0)
   {
   state=0;
   n=60;
   }
   else n=50;
}

}

void flash()                        //中断处理函数
{                        
n--;
}

void blink()//数字输入传感器下降沿触发中断服务函数
{
state++;
}

void pickDigit(int x)
{

digitalWrite(d2,HIGH);
digitalWrite(d3,HIGH);
digitalWrite(d4,HIGH);

switch(x)
{
    case 2:
      digitalWrite(d2,LOW);
      break;
    case 3:
      digitalWrite(d3,LOW);
      break;
    default:
      digitalWrite(d4,LOW);
      break;
}
}
void pickNumber(int x)
{
switch(x)
{
    default:
      zero();
      break;
    case 1:
      one();
      break;
    case 2:
      two();
      break;
    case 3:
      three();
      break;
    case 4:
      four();
      break;
    case 5:
      five();
      break;
    case 6:
      six();
      break;
    case 7:
      seven();
      break;
    case 8:
      eight();
      break;
    case 9:
      nine();
      break;
}
}
void dispDec(int x)
{
digitalWrite(p,HIGH);
}
void clearLEDs()
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
digitalWrite(p,LOW);
}
void zero()
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,LOW);
}
void one()
{
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
void two()
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,LOW);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,LOW);
digitalWrite(g,HIGH);
}
void three()
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,HIGH);
}
void four()
{
digitalWrite(a,LOW);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}
void five()
{
digitalWrite(a,HIGH);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}
void six()
{
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}
void seven()
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
digitalWrite(g,LOW);
}
void eight()
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}
void nine()
{
digitalWrite(a,HIGH);
digitalWrite(b,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(e,LOW);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
}


第一次发这样的详细的帖子,有不好的还有程序的有不对的,请各位大大们海涵和指正;

话说我做了这么久,又写了这么久,你们看到这是不是应该顶一下!!!

henrypcw 发表于 2014-12-17 20:59:33

为什么选副图片是拍下44数字的?

话说这一两年见得最多的就是连续的4字:L

li23108 发表于 2015-3-30 22:56:30

代码讲解的不错
页: [1]
查看完整版本: 教你做 智能交通灯,一下午的成果!