標籤: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實現交通燈(初版)