采用單片機的I/O口PO口通過上拉電阻和交通燈相連接,P3.0、P3.1口接到數碼管控制位上,控制數碼管的顯示,程序放在STC89C52RC單片機的ROM中,在十字路口的四組紅、黃、綠交通燈中,由單片機的 P1.0-P1.2 、P1.5-P1.7、P2.0-P2.2、P2.5-P2.7控制,由于交通燈為發光二極管且陽極通過限流電阻和電源正極相連,因此I/0口輸出低電平時,與之相連的指示燈會亮,并通過數碼管顯示時間倒計時。I/0口輸出高電平時,相應指示燈會滅。當交通出現障礙需要恢復到初始狀態時,按下復位鍵即可,此鍵由單片機的9腳RST鍵控制。
制作出來的實物圖如下:
1604058595971.jpg (2.93 MB, 下載次數: 54)
下載附件
2020-10-30 20:02 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (33.93 KB, 下載次數: 57)
下載附件
2020-10-30 22:02 上傳
51hei.png (58.68 KB, 下載次數: 57)
下載附件
2020-10-30 22:02 上傳
主函數:
//主程序
void main()
{
TMOD=0X11; //定時器設置
TH1=0X3C;
TL1=0XB0;
TH0=0X3C; //定時器0置初值 0.05S
TL0=0XB0;
EA=1; //開總中斷
ET0=1; //定時器0中斷開啟
ET1=1; //定時器1中斷開啟
TR0=1; //啟動定時0
TR1=0; //關閉定時1
EX0=1; //開外部中斷0
EX1=1; //開外部中斷1
P1=0X21; // 開始默認狀態,東西綠燈,南北黃燈
sec_nb=sec_dx+5; //默認南北通行時間比東西多5秒
while(1) //主循環
{
key(); //調用按鍵掃描程序
display(); //調用顯示程序
}
}
//函數的定義部分
void key(void) //按鍵掃描子程序
{
if(k1!=1) //當K1(禁止)鍵按下時
{
display(); //調用顯示,用于延時消抖
if(k1!=1) //如果確定按下
{
TR0=0; //關定時器
P1=0X00;
Red_dx=1;
Red_nb=1; //全部置紅燈
TR1=0;
sec_dx=00; //四個方向的時間都為00
sec_nb=00;
do
{
display(); //調用顯示,用于延時
}
while(k1!=1); //等待按鍵釋放
}
}
if(k2!=1) //當K2(確認)鍵按下時
{
display(); //調用顯示,用于延時消抖
if(k2!=1) //如果確定按下
{
TR0=1; //啟動定時器0
sec_nb=set_timenb; //從中斷回復,仍顯示設置過的數值
sec_dx=set_timedx; //顯示設置過的時間
TR1=0; //關定時器1
if(set==0) //時間倒時到0時
{
P2=0X00; //滅顯示
Green_dx=1; //東西綠燈亮
Red_nb=1; //南北紅燈亮
sec_nb=sec_dx+5; //回到初值
}
else
{
P2=0x00; //南北綠燈,東西紅燈
Green_nb=1;
Red_dx=1;
sec_dx=sec_nb+5;
}
}
}
}
51hei.png (11.39 KB, 下載次數: 62)
下載附件
2020-10-30 22:01 上傳
全部資料51hei下載地址:
交通燈.zip
(16.79 MB, 下載次數: 129)
2020-10-30 20:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|