智能交通灯

来源:互联网 发布:易趣网与淘宝网的不同 编辑:程序博客网 时间:2024/05/18 23:53

//交通灯有很多种类型,下面这个,还是比较简单的。
//东西(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();
    } } }
}
//----------------------------------

0 0
原创粉丝点击