//交通灯有很多种类型,下面这个,还是比较简单的。
//东西(A)、南北(B)两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯,
//要求用单片机控制交通灯,实现以下功能:
//(1)A 道和B道上均有车辆要求通过时,A、B道轮流放行。
//A道放行5分钟(调试时改为5秒钟),
//B道放行4分钟(调试时改为4秒钟)。
//(4)绿灯转换为红灯时黄灯亮1秒钟。
//(2)一道有车而另一道无车(实验时用开关K0和K1控制),交通灯控制系统能立即让有车道放行。
//(3)有紧急车辆要求通过时,系统要能禁止普通车辆通行,A、B道均为红灯,
//紧急车由K2开关模拟,有紧急车时紧急灯亮。
//按照上述要求,设计出了电路,仿真截图如下:
//图片链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/20220f020f08b2d4d53f7cef.html#
//程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//*********南北方向*****************
sbit SN_G = P1^0;
sbit SN_Y = P1^1;
sbit SN_R = P1^2;
//*********东西方向*****************
sbit EW_G = P1^3;
sbit EW_Y = P1^4;
sbit EW_R = P1^5;
//*********控制开关*****************
sbit SN_K = P3^0; //南北通行
sbit EW_K = P3^1; //东西通行
sbit STOP_K = P3^2; //全部都停
//*********室内指示*****************
sbit SN_N = P2^0; //南北通行
sbit EW_N = P2^1; //东西通行
sbit STOP_N = P2^2; //全部都停
//----------------------------------
char T0_50ms, T_LOOP, t_ew, t_sn;
bit ew;
//----------------------------------
void init()
{
TMOD = 0x11;
TH0 = (65536 - 50000) / 256; //50ms@12MHz
TL0 = (65536 - 50000) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
T_LOOP = 0;
T0_50ms = 0;
ew = 1;
}
//----------------------------------
void E_W(void)
{
EW_G = 0; EW_Y = 1; EW_R = 1;
SN_G = 1; SN_Y = 1; SN_R = 0;
EW_N = 0; SN_N = 1; STOP_N = 1;
}
//----------------------------------
void S_N(void)
{
EW_G = 1; EW_Y = 1; EW_R = 0;
SN_G = 0; SN_Y = 1; SN_R = 1;
EW_N = 1; SN_N = 0; STOP_N = 1;
}
//----------------------------------
void STOP(void)
{
EW_G = 1; EW_Y = 1; EW_R = 0;
SN_G = 1; SN_Y = 1; SN_R = 0;
EW_N = 1; SN_N = 1; STOP_N = 0;
}
//----------------------------------
void main()
{
init();
while(1) {;}
}
//----------------------------------
void T0_INT(void) interrupt 1 using 0
{
TL0 = (65536 - 50000) % 256; //重新写入初始值
TH0 = (65536 - 50000) / 256; //50ms@12MHz
T0_50ms++;
if (T0_50ms == 20) {
T0_50ms = 0;
while (STOP_K == 0) STOP();
while (EW_K == 0) E_W();
while (SN_K == 0) S_N();
if (ew) {
t_ew++;
if (t_ew <= 6) E_W();
if (t_ew == 7) {E_W(); EW_Y = 0;}
if (t_ew == 8) { //时间比要求的大一些,便于观察比较
t_ew = 0;
ew = 0;
S_N();
} }
else {
t_sn++;
if (t_sn <= 2) S_N(); //时间
if (t_sn == 3) {S_N(); SN_Y = 0;}
if (t_sn == 4) { //B道放行4分钟(调试时改为4秒钟)
t_sn = 0;
ew = 1;
E_W();
} } }
}
//----------------------------------