//实验项目7-1 – 简易交通灯实验
#define gLedPin 9 //绿灯驱动引脚连接数字端口9
#define yLedPin 11 //黄灯驱动引脚连接数字端口11
#define rLedPin 10 //红灯驱动引脚连接数字端口10
#define segDatPin 5 //数码管模块DAT引脚连接数字端口5
#define segClkPin 6 //数码管模块CLK引脚连接数字端口6
#define PASSINGTIME 20 //预设通行时间20s
long secondMillis;
byte secondCount = PASSINGTIME; //通行时间 20s
//设定起始亮灯状态-- false:初始亮绿灯 true:初始亮红灯
boolean iniLight = false;
//之前的红绿灯状态 false:亮绿灯 true:亮红灯
boolean rgLastState = false;
boolean yLedOn = false; //黄灯亮标志
//数码管段码表:0-9、熄灭
const unsigned char segCode[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void trafficLights(int red,int yellow,int green){
digitalWrite(rLedPin,red);
digitalWrite(yLedPin,yellow);
digitalWrite(gLedPin,green);
}
void showNumber(int number){
shiftOut(segDatPin, segClkPin, MSBFIRST, number);
}
void setup() {
pinMode(gLedPin, OUTPUT);
pinMode(yLedPin, OUTPUT);
pinMode(rLedPin, OUTPUT);
pinMode(segDatPin, OUTPUT);
pinMode(segClkPin, OUTPUT);
if (iniLight) //初始亮红或黄灯
trafficLights(HIGH,LOW,LOW); //初始亮红灯
else
trafficLights(LOW,LOW,HIGH); //初始亮绿灯
showNumber(10); //熄灭数码管
secondMillis = millis(); //获取当前时刻毫秒数
}
void loop(){
if ((millis() - secondMillis)>=1000){
secondCount -- ;
if (secondCount <10){
//10s以内秒显示倒计时
showNumber(secondCount); //数码管显示读秒
if (secondCount == 0){ //读秒倒计数为0时
if (!yLedOn) { //黄灯未亮时
trafficLights(LOW,HIGH,LOW); //点亮黄灯;
secondCount = 3; //黄灯倒计数3秒
yLedOn = true; //置黄灯亮标志
}
else{ //黄灯已亮后
delay(1000); //使“0”显示1s
showNumber(10); //熄灭数码管
if (!rgLastState) //之前亮绿灯
trafficLights(HIGH,LOW,LOW); //切换亮红灯
else
trafficLights(LOW,LOW,HIGH); //切换亮绿灯
rgLastState = !rgLastState; //改变亮灯状态
yLedOn = false; //黄灯已熄灭
secondCount = PASSINGTIME; //重新开始倒计时
}
}
}
secondMillis =millis(); //重新赋值当前时刻毫秒数
}
}