本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页
最热资讯


亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」
该项目是创建一个交通灯系统,模拟现实生活中的交通灯系统,如下图,一个方向是一条主要的双车道道路,另一个方向是一个掉头,包括一个人行横道。
硬件组件:
设计步骤:
步骤一:塑造街道的形状
1)人行道
2)掉头
步骤二:焊接交通灯LEDS,路灯杆,准备其余的部件
1)交通灯(一个带有行人附加按钮)
2)路灯ploes
3)伺服sg90、4个红外传感器、7段显示器
项目演示:
代码:
交通灯系统代码
//#include <VarSpeedServo.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 16000000
int pinA = 8;
int pinB = 9;
int pinC = 4;
int pinD = 3;
int pinE = 2;
int pinF = 7;
int pinG = 6;
int pinP = 5;
#define buzz PB6 // 蜂鸣器
#define ledR1 PB0 // 主路红灯 //交通
#define ledY1 PB1 // 主干道黄灯 //交通
#define ledG1 PB2 // 主路绿灯 //交通
#define ledR2 PB3 // 掉头红灯 //交通
#define ledY2 PB4 // 掉头黄灯 //交通
#define ledG2 PB5 // 掉头绿灯 //交通
#define ledtr PF0 // 人行横道红色LED
#define ledtg PF1 // 人行横道绿色LED
#define IR1 PD3 //红外传感器
#define IR2 PJ1 //红外传感器
#define IR3 PA0 //红外传感器
#define IR4 PA1 //红外传感器
#define ledoff PA4 //主开关LED红色
#define ledon PA5 //主开关LED绿色
#define ledflash PA6 //白色LED闪光灯(雷达)
#define button1 PC3 //行人按钮1
#define button2 PK0 //按钮2(主交通开关)
volatile unsigned char elec=0; //其中一些可变变量不再使用
volatile unsigned int e=0;
volatile unsigned int ldrStatus=0;
volatile unsigned int pinchange = 0;
volatile unsigned int x = 0;
volatile unsigned int S = 0;
int o=0;
int sens1 =22;
int sens2 =23;
ISR(TIMER3_OVF_vect){ // 定时器3触发,一段时间后,它检查灯是否低于一定值,以打开灯或不打开(LDR传感器)
int ldrStatus = analogRead(A11); /* 另外,在代码的另一部分中添加了该块,以确保即使代码在另一个Inturret中,路灯也在夜间亮起*/
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
}
volatile unsigned int count=0;
volatile unsigned long start =0;
volatile unsigned long t1 =0;
volatile unsigned long t2 =0;
volatile float t3=0;
ISR(TIMER2_OVF_vect){ // 如果乌图恩的交通是绿色的,行人被允许过马路,而一辆车从主干道前没有停过白色的
// 线路或刚刚中断的交通,为了安全起见,蜂鸣器会提醒行人,7段显示屏也会叮当响,伺服(门)
S++; // 将在u形转弯处缓慢关闭(演示后修改),以避免任何事故(计时器检查是否夹伤(白线处的红外传感器(主要道路))
if(S>=100){ //那是从下面的夹钳插入的
if(pinchange==1){
pinchange=0;
S=0;
int ldrStatus = analogRead(A11); //再次检查LDR
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
PORTF &= ~(1<<ledtg);
TCNT2=99;
OCR5A=350; // 伺服控制
_delay_ms(100);
OCR5A=340;
_delay_ms(100);
OCR5A=320;
_delay_ms(100);
OCR5A=300;
_delay_ms(100);
OCR5A=280;
_delay_ms(100);
OCR5A=260;
_delay_ms(100);
OCR5A=220;
_delay_ms(100);
OCR5A=190;
_delay_ms(500);
OCR5A=150;
_delay_ms(500);
ldrStatus = analogRead(A11); //再次检查LDR
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
PORTB |= (1<<ledG2); // LED和7段显示屏
PORTB |= (1<<buzz);
PORTF |= (1<<ledtr);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, LOW);
_delay_ms(800);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<buzz);
PORTF &= ~(1<<ledtr);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(200);
OCR5A=140; // 伺服
_delay_ms(500);
OCR5A=130;
_delay_ms(500);
PORTB |= (1<<ledG2);
PORTB |= (1<<buzz);
PORTF |= (1<<ledtr);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, LOW);
_delay_ms(800);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<buzz);
PORTF &= ~(1<<ledtr);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(200);
PORTB |= (1<<ledG2);
PORTB |= (1<<buzz);
PORTF |= (1<<ledtr);
ldrStatus = analogRead(A11); //再次检查LDR
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, LOW);
_delay_ms(800);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<buzz);
PORTF &= ~(1<<ledtr);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(200);
OCR5A=120; // 继续伺服(闸门)
_delay_ms(500);
OCR5A=75;
_delay_ms(500);
PORTB |= (1<<ledG2);
PORTB |= (1<<buzz);
PORTF |= (1<<ledtr);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, LOW);
_delay_ms(800);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<buzz); //蜂鸣器
PORTF &= ~(1<<ledtr);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(200);
ldrStatus = analogRead(A11); //检查LDR
if (ldrStatus <= 200) {
digitalWrite(41, HIGH);
Serial.println(ldrStatus);
} else {
digitalWrite(41, LOW);
}
OCR5A=100;
_delay_ms(500);
OCR5A=75;
_delay_ms(500);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
PORTB &= ~(1<<ledG2);
PORTB |= (1<<ledY2);
_delay_ms(1000);
PORTB &= ~(1<<ledY2);
PORTB |= (1<<ledR2);
_delay_ms(3500);
PORTB &= ~(1<<ledR2);
PORTB |= (1<<ledG2);
PORTF |= (1<<ledtg);
OCR5A=360; //过了一段时间,车流恢复了原来的状态,大门又开了
_delay_ms(1500);
}
}
TCNT2=99;
pinchange=0;
}
ISR(PCINT1_vect ) // pinchange InturReport(用于主干道白线处的红外传感器,用于在主干道(2车道)为红色时检测任何通过白线的车辆
{
pinchange=1;
x=0;
}
void(* resetFunc) (void) = 0; //复位功能
ISR(PCINT2_vect ){ //这个夹持器用于主开关重新设置代码,所有东西都会关闭,直到主开关打开
resetFunc(); //调用重置函数
}
int main() {
pinMode(sens1 , INPUT); // 配置所有输出、输入、计时器和InturReports
pinMode(sens2 , INPUT);
DDRK &= ~(1<<PK3);
DDRK &= ~(1<<PK0);
PORTK |= (1<<button2);
DDRG |= (1<<PG0);
DDRA &= ~((1<<IR3)|(1<<IR4));
DDRB=0xff;
DDRA |= (1<<ledoff) | (1<<ledon) | (1<<ledflash);
DDRC &= ~(1<<button1);
DDRD &= ~(1<<IR1);
PORTC |= (1<<button1);
DDRC |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC4)|(1<<PC5);
DDRF |= (1<<ledtr)|(1<<ledtg);
PORTB &= ~(1<<ledY1);
PORTA |= (1<<ledoff);
PORTA &= ~(1<<ledon);
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinP, OUTPUT);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
DDRJ &= ~(1<<IR2);
DDRD &= ~(1<<IR1);
DDRD |= (1<<PD2)|(1<<PD1);
PORTF &= ~(1<<ledtg);
PORTF &= ~(1<<ledtr);
PORTB &= ~(1<<ledG1);
PORTB &= ~(1<<ledR2);
PORTB &= ~(1<<ledR1);
PORTB &= ~(1<<ledY1);
PORTB &= ~(1<<ledG2);
PORTB &= ~(1<<ledY2);
PORTA &= ~(1<<ledflash);
int w=0;
int k=0;
int h=0;
int y=0;
int b=0;
cli();
PCICR|= ( 1<< PCIE1) ;
PCMSK1 |= ( 1<< PCINT10);
TCCR5A|=(1<<COM5A1)|(1<<COM5B1)|(1<<WGM51);
TCCR5B|=(1<<WGM53)|(1<<WGM52)|(1<<CS51)|(1<<CS50);
ICR5=4999; //fPWM=50Hz
DDRL|=(1<<PL3);
TCCR3A = 0 ;
TCCR3B = 0 ;
TCNT3 = 600 ;
TIMSK3 |= ( 1<< TOIE3) ;
TCCR3B |= ( 1<< CS31 ) | ( 1<< CS30 ) ;
TCCR1A = 0 ;
TCCR1B = 0 ;
TCNT1 = 0 ;
TCCR4A = 0 ;
TCCR4B = 0 ;
TCNT4 = 59285 ;
TIMSK4 |= ( 1<< TOIE4) ;
Serial.begin(9600);
pinMode(41, OUTPUT);
pinMode(A11, INPUT);
PCICR&= ~(1 << PCIE2);
PCMSK2 &= ~( 1<< PCINT16);
TCCR2A = 0 ;
TCCR2B = 0 ;
TCNT2 = 99 ;
TIMSK2 |= ( 1<< TOIE2) ;
sei();
OCR5A=100; //90 degree
_delay_ms(500);
while(1) {
if((PINK & (1<<button2))==0){
PORTA &= ~(1<<ledoff); //等待按下主开关(打开)
PORTA |=(1<<ledon);
PORTF |= (1<<ledtr);
PORTB |= (1<<ledG1);
PORTB |= (1<<ledR2);
PORTB &= ~(1<<ledR1);
OCR5A=360;
_delay_ms(500);
_delay_ms(3000);
PCICR|= (1 << PCIE2); // 设置pinchange inturrept重置整个代码(确保按下按钮时它不工作)
PCMSK2 |= ( 1<< PCINT16);
y=1;
b =1;
} // 雷达只有在主路绿灯时才工作
if(digitalRead(sens1)==0){ //一旦红外传感器探测到一辆车,雷达就会启动定时器1
t1=TCNT1; //t1等同于tcnt1
TCCR1B |= ( 1<< CS12 ) | ( 1<< CS10 ) ;
while(digitalRead(sens2)); //红外2感测车再次
t2=TCNT1; // t2等于tcnt1的下一个值,当它经过下一个ir传感器时
t3 =t2-t1; //t3 t2和t1之间的差异
if(t3<30000){ //如果t3<30000约2秒(闪烁该车)
PORTA |= (1<<ledflash);
_delay_ms(200);
PORTA &= ~(1<<ledflash);
}
else{
TCNT1=0;
}
}
if((PIND & (1<<IR1)) ==0 && w==0 && y==1){ //IR1是U-turn传感器,当车辆在U-turn等待时,它能感知到
k=1;
w=1;
b=0;
}
if((PINC & (1<<button1)) ==0 && w==0 && y==1){ //按钮1是主路两侧的行人按钮
k=1;
w=1;
b=0;
}
if(k==1){ //按下IR1或其中一个按钮,主路变为红色,同时转弯变为绿色,行人可以通过
_delay_ms(10000);
for(int i=0 ; i<=5;i++){
PORTB ^= (1<<ledG1);
_delay_ms(500);
}
PORTB &= ~(1<<ledG1);
PORTB |= (1<<ledY1);
_delay_ms(3000);
PORTB &= ~(1<<ledY1);
TCCR2B |= ( 1<< CS22) | ( 1<< CS21 ) | ( 1<< CS20 ) ;
S=0;
PORTB |= (1<<ledR1);
PORTB &= ~(1<<ledR2);
PORTB |= (1<<ledG2);
PORTF &= ~(1<<ledtr);
PORTF |= (1<<ledtg);
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
//3
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
for(int i =0;i<=999;i++){
PORTB |= (1<<buzz);
_delay_ms(1);
PORTB &= ~(1<<buzz);
_delay_ms(1);
}
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
PORTF |= (1<<ledtg);
for(int i =0;i<=9999;i++){
PORTB |= (1<<buzz);
_delay_ms(0.1);
PORTB &= ~(1<<buzz);
_delay_ms(0.1);
}
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
PORTF &= ~(1<<ledtg);
for(int i =0;i<=9999;i++){
PORTB |= (1<<buzz);
_delay_ms(0.1);
PORTB &= ~(1<<buzz);
_delay_ms(0.1);
}
PORTF |= (1<<ledtg);
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
//4
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
for(int i =0;i<=9999;i++){
PORTB |= (1<<buzz);
_delay_ms(0.1);
PORTB &= ~(1<<buzz);
_delay_ms(0.1);
}
PORTF &= ~(1<<ledtg);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
for(int i =0;i<=9999;i++){
PORTB |= (1<<buzz);
_delay_ms(0.1);
PORTB &= ~(1<<buzz);
_delay_ms(0.1);
}
PORTF |= (1<<ledtg);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinP, HIGH);
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
_delay_ms(1000);
digitalWrite(pinA, HIGH);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
digitalWrite(pinP, HIGH);
PORTF &= ~(1<<ledtg);
PORTF |= (1<<ledtr);
TCCR2B=0;
TCNT2=99;
k=0;
h=1;
}
if(k==0 && h==1){ //当10秒通过时,正常情况恢复,主要道路变为绿色,因为这是主要道路
b=1; // 很多车都用它
for(int i=0 ; i<=5;i++){
PORTB ^= (1<<ledG2);
_delay_ms(500);
}
PORTB &= ~(1<<ledG2);
PORTB |= (1<<ledY2);
_delay_ms(3000);
PORTB &= ~(1<<ledY2);
PORTB |= (1<<ledR2);
PORTB &= ~(1<<ledR1);
PORTB |= (1<<ledG1);
PORTF |= (1<<ledtr);
h=0;
w=0;
}
}
}
开启“人工智能”——贝尔金WeMo智能插座套装拆解
2014-05-23
iPhone 6 plus最专业传感器深入解析
2014-10-22
智能手机里面都装着哪些传感器?它们都记录了你的什么?
2016-04-11
NXP开发板不知道选什么,看这里就对了!
2016-07-28
盘点全球知名传感器芯片巨头Top10
2015-08-21
这套工业物联网解决方案把乐高变成了一座智慧城市
2019-06-24
[项目实录]全流程LoRaWAN开发
2019-07-22
【视频秀】用STM32和光传感器控制电机马达开关窗户
2019-06-12
一款小尺寸、高性能的智能家居设备
2019-06-21
无线传感器网络——传感器原理与应用系列课程
2019-07-24
讨论