東西(A)、南北(B)兩幹道交於一個十字路口, 各幹道有一組紅、黃、綠三個指示燈, 指揮車輛和行人安全通行。 紅燈亮禁止通行, 綠燈亮允許通行。 為20秒, 信號燈的狀態規則:每一方向亮綠燈, 而另一方向亮紅燈, 紅燈時間比綠燈長3秒, 當綠燈減到0時,到下一個狀態, 此時綠燈方向的變為黃色, 依次迴圈。 設A道和B道的車流量相同。
設計思路初始狀態1為東西綠燈通車, 延時17秒, 南北紅燈禁止, 延時20秒。 然後轉狀態2為東西黃燈, 延時3秒, 南北仍然紅燈禁止。 過一段時間轉狀態3, 東西紅燈禁止, 延時30秒, 南北綠燈, 延時27秒。
部分電路圖
顯示電路
LED
延時程式及解析
void delay(long v)
{
while(v!=0)v--;
}
delay(100)究竟延時多久呢?就是這句話執行需要的時間。
時間等於:機器週期×需要的機器週期數
(在模擬環境中可以測試出來)
主程序#include
#include
volatile unsigned char hcq[4];
volatile unsigned char wei,duan;
volatile unsigned char i,j=2;
void rid(void);
main(void)
{
WDTCTL = WDTPW | WDTHOLD;// Stop watchdog timer
TA0CCTL0=CCIE;//使能捕獲比較中斷
TA0CCR0=12000;
TA0CTL=TASSEL_1+TACLR+MC_1;//計時器A時鐘源為ACLK,計數器清零, 增計數模式
P1DIR=0XFF;
P2DIR=0XFF;
_enable_interrupts();
進入四個狀態的迴圈
while(1)
{
hcq[0]=1;//第一個狀態
hcq[1]=7;
hcq[2]=2;
hcq[3]=0;
while(hcq[0]!=0||hcq[1]!=0)
{P2OUT=0xde;
rid();
}
hcq[0]=0;//第二個狀態
hcq[1]=3;
while(hcq[0]!=0||hcq[1]!=0)
{P2OUT=0xdd;
rid();
}
hcq[0]=3;//第三個狀態
hcq[1]=0;
hcq[2]=2;
hcq[3]=7;
while(hcq[2]!=0||hcq[3]!=0)
{P2OUT=0xf3;
rid();
}
hcq[2]=0;//第四個狀態
hcq[3]=3;
while(hcq[2]!=0||hcq[3]!=0)
{ P2OUT=0xeb;
rid();
}
}
}
計時器中斷函數
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
j--;
while(j==0);
{
j=2;
hcq[1]--;
hcq[3]--;
while(hcq[1]==0xff)
{hcq[0]--;
hcq[1]=9;
}
while(hcq[3]==0xff)
{hcq[2]--;
hcq[3]=9;
}
}
}
調用顯示副程式
void rid()
{
wei=0xe0;
duan=hcq[0];
P1OUT=wei+duan;
__delay_cycles(500);
wei=0xd0;
duan=hcq[1];
P1OUT=wei+duan;
__delay_cycles(500);
wei=0xb0;
duan=hcq[2];
P1OUT=wei+duan;
__delay_cycles(500);
wei=0x70;
duan=hcq[3];
P1OUT=wei+duan;
__delay_cycles(500);
}
本文素材來自電子發燒友論壇
智慧電子產品設計與製作--單片機技術應用項目教程(基於工作過程的單片機課程改革教材高 ¥17.76 購買
MSP430超低功耗單片機原理與應用(第2版TI MSP430大學計畫教材) ¥35.28 購買