|
這是我花了一段時(shí)間寫出來的基于單片機(jī)的十字路口紅綠燈,下面的附件包含了源代碼,仿真圖,還有生成的hex文件。
功能如下
功能1:紅燈和綠燈相互轉(zhuǎn)換時(shí)經(jīng)過黃燈,黃燈閃爍三次(6秒)
利用延時(shí)函數(shù)實(shí)現(xiàn)黃燈閃爍;紅綠黃LED燈接地,用P1口連接LED燈,置P1低電平點(diǎn)亮,置高電平熄滅.
基本功能:輸入輸出,延時(shí)函數(shù)
外接元件:紅綠黃LED燈
外接元件功能:有熄滅和點(diǎn)亮兩種狀態(tài).
功能2:主干道方向通行30秒,輔干道方向通行20秒,單獨(dú)左轉(zhuǎn)信號(hào)15秒;先直行信號(hào),后左轉(zhuǎn)信號(hào)。
讓連接直行綠燈的P1口置低電平和用定時(shí)器中斷計(jì)時(shí)30s,再讓連接左轉(zhuǎn)綠燈的P1口置低電平和用定時(shí)器中斷計(jì)時(shí)15秒.
基本功能:輸入輸出,定時(shí)器中斷
外接元件:LED燈;LED數(shù)碼管
外接元件功能:連接電路和斷開電路;可以顯示時(shí)間
功能3:設(shè)手動(dòng)、自動(dòng)、特殊情況三種方式。
通過按鍵來實(shí)現(xiàn)三種情況的實(shí)現(xiàn)
P3口各連接一個(gè)開關(guān)后接地,作為手動(dòng)檔和自動(dòng)檔、特殊情況檔.使開關(guān)置0就能選擇自己想要的一種方式
基本功能:輸入輸出
外接元件:按鈕
外接元件功能:連接電路和斷開電路
功能4:特殊情況時(shí)所有路口紅燈都亮,給120、110等通行。
LED燈接地,四個(gè)路口12個(gè)LED燈都接P1口
使P1口全部置1,LED燈熄滅
再使連接紅燈的P1口置0
基本功能:輸入輸出
外接元件:LED燈
外接元件功能:熄滅和點(diǎn)亮兩種情況
功能5:自動(dòng)時(shí)顯示各種狀態(tài)倒計(jì)時(shí)。
通過定時(shí)器中斷和LED數(shù)碼管的顯示來實(shí)現(xiàn)各種狀態(tài)的倒計(jì)時(shí).
基本功能:定時(shí)器中斷
外接元件:LED數(shù)碼管
外接元件功能:可以顯示時(shí)間
功能6:夜間模式
(夜間的時(shí)候,四個(gè)路口一直亮黃燈)
類似于特殊情況,使P1=0x77,即可實(shí)現(xiàn)
基本功能:輸入輸出
外接元件:LED燈
外接元件功能:點(diǎn)亮和熄滅兩種狀態(tài)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (202.64 KB, 下載次數(shù): 77)
下載附件
2022-6-3 05:16 上傳
紅綠燈.png (243.14 KB, 下載次數(shù): 55)
下載附件
2022-5-30 13:07 上傳
單片機(jī)源程序如下(程序有詳細(xì)注釋):
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit wela = P2^7; // 數(shù)碼管位選
- sbit dula = P2^6; // 數(shù)碼管段選
- // 下面是八個(gè)交通燈對應(yīng)的位定義
- sbit LED1_blue = P1^0;
- sbit LED1_red = P1^1;
- sbit LED1_green = P1^2;
- sbit LED1_yellow = P1^3;
- sbit LED2_blue = P1^4;
- sbit LED2_red = P1^5;
- sbit LED2_green = P1^6;
- sbit LED2_yellow = P1^7;
- // 按鍵位定義
- sbit key_auto = P3^0; // 自動(dòng)
- sbit key_step = P3^1; // 手動(dòng)
- sbit key_emerg = P3^2; // 緊急情況 110/120通過
- sbit key_night = P3^6;// 夜間模式
- uint cnt = 0; // 記錄定時(shí)器定時(shí)了多少毫秒
- uint sec = 0; // 記錄定時(shí)器計(jì)時(shí)了多少秒
- uchar light_num = 0;
- // 四位八段共陰極數(shù)碼管數(shù)字顯示編碼
- uchar code table[]={
- //"0" "1" "2" "3"
- 0x3f,0x06,0x5b,0x4f,
- //"4" "5" "6" "7"
- 0x66,0x6d,0x7d,0x07,
- //"8" "9" "A" "B"
- 0x7f,0x6f,0x77,0x7c,
- //"C" "D" "E" "F"
- 0x39,0x5e,0x79,0x71
- };
- uchar code light[]={
- // 主G輔R 主G輔R 主Y輔R
- 0xdb, 0xde, 0xd7,
- // 主R輔G 主R輔B 主R輔R
- 0xbd, 0xed, 0x7d,
- 0xdf, 0xee, 0xdd
- };
- /*************函數(shù)聲明********************/
- void delay_ms(uint);
- void system_Init();
- void Display_R_time(uchar);
- void Display_C_time(uchar);
- void key_scan();
- void main()
- {
- system_Init();
- while(1)
- {
- key_scan();
- }
- }
- // 毫秒級(jí)延時(shí)
- void delay_ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=123;y>0;y--);
- }
- // 系統(tǒng)初始化
- void system_Init()
- {
- wela=0; // 關(guān)閉位選
- dula=0; // 關(guān)閉段選
- TMOD=0x01; // 定時(shí)器0方式1 16位
- TH0=0x4c; // 定時(shí)器裝初值 50ms(11.05926MHz TH0=0x4c TL0=0x00)
- TL0=0x00; // (12MHz 的初值是 TH0=0x3c TL0=0xb0)
- EA=1; // 開總中斷
- ET0=1; // 開定時(shí)器0中斷
- TR0=1; // 允許中斷溢出
- }
- // 顯示橫向的(即輔干道)倒計(jì)時(shí)
- void Display_R_time(uchar time)
- {
- uchar time_tens, time_ones;
- time_tens = time / 10; // 提取倒計(jì)時(shí)時(shí)間的十位數(shù)
- time_ones = time % 10; // 提取倒計(jì)時(shí)時(shí)間的個(gè)位數(shù)
- // 下面對兩位數(shù)倒計(jì)時(shí)時(shí)間進(jìn)行顯示(數(shù)碼管)
- P0=0xff;
- wela=1;
- P0=0xbf;
- wela=0;
- dula=1;
- P0=table[time_tens];
- dula=0;
- delay_ms(1);
-
- P0=0xff;
- wela=1;
- P0=0x7f;
- wela=0;
- dula=1;
- P0=table[time_ones];
- dula=0;
- delay_ms(1);
- }
- // 顯示豎向的(即主干道)倒計(jì)時(shí)
- void Display_C_time(uchar time)
- {
- uchar time_tens, time_ones;
- time_tens = time / 10;
- time_ones = time % 10;
-
- P0=0xff;
- wela=1;
- P0=0xfb;
- wela=0;
- dula=1;
- P0=table[time_tens];
- dula=0;
- delay_ms(1);
- P0=0xff;
- wela=1;
- P0=0xf7;
- wela=0;
- dula=1;
- P0=table[time_ones];
- dula=0;
- delay_ms(1);
- }
- void key_scan()
- {
- if(key_auto == 0)
- {
- delay_ms(5);
- if(key_auto == 0) // 自動(dòng)按鈕按下
- {
- // 主干道通過 輔干道紅燈
- if(sec <= 15)
- {
- Display_C_time(15-sec); // 倒計(jì)時(shí)顯示
- Display_R_time(30-sec);
- P1 = light[0]; // 主道綠燈亮 輔道紅燈亮
- }
- else if(sec > 15 && sec <= 24)
- {
- Display_C_time(24-sec); // 倒計(jì)時(shí)顯示
- Display_R_time(30-sec);
- P1 = light[1]; // 主道藍(lán)燈亮 單獨(dú)左轉(zhuǎn) 輔道紅燈亮
- }
- else if(sec > 24 && sec <= 30)
- {
- Display_C_time(30-sec); // 倒計(jì)時(shí)顯示
- Display_R_time(30-sec);
- P1 = light[2]; // 主道黃燈亮 輔道紅燈亮
- }
-
- // 下面換道
- else if(sec > 30 && sec <= 35)
- {
- Display_R_time(35-sec); // 倒計(jì)時(shí)顯示
- Display_C_time(50-sec);
- P1 = light[3]; // 主道紅燈亮 輔道綠燈亮
- }
- else if(sec > 35 && sec <= 44)
- {
- Display_R_time(44-sec); // 倒計(jì)時(shí)顯示
- Display_C_time(50-sec);
- P1 = light[4]; // 主道紅燈亮 輔道藍(lán)燈亮 單獨(dú)左轉(zhuǎn)信號(hào)
- }
- else if(sec > 44 && sec <= 50)
- {
- Display_R_time(50-sec); // 倒計(jì)時(shí)顯示
- Display_C_time(50-sec);
- P1 = light[5]; // 主道紅燈亮 輔道黃燈亮
- }
-
- else
- {
- sec = 0;// 秒數(shù)清零,繼續(xù)循環(huán)上述代碼
- }
- }
-
- }
- // 手動(dòng)步進(jìn)按鈕按下,按一次,交通燈的狀態(tài)改變一次
- if(key_step == 0)
- {
- delay_ms(5);
- if(key_step == 0)
- {
- if(light_num == 6)
- {
- light_num = 0;
- }
- P1 = light[light_num];
- light_num++;
- while(!key_step); // 松手檢測
- }
- }
- // 緊急情況 emergency
- if(key_emerg == 0)
- {
- delay_ms(5);
- if(key_emerg == 0)
- {
- P1 = 0xdd; // 主干道輔干道都是紅燈
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
Keil代碼與Proteus8.8仿真下載:
基于單片機(jī)的十字路口紅綠燈控制器.7z
(347.29 KB, 下載次數(shù): 76)
2022-6-3 05:19 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|