奶爸業餘單片機學習之:用數位管及LED實現交通燈(初版)

來源:互聯網
上載者:User

標籤:color   ar   sp   c   on   amp   r   時間   ad   

/*

* 行人路交通燈程式:LED2(紅燈)、LED3(黃燈)、LED4(綠燈)
* 紅燈30秒,綠燈3秒,綠燈15秒,倒計時
燈亮時間顯示在數位管上
* 晶振11.0592MHz,LED、數位管由三八解碼器控制,T0中斷

*程式思路:由於三八解碼器每次只能輸出一個低電平,因此必須用動態掃描方式點亮數位管及LED,中斷間隔1ms

*亮燈時間倒數,紅燈60秒,綠燈20秒,黃燈3秒,順序:紅 - 綠 -黃 -紅迴圈,因此每經曆1000次中斷,實現數字遞減。

*/

#include<reg52.h>
unsigned char K;//1s定時標誌
unsigned char SMG_BUFFER[2]={0xff,0xff};//數位管顯示緩衝

unsigned char RED,YELLOW,GREEN;
sbit LED2_RED = P0^0; //紅燈介面
sbit LED3_YELLOW = P0^1;//黃燈介面
sbit LED4_GREEN = P0^2;//綠燈介面

//三八解碼器控制數位管,個位:01000,十位:01001
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED1 = P1^4;

//數位管0~9
unsigned char code SMG[10]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//數位管顯示
void SMG_DISPLAY()
{
  unsigned char SHIJIAN;//燈亮時間
  static unsigned char color = 0;//顏色標誌:0:紅燈,1:黃燈,2:綠燈 ,預設從紅燈開始
  if(SHIJIAN <= 1)//倒數到1秒時,開始變化,
  {
    switch(color)
    {
    case 0:color = 2;SHIJIAN = 10;RED = 1;break;//紅燈60秒,結束後紅轉綠,紅燈標誌位置1
    case 1:color = 0;SHIJIAN = 3;YELLOW = 1;break;//黃燈3秒,結束後黃轉紅,黃燈標誌位置1
    case 2:color = 1;SHIJIAN = 20;GREEN = 1;break;//;綠燈20秒,結束後綠轉黃,綠燈標誌位置1
    default:break;
    }
  }
  else SHIJIAN--;//時間遞減
  if(SHIJIAN == 1)//直到1,時間發生變化
  {
    RED = 0;YELLOW = 0;GREEN = 0;//各標誌位置0
  }
  SMG_BUFFER[0] = SMG[SHIJIAN % 10];//數位管顯示,個位
  SMG_BUFFER[1] = SMG[SHIJIAN / 10 % 10];//十位
}

//定時器配置
void config_interruptime0()
{
  TMOD = TMOD & 0XF0;
  TMOD = TMOD | 0X01;
  TH0 = 0XFC;
  TL0 = 0X66;
  EA = 1;
  ET0 = 1;
  TR0 = 1;
}

void init()
{
  ADDR3 = 1;
  ENLED1 = 0;
}
int main()
{
  init();
  config_interruptime0();
  while(1)
  {
    if(K == 1)//檢查1秒定時時間是否達到
    {
      K = 0;//K重設
      SMG_DISPLAY();//重新整理顯示
    }
  }
  return 0;
}

void interruptime0() interrupt 1
{
  static unsigned int cnt = 0;
  static unsigned int i = 0;
  TH0 = 0XFC;//1ms初值
  TL0 = 0X66;
  cnt++;

  switch(i)
  {
    case 0:P0 = 0XFF; ADDR0 = 0; ADDR1 = 0; ADDR2 = 0; i++; P0 = SMG_BUFFER[0];break;//數位管個位顯示
    case 1:P0 = 0XFF; ADDR0 = 1; ADDR1 = 0; ADDR2 = 0; i++; P0 = SMG_BUFFER[1];break;//數位管十位顯示
    case 2:P0 = 0XFF; ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; i=0; //LED顯示
    if(RED == 1)
    {
      LED2_RED = 0;
    }
    if(YELLOW == 1)
    {
      LED3_YELLOW = 0;
    }
    if(GREEN == 1)
    {
      LED4_GREEN = 0;
    }
    break;
  }
  if(cnt == 1000)
  {
    K = 1;//1秒時間達到時,K = 1
    cnt = 0;
  }
}

奶爸業餘單片機學習之:用數位管及LED實現交通燈(初版)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.