• 学而时习之专栏
  • 温故而知新专栏



  • 单片机控制交通信号灯



    很多电工的书籍都有PLC编程交通信号灯的练习,但用单片机也可以控制交通信号灯的,这是一个简单的单片机控制交通信号灯的程序,单片机P1端口控制6个交通信号灯,并使用定时/计数器T0作定时,实现交通信号灯控制。在马路的十字路过东西南北各设置红、黄、绿3种信号灯。由P1.0~P1.2控制南北方向,其中P1.0为红灯,P1.1为黄灯,P1.2为绿灯。P1.3~P1.5控制东西方向,其中P1.3为红灯,P1.4为黄灯,P1.5为绿灯。


    如图所示:
    交通灯

    工作过程如下:当南北方向通车时绿灯亮;当通车的时间到,南北方向的绿灯熄灭,而黄灯亮,黄灯亮后由南北方向转换到东西方向通车。此时南北方向黄灯熄灭。而红灯亮,东西方向红灯熄灭,而绿灯亮,东西方向开始通车,通车时间到,东西方向的绿灯熄灭,而黄灯亮,黄灯亮后由东西方向转换到南北方向。东西方向黄灯熄灭,红灯亮,而南北方向红灯红灯熄灭,绿灯亮。周而复始不断循环.


    交通灯程序如下:



    include <AT89X51.H> /* 头文件 */
    char count; /* 声明count为字符变量 */
    bit flag; /* 声明flag为位变量 */
    char sum =0; /* 声明sum为字符变量并赋初始值0 */
    xhd( ); /* 信号灯函数xhd( ) */
    /* ―――――――― 主函数(主程序) ―――――――――――*/
    main( ) /* 主函数 */
    {
    TMOD=0x01; /* 设定T0为模式1 */
    TH0=-(50000/256); /* 设定时器初始值50000 */
    TL0=-(50000%256);
    EA=1; /* 总允许中断 */
    ET0=1; /* 允许定时器T0中断 */
    TR0=1; /* 启动定时器工作 */

    P1=0xff; /* P1初始值,关闭所有信号灯 */
    xhd( ); /* 调用信号灯函数 */
    }
    /* ――――――― 中断函数(中断服务程序) ―――――――― */
    T0_srv( ) interrupt 1 using 1 /* 中断服务程序 */
    {
    TH0=-(50000/256); /* 重装定时器初始值 */
    TL0=-(50000%256);
    count++; /* count加1 */
    if(count==20) /* 判断count是否等于20 */
    {
    count=0; /* count清0,以便从新计数 */
    flag=1; /* 标志位为1 */
    }
    }
    /* ―――――――― 信号灯函数(子程序) ―――――――― */
    xhd( ) /* 信号灯函数 */
    {
    while(1) /* 无限循环 */
    {
    /* ―――――――――――――*/
    P1_3=0; P1_2=0; /*东西红灯亮,南北绿灯亮 */
    while( sum<15) /* 循环15次,延时15秒 */
    {
    while( ! flag ); /* 等待1秒 */
    flag=0; /* 标志位清0 */
    sum++; /* sum加1 */
    }
    sum=0; /* sum清0,以便从新计数 */
    /* ―――――――――――――*/
    P1_2=1; P1_1=0; /* 南北绿灯灭,黄灯亮 */
    while( sum<3) /* 循环3次,延时3秒 */
    {
    while(! flag);
    flag=0;
    sum++;
    }
    sum=0;
    /*―――――――――――――*/
    P1_1=1; P1_0=0; /* 南北黄灯灭,红灯亮 */
    P1_3=1; P1_5=0; /* 东西红灯灭,绿灯亮 */
    while( sum<10) /* 延时10秒 */
    {
    while(! flag);
    flag=0;
    sum++;
    }
    sum=0;
    /* ―――――――――――――*/
    P1_5=1; P1_4=0; /*东西绿灯灭,黄灯亮 */
    while( sum<3) /* 延时3秒 */
    {
    while(! flag);
    flag=0;
    sum++;
    }
    sum=0;
    /* ――――――――――――― */
    P1_4=1; P1_0=1; /* 东西黄灯灭,南北红灯灭 */
    }
    }