該文件包括了電路圖,仿真,程序,論文,資料等。當時是課設時做得,拿出來與大家分享。
0.png (64.04 KB, 下載次數: 112)
下載附件
2017-2-12 21:51 上傳
所有資料下載:
智能交通指示燈.rar
(4.84 MB, 下載次數: 305)
2017-1-20 11:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
下面是交通燈設計方案論證報告,壓縮包里面還有完整的word格式的正式論文下載,很全面.
專業課程設計設計方案論證報告
一、課題研究的目的和意義 交通燈在我們的生活中起著非常重要的作用,不僅與人們的生命安全息息相關,同時也關系到交通的正常運行。隨著人們安全意識的逐漸增高,人們對安全也有了新的認識,所以交通部門要認識到交通燈控制系統的重要性,努力完善交通控制系統。 二、課題研究的主要任務和預期目標 1.主要任務及要求 ①東西、南北方向均有紅、黃、綠三種信號燈 ②帶緊急制動按鈕,按鈕按下,所有方向亮紅燈;再次按下,恢復正常顯示 ③夜間模式按鈕按下,所有方向顯示黃燈閃爍 ④實時提醒綠燈亮的剩余時間 ⑤并可實現通行時間的按鍵輸入。例如(1)南北紅燈亮維持25S。在南北紅燈亮的同時東西綠燈也亮,并維持20S。到20S時,東西綠燈閃爍,閃爍3S后熄滅。在東西綠燈熄滅時,東西黃燈亮,并維持2S。到2S時,東西黃燈熄,東西紅燈亮。同時,南北紅燈熄滅,南北綠燈亮。(2)東西紅燈亮維持30S。南北綠燈亮維持25S。然后閃爍3S,熄滅。同時南北黃燈亮,維持2S后熄滅,這時南北紅燈亮,東西綠燈亮。 2.預期目標 實現主要任務及要求,并在其基礎上增添人行指示燈等其他功能。 三、設計方案 1.設計思想(總體的設計思路\想法) 一個交通指示燈系統分為指示燈顯示、倒計時顯示兩個大部分。指示燈顯示部分中各個燈的情況如圖所示。
0.png (43.02 KB, 下載次數: 115)
下載附件
2017-2-12 22:00 上傳
倒計時部分則利用晶振進行計時,設計一個1s的定時,設置初始值后每1s將初始值-1,并輸出給數碼管,從而達到倒計時的功能。 2.方案論證(要有多種方案的比較)
方案1:采用標準STC89C51單片機作為控制器通行倒計時顯示采用2位LED數碼管;指示燈采用發光二極管;LED顯示采用動態掃描,以節省端口。緊急情況采用中斷完成。以上系統結構框架設計,單片機端口剛好滿足要求。該系統具有電路的簡單,設計方便,顯示清晰等特點。整體框圖、流程圖如圖所示。
0.png (9.43 KB, 下載次數: 114)
下載附件
2017-2-12 22:01 上傳
0.png (15.58 KB, 下載次數: 104)
下載附件
2017-2-12 22:02 上傳
0.png (5.94 KB, 下載次數: 115)
下載附件
2017-2-12 22:02 上傳
方案2:采用SCT89C2051單片機作為控制器,通行倒計時采用16X16點陣LED發光管;列驅動采用74LS595以實現串行端口擴展,行驅動采用4/16譯碼器74LS154動態掃描;譯碼器74LS154生成16條行選通信號線,再經過驅動器驅動對應的行線。每條行線上需要較大的驅動電流,應選用大功率三極管作為驅動。這種方案顯示可以更加清晰明了,單片機占用端口少,但是需要大量硬件,電路復雜,耗電量大。整體電路如下圖
0.png (9.23 KB, 下載次數: 108)
下載附件
2017-2-12 22:03 上傳
3.設計中要解決的主要問題和措施 問題一:如何實現倒計時與燈的變化相同步 在整個交通系統中,指示燈與倒計時相同步是重要的問題,設定的時間不光是倒計時也是指示燈的顯示時間,因此解決此問題就變得尤為重要。 問題二:如何能夠調節數碼管所顯示的數值 任務要求需要使得倒計時時間可調,那就需要將數碼管顯示的數值進行合理調整,同時還要確保時間和指示燈相對應。 解決方案一:可以看出,無論倒計時數十多少,指示燈發生變化的時間都是最后5s,因此,我們想出的方案是,不用想倒計時一共是多少時間而是僅在最后5s時做出判斷,判斷出是綠燈閃爍還是黃燈亮起。 解決方案二:對于數碼管數值調整,可以想到+1/-1的調整程序,這類程序,我們在單片機的課程中已經學習,通過+1/-1的程序從而實現對數碼管數值的調整。 四、課題進度安排 1、第一天至第三天:熟悉課題、查閱資料、合理分工、撰寫方案論證報告。 2、第四天至十一天:硬件電路設計及軟件設計。 3、十二天至十九天:實物的焊接及調試。 4、二十至二十一天:準備材料答辯。
單片機智能交通指示燈仿真效果圖:
0.png (263.61 KB, 下載次數: 134)
下載附件
2017-2-12 21:53 上傳
智能交通指示燈的單片機源程序:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- // 0 1 2 3 4 5 6 7 8 9
- uchar code smg_du[]={0xc0,0xf5,0x8c,0x94,0xb1,0x92,0x82,0xf4,0x80,0x90};
- uchar dis_smg[10] = {0xc0,0xf5,0x8c,0x94,0xb1,0x92,0x82,0xf4,0x80,0x90};
- uchar smg_i = 4; //位數
- sbit smg_we1 = P2^0;
- sbit smg_we2 = P2^1;
- sbit smg_we3 = P3^6;
- sbit smg_we4 = P3^7;
- sbit LE1 = P3^3;
- sbit LE2 = P3^3;
- char dx_s = 0; //倒計時開始
- char nb_s = 0;
- sbit dx_red = P2^4; //東西紅燈
- sbit dx_green = P2^3; //東西綠燈
- sbit dx_yellow = P2^2; //東西黃燈
- sbit nb_red = P2^7; //南北紅燈
- sbit nb_green = P2^6; //南北綠燈
- sbit nb_yellow = P2^5; //南北黃燈
- bit flag_1s = 0; //延時標志
- bit flag_500ms;
- bit flag_dx_nb;
- uchar flag_5m_value;
- uchar i;
- uchar nb_time = 10,dx_time = 15; //東西南北時間初值
- uchar flag_jdgz ; //交通燈
- // 數碼管為位選
- void smg_we_switch(uchar i)
- {
- switch(i)
- {
- case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
- case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
- case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
- case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
- }
- }
- // 延時程序
- void delay_01ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<110;j++);
- }
- // 數碼管顯示
- void display()
- {
- uchar i;
- for(i=0;i<smg_i;i++)
- {
- P0 = 0xff;
- smg_we_switch(i);
- P0 = dis_smg[i];
- delay_01ms(3);
- }
- }
- // 定時器初始化
- void time0_init()
- {
- EA = 1;
- TMOD = 0X11;
- ET0 = 1;
- TR0 = 1;
- ET1 = 0;
- TR1 = 0;
- }
- // 交通燈管理
- void jiaotongdeng_dis()
- {
- if(flag_1s == 1)
- {
- flag_1s = 0;
- if(dx_s == 0)
- {
- if(flag_dx_nb == 1)
- {
- dx_s = nb_time; //南北時間
- nb_s = dx_time;
- }
- else
- {
- dx_s = dx_time; //東西時間
- nb_s = nb_time;
- }
- flag_dx_nb = ~flag_dx_nb;
- }
- dx_s --;
- nb_s --;
- }
- dis_smg[0] = smg_du[dx_s % 10] ;
- dis_smg[1] = smg_du[dx_s / 10] ;
- dis_smg[2] = smg_du[nb_s % 10] ;
- dis_smg[3] = smg_du[nb_s / 10] ;
- // 東西時間
- if(flag_dx_nb == 0)
- {
- if(nb_s > 5)
- {
- dx_red = 1; //東西紅燈滅
- dx_green = 0; //東西綠燈亮
- dx_yellow = 1; //東西黃燈滅
- nb_red = 0; //南北紅燈亮
- nb_green = 1; //南北綠燈滅
- nb_yellow = 1; //南北綠燈亮
- flag_5m_value = 0;
- }
- if(nb_s >= 0&&nb_s <= 5) //綠燈閃爍
- {
- dx_red = 1; //東西紅燈滅
- dx_yellow = 1; //東西黃燈滅
- nb_red = 0; //南北紅燈亮
- nb_green = 1; //南北綠燈滅
- nb_yellow = 1; //南北黃燈滅
- if(flag_500ms == 0) //綠燈閃爍
- {
- dx_green = 0;
- }
- else
- {
- dx_green = 1;
- }
- }
-
- if(nb_s==0)
- {
- dx_red = 1; //東西紅燈滅
- dx_green = 1; //東西綠燈滅
- dx_yellow = 0; //東西黃燈亮
- nb_red = 0; //南北紅燈亮
- nb_green = 1; //南北綠燈滅
- nb_yellow = 1; //南北黃燈滅
- }
-
- }
- // 南北時間
- if(flag_dx_nb == 1)
- { LE1=1;
- if(dx_s > 5)
- {
- dx_red = 0; //東西紅燈亮
- dx_green = 1; //東西綠燈滅
- dx_yellow = 1; //東西黃燈滅
- nb_red = 1; //南北紅燈滅
- nb_green = 0; //南北綠燈亮
- nb_yellow = 1; //南北黃燈滅
- flag_5m_value = 0;
- }
- if(dx_s >= 0&&dx_s <= 5) //綠燈閃爍
- {
- dx_red = 0; //東西紅燈亮
- dx_green = 1; //東西綠燈滅
- dx_yellow = 1; //東西黃燈滅
- nb_red = 1; //南北紅燈滅
- nb_yellow = 1; //男別黃燈滅
- if(flag_500ms == 0) //綠燈閃爍
- {
- nb_green = 0;
- }
- else
- {
- nb_green = 1;
- }
- }
-
- }
- }
- // 按鍵設置
- uchar key_can; //定義按鍵鍵值
- void key() //按鍵
- {
- static uchar key_new;
- key_can = 5; //鍵值最大
- P1 |= 0x1f;
- if((P1 & 0x1f) != 0x1f) //確定按鍵
- {
- delay_01ms(1); //消除抖動
- if(((P1 & 0x1f) != 0x1f) && (key_new == 1))
- { //確定鍵值按下
- key_new = 0;
- switch(P1 & 0x1f)
- {
- case 0x1e: key_can = 1; break; //模式鍵
- case 0x1d: key_can = 2; break; //加鍵
- case 0x1b: key_can = 3; break; //減鍵
- case 0x17: key_can = 4; break; //緊急模式鍵
- }
- }
- }
- else
- key_new = 1;
- }
- uchar menu_1,flag_s;
- // 四種鍵值
- void key_with()
- {
- if(key_can == 4) //緊急模式
- {
- flag_jdgz ++;
- if(flag_jdgz > 1)
- flag_jdgz = 0;
- if(flag_jdgz == 1) // 全部紅燈亮
- {
- dx_red = 0;
- dx_green = 1;
- dx_yellow = 1;
- nb_red = 0;
- nb_green = 1;
- nb_yellow = 1;
- }
-
- }
- if(key_can == 1) //模式鍵
- {
- menu_1 ++;
- if(menu_1 > 3)
- {
- menu_1 = 0;
- }
- }
- if(menu_1 == 2) //東西時間調整
- {
- if(key_can == 2)
- {
- dx_time ++ ; //+1
- if(dx_time > 99)
- dx_time = 99;
- }
- if(key_can == 3)
- {
- dx_time -- ; //-1
- if(dx_time <= 10)
- dx_time = 10;
- }
- dis_smg[0] = smg_du[dx_time % 10] ; //顯示時間
- dis_smg[1] = smg_du[dx_time / 10] ;
- dis_smg[2] = smg_du[10] ;
- dis_smg[3] = smg_du[10] ;
- }
- if(menu_1 == 3) //南北時間調整
- {
- if(key_can == 2)
- {
- nb_time ++ ; //+1
- if(nb_time > 99)
- nb_time = 99;
- }
- if(key_can == 3)
- {
- nb_time -- ; //-1
- if(nb_time <= 10)
- nb_time = 10;
- }
- dis_smg[0] = smg_du[10] ;
- dis_smg[1] = smg_du[10] ;
- dis_smg[2] = smg_du[nb_time % 10] ; //顯示時間
- dis_smg[3] = smg_du[nb_time / 10] ;
- }
- }
- //主函數
- void main()
- {
- time0_init();
- dx_s = nb_time; //初始時間為南北時間
- nb_s = dx_time;
- while(1)
- {
- key();
- if(key_can < 5)
- key_with();
- if(menu_1 == 1) // 夜間模式
- {
- dx_red = 1;
- dx_green = 1;
- nb_red = 1; //紅綠燈不亮
- nb_green = 1;
-
- if(flag_500ms == 0) //黃燈閃爍
- {
- dx_yellow = 0;
- nb_yellow = 0;
- }
- else
- {
- dx_yellow = 1;
- nb_yellow = 1;
- }
- }
- if((menu_1 == 0) && (flag_jdgz == 0))
- jiaotongdeng_dis();
- display();
- }
- }
- // 定時器中斷服務
- void time0_int() interrupt 1
- {
- static uchar value; //延時10ms
- TH0 = 0x3c;
- TL0 = 0xb0; //50ms
- value ++;
- flag_5m_value++;
- if(flag_5m_value % 10 == 0)
- flag_500ms = ~flag_500ms;
- if(value >= 20)
- {
- value = 0;
- flag_1s = 1;
- }
- }
復制代碼
|