×
单片机 > 单片机程序设计 > 详情

AT89C51单片机十字路口交通灯设计

发布时间:2020-06-17 发布时间:
|

制作出来的实物图如下:
 

这是一个十字路口的交通灯设计仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
 

keil单片机源程序如下:

#include


sbit NS_GRE = P2^5;      

sbit NS_YEL = P2^4; 

sbit NS_RED = P2^3;   

sbit EW_GRE = P2^2;  

sbit EW_YEL = P2^1;  

sbit EW_RED = P2^0;   




uint8  EW_Timer = unused8;  //东西方向红灯定时器

uint8  NS_Timer = unused8;  //南北方向红灯定时器

uint8  YEL_Timer = unused8; //黄灯 5s定时器


int main(void)

{


    Timer_Init();    //定时器初始化

    INT0_Init();     //外部中断初始化    

    EA=1;            //打开全局中断

    

    NS_GRE = OFF;    //所有的灯都灭    

    NS_YEL = OFF; 

    NS_RED = OFF;   

    EW_GRE = OFF;  

    EW_YEL = OFF;  

    EW_RED = OFF;   

    P3 = 0xFF;      //所有显示灭


    //先让东西方向红灯亮 南北方向通行

    EW_Timer = EWTime_Count;//东西方向开始计时


    while(1)

    {

           

           if((EW_Timer != unused8) && (EW_Timer != 0)){ //东西方向做红灯倒计时

                display1(EW_Timer/10, EW_Timer%10);      //东西方向显示时间 南北方向不显示

                EW_RED_ON();                             //东西方向保持红灯

                NS_GRE_ON();                             //南北方向保持绿灯

           }

           else if((EW_Timer != unused8) && (EW_Timer == 0) && (YEL_Timer == unused8)){//东西方向红灯计时到 东西方向保持红灯 南北方向变黄灯 开始黄灯5s计时

                EW_RED_ON();                             //东西方向红灯

                NS_YEL_ON();                             //南北方向黄灯

                YEL_Timer = YELTime_Count;               //5s计时

           }

           if((EW_Timer != unused8) && (YEL_Timer != unused8) && (YEL_Timer != 0)){

                display1(YEL_Timer/10, YEL_Timer%10);    //东西方向显示时间 南北方向不显示

           }

           if((EW_Timer != unused8) && (YEL_Timer == 0)){    //东西方向红-南北方向黄灯5s计时到 东西红灯定时器关 黄灯定时器关 南北红灯 东西绿灯 南北计时器开

                EW_Timer = unused8;                      //东西红灯定时器关

                YEL_Timer = unused8;                     //黄灯定时器关

                NS_RED_ON();                             //南北变红灯

                EW_GRE_ON();                             //东西变绿灯

                NS_Timer = NSTime_Count;                 //南北红灯定时器开

           }




           if((NS_Timer != unused8) && (NS_Timer != 0)){ //南北红灯定时器正在计时

                display2(NS_Timer/10, NS_Timer%10);      //南北方向显示时间 东西方向不显示

                EW_GRE_ON();                             //东西保持绿灯

                NS_RED_ON();                             //南北保持红灯

           }

           else if((NS_Timer != unused8) && (NS_Timer == 0) && (YEL_Timer == unused8)){ //南北方向红灯计时到 南北方向保持红灯 东西方向变黄灯 开始黄灯5s计时

                NS_RED_ON();                             //南北方向保持红灯

                EW_YEL_ON();                             //东西方向变黄灯

                YEL_Timer = YELTime_Count;               //5s计时

           }

           if((NS_Timer != unused8) && (YEL_Timer != unused8) && (YEL_Timer != 0)){   

                display2(YEL_Timer/10, YEL_Timer%10);   //南北方向显示时间 东西方向不显示

           }

           if((NS_Timer != unused8) && (YEL_Timer == 0)){  //南北方向红-东西方向黄灯5s计时到 南北方向定时器关 黄灯定时器关 东西方向变红灯 南北方向变绿灯 东西方向红灯计时器开始计时

                NS_Timer = unused8;

                YEL_Timer = unused8;

                EW_RED_ON();                           //东西方向变红灯

                NS_GRE_ON();                           //南北方向变绿灯

                EW_Timer = EWTime_Count;               //东西方向开始计时

           }



           if(Flag_Key == 1){        //如果急停按键按下 则全红灯 显示灭

                P3 = 0xFF;           //所有显示灭

                EW_RED_ON();         //东西方向红灯

                NS_RED_ON();         //南北方向红灯

                

                EW_Timer = unused8;  //关闭所有定时器

                NS_Timer = unused8;

                YEL_Timer = unused8;

……………………



关键字:AT89C51  单片机  十字路口交通灯 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址