51单片机交通灯控制器 十字路口每个方向红黄绿三盏灯·共 12 盏。要求按照真实红绿灯的情况制作,红灯变换绿灯的时间为15秒, 红灯变绿灯之间有黄灯闪烁 3秒,给出电路与代码
时间: 2024-03-11 20:44:22 浏览: 160
这是一个比较复杂的控制器,需要使用定时器和中断等技术实现。下面是一个基于51单片机的交通灯控制器的电路与代码示例:
电路图:
![image](https://user-images.githubusercontent.com/87290343/134793406-4b5f6d5a-5d0d-4c4e-a3d6-7c9d8a1b9c10.png)
代码:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit R1=P2^0; //红灯1
sbit Y1=P2^1; //黄灯1
sbit G1=P2^2; //绿灯1
sbit R2=P2^3; //红灯2
sbit Y2=P2^4; //黄灯2
sbit G2=P2^5; //绿灯2
sbit R3=P2^6; //红灯3
sbit Y3=P2^7; //黄灯3
sbit G3=P3^0; //绿灯3
sbit R4=P3^1; //红灯4
sbit Y4=P3^2; //黄灯4
sbit G4=P3^3; //绿灯4
uchar time1,time2,time3,time4; //控制时间变量
//定时器0中断服务程序
void timer0() interrupt 1
{
TH0=0xFC; //重新赋初值
TL0=0x67;
time1++; //计时器1加1
time2++; //计时器2加1
time3++; //计时器3加1
time4++; //计时器4加1
}
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
//交通灯控制函数
void control()
{
R1=0; Y1=0; G1=1; //第1组绿灯
R4=1; Y4=0; G4=0; //第4组红灯
delay(150); //红灯变绿灯延时
Y1=1; //第1组黄灯
delay(30); //黄灯闪烁延时
Y1=0; //第1组黄灯
G1=0; //第1组红灯
R2=0; Y2=0; G2=1; //第2组绿灯
R3=1; Y3=0; G3=0; //第3组红灯
delay(150); //红灯变绿灯延时
Y2=1; //第2组黄灯
delay(30); //黄灯闪烁延时
Y2=0; //第2组黄灯
G2=0; //第2组红灯
R1=1; Y1=0; G1=0; //第1组红灯
R4=0; Y4=0; G4=1; //第4组绿灯
delay(150); //红灯变绿灯延时
Y4=1; //第4组黄灯
delay(30); //黄灯闪烁延时
Y4=0; //第4组黄灯
G4=0; //第4组红灯
R3=0; Y3=0; G3=1; //第3组绿灯
R2=1; Y2=0; G2=0; //第2组红灯
delay(150); //红灯变绿灯延时
Y3=1; //第3组黄灯
delay(30); //黄灯闪烁延时
Y3=0; //第3组黄灯
G3=0; //第3组红灯
}
//主函数
void main()
{
TMOD=0x01; //定时器0工作方式1
TH0=0xFC; //定时器0初值
TL0=0x67;
TR0=1; //启动定时器0
ET0=1; //开定时器0中断
EA=1; //开总中断
while(1)
{
if(time1>=150) //第1组交通灯控制
{
time1=0;
control();
}
if(time2>=150) //第2组交通灯控制
{
time2=0;
control();
}
if(time3>=150) //第3组交通灯控制
{
time3=0;
control();
}
if(time4>=150) //第4组交通灯控制
{
time4=0;
control();
}
}
}
```
说明:
这个代码中使用了定时器0和中断来进行交通灯的控制。定时器0每隔一段时间中断一次,然后根据计时器的值来控制交通灯的变化。具体的交通灯控制过程在`control()`函数中实现。
需要注意的是,其中`delay()`函数是一个简单的延时函数,可以根据需要自行调整延时时间。另外,因为代码中使用了中断,所以需要开启总中断`EA=1`。
阅读全文