单片机控制十字路口交通灯模拟系统详解

用单片机AT89C51芯片进行12个发光二极管模拟十字路口交通灯控制。每个路口设置一个红灯(red)绿灯(GREEN)、黄灯(YELLOW)三个发光二极管。通过改变单片机P1口的输出编码就可以控制交通灯的输出状态;外中断0和外中断1接开关(BUTTON)模拟异常发生。

异常情况分两种:

东西发生异常时,东西通行,南北禁止,东西方向绿灯闪,南北方向红灯闪60秒;

南北发生异常时,南北通行,东西禁止,南北方向绿灯闪,东西方向红灯闪60秒

主程序中实现交通灯正常运行过程,两种异常用外部中断0和外部中断1 管理,外接开关模拟异常发生,在中断服务程序中实现异常处理,在主程序中开放外中断0和外中断1,设置为边沿触发方式。时间单位采用500ms信号,由定时/计数器0定时50ms,循环10次发生,定时/计数器0采用查询方式,主程序中设定定时/计数器0的工作方式:方式1。

代码如下:

#include "at89x51.h"

void delay500ms(unsigned char k);
void main(void)
{
    SP=0x60;            //初始化
    TMOD=0x01;
    IE=0x85;
    TCON=0x05;
    while(1)
    {
        P1=0x21;                //状态1,东西方向绿灯,南北方向红灯20s
        delay500ms(40);
        P1=0x41;                //状态2,东西方向黄灯,南北方向红灯3s
        delay500ms(6);
        P1=0x12;                //状态3,南北方向绿灯,东西方向红灯20s
        delay500ms(40);
        P1=0x14;                //状态4,南北方向黄灯,东西方向红灯3s
        delay500ms(6);
    }

}

//东西方向异常,东西方向绿灯闪,南北方向红灯闪60s
void int_0(void) interrupt 0
{
    unsigned char i1,i2;
    i1=P1;
    for(i2=0;i2<60;i2++)
    {
        P1=0x21;
        delay500ms(1);
        P1=0x00;
        delay500ms(1);
    }
    P1=i1;

}

//南北方向异常,南北方向绿灯闪,东西方向红灯闪60s
void int_1(void)  interrupt 2
{
    unsigned char j1,j2;
    j1=P1;
    for(j2=0;j2<60;j2++)
    {
        P1=0x12;
        delay500ms(1);
        P1=0x00;
        delay500ms(1);
    }
    P1=j1;
}

//延时函数
void delay500ms(unsigned char m)
{
    unsigned char k1,k2;
    TH0=0x3c;TL0=0xB0;
    TR0=1;
    for(k1=0;k1<m;k1++)
    {
        for(k2=0;k2<10;k2++)
        {
            while(!TF0);
            TF0=0;
            TH0=0x3c;TL0=0xB0;
        }
    }
}

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机控制十字路口交通灯模拟系统详解

发表评论