單片機實驗:交通燈控制


實驗要求
按照電路要求在Protues中設計電路圖,或者使用開發板。編程實現如下功能:
用單片機端口作輸出口,控制四個方向共12個發光二極管亮滅,模擬交通燈管理。功能描述如下:初始態為四個路口的紅燈全亮之后,東西路口的綠燈亮,南北路口的紅燈亮,東西路口方向通車,延時一段時間后東西路口的綠燈熄滅,黃燈開始閃爍,閃爍若干次后,東西路口紅燈亮,而同時南北路口的綠燈亮,南北路口方向開始通車,延時一段時間后,南北路口的綠燈熄滅,黃燈開始閃爍,閃爍若干次后,再切換到東西路口方向,之后重復以上過程。

代碼

#include <reg52.h>
#include <absacc.h>

#define PA     XBYTE[0x7FFC]   //PA端口地址
#define PB     XBYTE[0x7FFD]        
#define PC     XBYTE[0x7FFE]
#define COM     XBYTE[0x7FFF]

char code dx516[3] _at_ 0x003b;

unsigned char Second[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10};  
unsigned char count = 0, total = 0;

/**************8255初始化******************************/
void init_8255(void)
{
    COM = 0x80;    // C = out B=out A = out
    PA = 0xFF;
    PB = 0xFF;

}

/**************定時器1初始化******************************/
void init_T1(void)
{
    TMOD = 0x10; //定時器1,模式1
  TH1 = 0x3c; // 定時為50ms
  TL1 = 0xb0;       
  ET1 = 1;  //允許定時器中斷1
  EA = 1;    //開總中斷
  TR1 = 1;    
}

//-------------------
// 函數名稱: void delay_s(unsigned t)
// 函數功能: 利用定時器延時t*0.5秒子程序
//-------------------
void delay_s(unsigned char t)
{  
    TR1 = 1;//啟動定時
    total = t * 10;
    count = 0;
    while(1)
    {
      if(count == total)//定時時間到
        {
            count = 0;    
            total = 0;
            TR1 = 0;
            return;
        }
    }
}

void timer1() interrupt 3       //定時器1
{     
    TR1 = 0;
    TH1 = 0x3c;       // 定時為50ms
    TL1 = 0xb0;
    count++;
    TR1 = 1;
}

void main(void)
{
    unsigned char i = 0;
    init_8255();
    init_T1();
    while(1)
    {            
        for(i = 10;i > 0;i--)
        {
            PC = Second[i];            
            if(i < 4)//最后三秒東西方向綠燈和南北方向紅燈閃爍。
            {
                PA = 0xFF;
                PB = 0xFF;                
                  delay_s(1);
                 PA =0xf6;
                PB = 0xdb;
                  delay_s(1);     
            }
            else
            {
                PA = 0xf6;    //東西綠燈亮
                 PB = 0xdb;    //南北紅燈亮 
                delay_s(2);
            }
        }
        
        for(i = 3;i > 0; i--)     //閃爍三秒
        {
            PC = Second[i];
            PA = 0xed;//東西黃燈亮
            PB = 0xed;//南北黃燈亮                
            delay_s(1);
            PA = 0xFF;
            PB = 0xFF;    
            delay_s(1); 
        }
     
        for(i = 10;i > 0;i--)
        {
            PC = Second[i];            
            if(i < 4)            //最后三秒南北方向綠燈和東西方向紅燈閃爍
            {
                PA = 0xFF;
                PB = 0xFF;    
                  delay_s(1);
                PA = 0xDB;  
                  PB = 0xf6;  
                  delay_s(1);     
            }
            else
            {
                PA = 0xdb;     //東西紅燈亮
                  PB =0xf6;   //南北綠燈亮
                delay_s(2);
              }
        }
        
        for(i = 3;i > 0;i--)      //閃爍三秒
        {
            PC = Second[i];
            PA = 0xed; //東西黃燈亮
            PB = 0xed;  //南北黃燈亮                
            delay_s(1);
            PA = 0xff;
            PB = 0xff;    
               delay_s(1); 
        }
    }    
} 

protues仿真

東西方向綠燈和南北方向紅燈:

 

東西南北方向黃燈閃爍三秒:

 

東西方向紅燈和南北方向綠燈:

 

總結

起初數碼管數字和紅綠燈不變化,后來發現是定時器初始化為定時器1,模式1時TMOD賦值出錯。還有賦值的二進制是高位到低位與引腳的高位到低位對應。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM