找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3793|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機十字路口交通燈

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:113330 發(fā)表于 2016-4-10 19:10 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


/***********************************************************
       十字路口交通燈控制 C 程序
***********************************************************/
#include
#define   uchar  unsigned char
#define   uint   unsigned int
/*****定義控制位*******************************************/
sbit  Time_Show_LED2=P2^5; //Time_Show_LED2(直行時間顯示)控制位
sbit  Time_Show_LED1=P2^4; //Time_Show_LED1(直行時間顯示)控制位
sbit   EW_LED2=P2^3;     //EW_LED2控制位
sbit   EW_LED1=P2^2;     //EW_LED1控制位
sbit   SN_LED2=P2^1;     //SN_LED2控制位
sbit   SN_LED1=P2^0;     //SN_LED1控制位
sbit  SN_Yellow=P1^6;       //SN黃燈
sbit  EW_Yellow=P1^2;       //EW黃燈
sbit  EW_ManGreen=P3^0;     //EW人行道綠燈
sbit   SN_ManGreen=P3^1;     //SN人行道綠燈
sbit  Special_LED=P2^6;     //交通特殊指示燈
sbit  Busy_LED=P2^7;        //交通繁忙指示燈
sbit  Nomor_Button=P3^5;    //交通正常按鍵
sbit  Busy_Btton=P3^6;      //交通繁忙按鍵
sbit  Special_Btton=P3^7;   //交通特殊按鍵  
sbit  EW_ManRed=P3^3;       //EW人行道紅燈
sbit  SN_ManRed=P3^4;       //SN人行道紅燈
bit   Flag_SN_Yellow;      //SN黃燈標(biāo)志位
bit   Flag_EW_Yellow;       //EW黃燈標(biāo)志位
char   Time_EW;        //東西方向倒計時單元
char   Time_SN;        //南北方向倒計時單元
uchar EW=60,SN=40,EWL=19,SNL=19;      //程序初始化賦值,正常模式
uchar  EW1=60,SN1=40,EWL1=19,SNL1=19;  //用于存放修改值的變量
uchar codetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //0-9段選碼
uchar code S[8]={0x28,0x48,0x18,0x48,0x82,0x84,0x81,0x84};  
//交通信號燈控制代碼
/**********************延時子程序**************************/
void Delay(uchar a)
{
   uchar  i;
   i=a;
   while(i--){;}
}

/*****************顯示子函數(shù)******************************/
void Display(void)
{
   uchar h,l;
   h=Time_EW/10;
   l=Time_EW%10;
   P0=table[l];        
   EW_LED2=1;       //點亮EW_LED2
   Delay(2);
   EW_LED2=0;        //熄滅EW_LED2
   P0=table[h];
   EW_LED1=1;        //點亮EW_LED1
   Delay(2);
   EW_LED1=0;

   h=Time_SN/10;
   l=Time_SN%10;
   P0=table[l];
   SN_LED2=1;        //點亮SN_LED2
   Delay(2);
   SN_LED2=0;
   P0=table[h];
   SN_LED1=1;      //點亮SN_LED1
   Delay(2);
   SN_LED1=0;

   h= EW1/10;
   l= EW1%10;
   P0=table[l];
   Time_Show_LED1=1;  //點亮Time_Show_LED1
   Delay(2);
   Time_Show_LED1=0;
   P0=table[h];
   Time_Show_LED2=1; //點亮Time_Show_LED2
   Delay(2);
   Time_Show_LED2=0;
}
/**********************外部0中斷服務(wù)程序******************/

void INT0_srv(void)interrupt 0 using 1
{
    EX0=0;               //關(guān)中斷

    if(Nomor_Button==0)//測試按鍵是否按下,按下為正常狀態(tài)
    {
EW1=60;
SN1=40;
EWL1=19;
SNL1=19;
Busy_LED=0;     //關(guān)繁忙信號燈
Special_LED =0; //關(guān)特殊信號燈
    }
   if(Busy_Btton==0)   //測試按鍵是否按下,按下為繁忙狀態(tài)
    {
EW1=45;
SN1=30;
EWL1=14;
SNL1=14;
Special_LED=0;  //關(guān)特殊信號燈
Busy_LED=1;     //開繁忙信號燈

    }
   if(Special_Btton==0)//測試按鍵是否按下,按下為特殊狀態(tài)
    {
EW1=75;
SN1=55;
EWL1=19;
SNL1=19;
Busy_LED=0;    //關(guān)繁忙信號燈
Special_LED =1;//開特殊信號燈
    }               
       EX0=1;         //開中斷
}
/**********************T0中斷服務(wù)程序*******************/
void timer0(void)interrupt 1 using 1
{
   static uchar count;
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
   count++;

   if(count==10)
   {
       if(Flag_SN_Yellow==1)  //測試南北黃燈標(biāo)志位
           {SN_Yellow=~SN_Yellow;}
       if(Flag_EW_Yellow==1)  //測試東西黃燈標(biāo)志位
           {EW_Yellow=~EW_Yellow;}
   }
   if(count==20)
   {
       Time_EW--;
       Time_SN--;
       if(Flag_SN_Yellow==1)  //測試南北黃燈標(biāo)志位
           {SN_Yellow=~SN_Yellow;}
       if(Flag_EW_Yellow==1)  //測試東西黃燈標(biāo)志位
           {EW_Yellow=~EW_Yellow;}
       count=0;
   }
}
/*********************主程序開始***********************/
void   main(void)
{
Busy_LED=0;
Special_LED=0;
IT0=1;       //INT0負(fù)跳變觸發(fā)
TMOD=0x01; //定時器工作于方式1
TH0=(65536-50000)/256; //定時器賦初值
TL0=(65536-50000)%256;
EA=1; //CPU開中斷總允許
ET0=1; //開定時中斷
EX0=1; //開外部INTO中斷
TR0=1; //啟動定時

    while(1)
    {            
        /*******S0狀態(tài)**********/
SN_ManRed=0;
SN_ManGreen=1;  //SN人行道通行
EW_ManRed=1;  //EW人行道禁止
EW_ManGreen=0;
Flag_EW_Yellow=0;      //EW關(guān)黃燈顯示信號
Time_EW=EW;
Time_SN=SN;
while(Time_SN>=5)
       {   
           P1=S[0];  //SN綠燈,EW紅燈
           Display();
       }

       /*******S1狀態(tài)**********/
       P1=0x00;
       while(Time_SN>=0)
       {
Flag_SN_Yellow=1; //SN開黃燈信號位
P1=P1|0x08;    //保持EW紅燈
Display();
       }

       /*******S2狀態(tài)**********/
SN_ManRed=1;      //SN人行道禁止
SN_ManGreen=0;
EW_ManRed=1;    //EW人行道禁止
EW_ManGreen=0;
Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號
Time_SN=SNL;
while(Time_SN>=5)
       {
P1=S[2];      //SN左拐綠燈亮,EW紅燈
Display();
       }

       /*******S3狀態(tài)**********/
       P1=0x00;
       while(Time_SN>=0)
       {
Flag_SN_Yellow=1;    //SN開黃燈信號位
P1=P1|0x08;    //保持EW紅燈
Display();
       }

       /***********賦值*********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
       /*******S4狀態(tài)**********/
SN_ManRed=1;      //SN人行道禁止
SN_ManGreen=0;
EW_ManRed=0;
EW_ManGreen=1;     //EW人行道通行
Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號
Time_EW=SN;
Time_SN=EW;
while(Time_EW>=5)
       {
           P1=S[4];    //EW通行,SN紅燈
          Display();
       }

       /*******S5狀態(tài)**********/
       P1=0X00;
       while(Time_EW>=0)
       {
Flag_EW_Yellow=1;//EW開黃燈信號位
P1=P1|0x80;    //保持SN紅燈
Display();
       }

       /*******S6狀態(tài)**********/
SN_ManRed=1;     //SN人行道禁止
SN_ManGreen=0;
EW_ManRed=1;   //EW人行道禁止
EW_ManGreen=0;
Flag_EW_Yellow=0;//EW關(guān)黃燈顯示信號
Time_EW=EWL;
while(Time_EW>=5)
       {
P1=S[6];     //EW左拐綠燈亮,SN紅燈
Display();
       }

       /*******S7狀態(tài)**********/
       P1=0X00;
       while(Time_EW>=0)
       {
Flag_EW_Yellow=1; //EN開黃燈信號位
P1=P1|0x80;    //保持SN紅燈
Display();
       }

       /***********賦值********/
       EW=EW1;
       SN=SN1;
       EWL=EWL1;
       SNL=SNL1;
   }
}


評分

參與人數(shù) 2黑幣 +25 收起 理由
夜辰南 + 5 回帖助人的獎勵!
admin + 20 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:165640 發(fā)表于 2017-3-16 19:41 | 只看該作者
這圖畫的6
回復(fù)

使用道具 舉報

板凳
ID:169827 發(fā)表于 2017-3-17 11:20 | 只看該作者
老哥,有沒有代碼加proteus仿真的打包呀,十分感謝
回復(fù)

使用道具 舉報

地板
ID:199133 發(fā)表于 2017-5-10 16:05 | 只看該作者
很有用,謝謝坐著了
回復(fù)

使用道具 舉報

5#
ID:200060 發(fā)表于 2017-5-13 19:06 | 只看該作者
是用8255做的嗎
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表