欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2874|回復: 1
打印 上一主題 下一主題
收起左側

基于單片機的交通信號燈設計論文下載(word格式)

[復制鏈接]
跳轉到指定樓層
樓主
ID:354655 發表于 2018-6-19 20:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于51單片機的交通燈設計
指導教師:
                 
               學院:              
            班級:               
            姓名:
學號:
一、設計目的與任務1、熟練的掌握KeilC51集成開發環境調試功能的使用2、將所學的C51單片機的理論知識運用到實驗中3、簡單的掌握仿真軟件的proteus的應用設計一個以單片機為中心控制系統,以LED燈和數碼管顯示為外設,實現十字路口交通燈的狀態顯示。二、設計要求1、以proteus仿真軟件為核心,畫出原理仿真圖。
2、以Keil C51編程軟件為主體,編寫芯片內部執行程序
三、總體設計思路
本設計以單片機為核心,以LED數碼管作為倒計時指示,根據設計的要求我們考慮了各功能模塊的幾種設計方案,以求最佳方案,實現實時顯示系統各種狀態,系統還增設了根據交通擁擠情況可分別設置主干道和次干道的通行時間,以提高效率,緩減交通擁擠。系統總體設計框圖如圖1-1所示。
  *
圖1-1 系統總體設計框圖
1.電源提供方案
為使模塊穩定工作,須有可靠電源。本次設計考慮了兩種電源方案:
方案一:采用獨立的穩壓電源。此方案的優點是穩定可靠,且有各種成熟電路可供選用;缺點是各模塊都采用獨立電源,會使系統復雜,且可能影響電路電平。
方案二:采用單片機控制模塊提供電源。該方案的優點是系統簡明扼要,節約成本;缺點是輸出功率不高。
綜上所述,選擇第二種方案。
2.顯示界面方案
該系統要求完成倒計時功能。基于上述原因,本次設計考慮了兩種方案:
方案一:完全采用點陣式LED顯示。這種方案功能強大,可方便的顯示各種英文字符,漢字,圖形等,但實現復雜,且須完成大量的軟件工作。
方案二:完全采用數碼管顯示。這種方案優點是實現簡單,可以完成倒計時功能。缺點是功能較少,只能顯示有限的符號和數碼字符。根據本設計的要求,方案二已經滿足了要求,所以本次設計采用方案二以實現系統的顯示功能。
3.輸入方案
這里同樣討論了兩種方案:
方案一:采用8155擴展I/O口、鍵盤及顯示等。該方案的優點是使用靈活可編程,并且有RAM及計數器。若用該方案,可提供較多I/O口,但操作起來稍顯復雜。
方案二:直接在I/O口線上接上按鍵開關。因為設計時精簡和優化了電路,所以剩余的端口資源還比較多,我們使用六個按鍵,分別是P16、P17、P27、P30、P32、P33,依次完成倒計時加1、倒計時減1、調完確認、調時方向切換、南北強行和東西強行等功能。
由于該系統是對交通燈及數碼管的控制,只需用單片機本身的I/O口就可實現,且本身的計數器及RAM已經夠用,故選擇方案二。
硬件設計是整個系統的基礎,要考慮的方方面面很多,除了實現交通燈基本功能以外,主要還要考慮如下幾個因素:①系統穩定度;②器件的通用性或易選購性;③軟件編程的易實現性;④系統其它功能及性能指標;因此硬件設計至關重要。現從各功能模塊的實現逐個進行分析探討。
總體設計
本設計以單片機為控制核心,采用模塊化設計,共分以下幾個功能模塊:單片機控制系統、鍵盤及狀態顯示、倒計時模塊等。     交通燈的總體設計原理如3-0圖所示:
單片機作為整個硬件系統的核心,它既是協調整機工作的控制器,又是數據處理器。它由單片機振蕩電路、復位電路等組成。
鍵盤及狀態顯示,開關鍵盤輸入交通燈初始時間,通過單片機P1輸入到系統。
系統采用雙數碼管倒計時計數功能,最大顯示數字99。
友好的人機界面、靈活的控制方式、優化的物理結構是本設計的亮點。
單片機最小系統
1.振蕩電路
AT89C51是內部具有振蕩電路的單片機,只需在18腳和19腳之間接上石英晶體,給單片機加工作所需直流電源,振蕩器就開始振蕩起來。振蕩電路就為單片機工作提供了所需要的時鐘脈沖信號,是單片機的內部電路、單片機的內部程序(若有)開始工作。振蕩電路不工作,整個單片機電路都不能正常工作。AT89C51常外接6MHz、12MHz的石英晶體,18腳和19腳分別對地接了一個20pF的電容,目的是防止單片機自激。若從18腳輸入外部時鐘脈沖,則19腳接地。
2.復位電路
復位電路就是在RST端(9腳)外接的一個電路,目的是使單片機上的電開始工作時,內部電路從初始狀態開始工作,或者在工作中人為讓單片機重新從初始狀態開始工作。在時鐘工作的情況下,只要復位引腳高電平保持在兩個機器周期以上的時間,AT89C51便能完成系統重置的各項工作,使得內部特殊功能寄存器的內容均被設置成已知狀態,并且從地址0000H處讀入程序代碼而執行程序。單片機最小系統電路如圖3-1所示:
圖3-1 單片機最小系統電路原理圖
顯示及其驅動模塊鍵盤與狀態顯示功能
鍵盤在本設計中用于緊急情況的手動控制裝置,以及定時時間的設置等功能,起到了不可缺少的重要作用。當定時器定時為1秒時程序跳轉到時間顯示及信號燈顯示子程序,它將依次顯示信號燈時間,同時一直顯示信號燈的顏色,這時在返回定時子程序定時1秒,在顯示黃燈的下一個時間,這樣依次把所有的時間顯示完后在重新給時間計數器賦初值,重新進入循環。鍵盤電路如圖3-2所示。
圖3-2 鍵盤電路
倒計時計數功能
本系統使用數碼管完成倒計時顯示功能。以南北方向為例,數碼管顯示的數值從綠燈的設置時間最大值往下減,每秒鐘減1,一直減到1。然后又從紅燈的設置時間最大值往下減,一直減到1。接下來又顯示綠燈時間,如此循環。
系統共有4個兩位的LED數碼管,分別放置在模擬交通燈控制板上的四個路口。因為四個方向的數碼管應該顯示同樣的內容,所以我們可以把它們同樣對待。也就是說各個方向的數碼管個位(把數碼管第二位定義為個位,第一位定義為十位)用一根信號線控制,十位用另一根信號線控制。這里采用動態顯示。LED數碼管如圖3-3所示。
圖3-3 LED數碼管
根據該系統設計的功能要求選擇所用元器件

軟件在硬件平臺上構筑,完成各部分硬件的控制和協調。系統功能是由軟硬件共同實現的,由于軟件的可伸縮性,最終實現的系統功能可強可弱,差別可能很大。因此,軟件是本系統的靈魂。軟件采用模塊化設計方法,不僅易于編程和調試,也可減小軟件故障率和提高軟件的可靠性。同時,對軟件進行全面測試也是檢驗錯誤排除故障的重要手段。這里我們選用了移值性好、結構清晰、能進行復雜運算的C語言來實現編程。
3.1 軟件總體設計
軟件總體設計主要完成各部分的軟件控制和協調。本系統主程序模塊主要完成的工作是對系統的初始化,發送顯示數據,同時對鍵盤進行掃描,等待外部中斷,以及根據所需要的功能進行相應的操作。其流程圖如圖4-1所示。
圖4-1 軟件總體流程圖
 軟件主要子程序設計 緊急狀態子程序設計
1.在緊急狀態下,只有緊急狀態手動控制按鍵才可以使所有的LED都被置為紅燈,車輛禁行、行人通行。緊急情況結束后再轉成自動狀態。程序流程如圖4-2所示。
圖4-2 緊急狀態子程序
設置狀態子程序設計
設置狀態子程序如圖4-3所示。
圖4-3 設置狀態子程序
在設置狀態,按下按鍵1(P16)開始設置南北的紅燈時間,按下按鍵2(P17)設置南北的綠燈時間,按下按鍵3(P27)返回正常運行狀態。紅燈和綠燈的時間最大可以設為99,超出99的時候會從50開始重新計數。它包含倒計時調整和緊急狀態兩個狀態。主程序中放了一個按鍵的判斷指令,當有按鍵按下的時候,程序就自動的跳轉到按鍵子程序處理。當檢測到按鍵2(P17)鍵按下的時候就自動返回到主程序。當出現緊急的情況的時候,按下按鍵3(P27)就切換到緊急狀態,當緊急事件處理完畢的時候,按下按鍵2(P17),就可以返回正常狀態。
鍵盤模塊子程序設計
鍵盤是人機進行交互的重要接口之一。用戶通過按鍵對儀器下達命令,儀器對按鍵譯碼獲得相應的鍵值,并執行相應的命令程序。鍵盤部分的軟件實現主要是指對鍵盤管理進行編程,從而成功地讀取鍵盤值,實現相應的功能。鍵盤實現的程序流程圖如圖4-4所示。
圖4-4 鍵盤實現的程序流程圖
根據上述流程圖編寫程序如下:
#include <reg51.h>
#include<intrins.h>
#define ucharunsigned char
#define uint  unsigned int
sbit  k1=P1^6;
sbit  k2=P1^7;
sbit  k3=P2^7;
sbit  k4=P3^0;
sbityellowled_nb=P1^4;    //南北黃燈
sbityellowled_dx=P1^1;    //東西黃燈
uchar codetable[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar data dig;      //位選
uchar data led;      //偏移量
uchar data buf[4];
uchar datasec_dx=20;//東西數碼指示值
uchar datasec_nb=20;//南北數碼指示值
uchar dataset_timedx=20;
uchar dataset_timenb=20;//倒計時設置的鍵值保存
uchar data b;//定時器中斷次數
bit time;//燈狀態循環標志
bit int0_time;//中斷強行標志
bit   set;//調時方向切換鍵標志
void delay(int ms);//延時子程序
void key();//按鍵掃描子程序
void key_to1();//鍵處理子程序
void key_to2();
void display();//顯示子程序
void main()
{
     TMOD=0X01;   
     TH0=0X3C;
     TL0=0XB0;
     EA=1;
     ET0=1;
     TR0=1;
     EX0=1;
     EX1=1;
     P1=0Xf3;// 東西通行
     while(1)
     {
            key(); //調用按鍵掃描程序
            display(); //調用顯示程序
     }      
}
void key()  //按鍵掃描子程序
{
     if(k1!=1)
     {
            delay(10);
            if(k1!=1)
            {
                   while(k1!=1);
                   key_to1();
            }
     }
     if(k2!=1)
     {
            delay(10);
            if(k2!=1)
            {
                   while(k2!=1);
                   key_to2();
            }
     }
      
      if(k4!=1)
      {
             delay(10);
             if(k4!=1)
             {
                  while(k4!=1);
                    set=!set;
             }
      }
     if(k3!=1&&int0_time==1)
     {      
            TR0=1;   //啟動定時器
            sec_nb=20;
            sec_dx=20;
            int0_time=0;//清標志
            
      }   else if(k3!=1&&int0_time==0)
               {
                   char set_timenb,set_timedx;
                   TR0=1;
                   set_timenb=sec_nb;
                   set_timedx=sec_dx; //設置的鍵值返回保存
                   }
      
}
void display()
{
            
            buf[1]=sec_dx/10; //第1位 東西秒十位
            buf[2]=sec_dx%10; //第2位 東西秒個位
            buf[3]=sec_nb/10; //第3位 南北秒十位
            buf[0]=sec_nb%10; //第4位 南北秒個位
            
            P0=table[buf[led]];
            delay(2);      //先延時,提前顯示一位了
            P2=dig;
            dig=_crol_(dig,1);
            led++;
            if (led==4)
            {led=0;
            dig=0xfe;
            }
}
void time0(void)interrupt 1 using 1  //定時中斷子程序
{
     b++;
     if(b==10)       // 定時器中斷次數。
     {
            b=0;
            sec_dx--;
            sec_nb--;
/******************南北黃燈閃爍判斷*************************/            
            if(sec_nb==3&&time==0)
            
                   {
                    yellowled_nb=1;//南北黃燈亮
                    delay(300);
                    yellowled_nb=0;
                    }
                  
                   if(sec_nb==2&&time==0)
                   {
                   yellowled_nb=1;//南北黃燈亮
                    delay(300);
                    yellowled_nb=0;
                   }
                  
                   if(sec_nb==1&&time==0)
                   {
                   yellowled_nb=1;
                    delay(300);
                    yellowled_nb=0;
               }
            
/*******************東西黃燈閃判斷************************/            
            if(sec_dx==3&&time==1)
            {
                    yellowled_dx=1;//南北黃燈亮
                    delay(300);
                    yellowled_dx=0;
            }
                  
                   if(sec_dx==2&&time==1)
                   {
                   yellowled_dx=1;//南北黃燈亮
                    delay(300);
                    yellowled_dx=0;
                   }
                  
                   if(sec_dx==1&&time==1)
                   {
                   yellowled_dx=1;
                    delay(300);
                    yellowled_dx=0;
               }      
                  
            
/*******************************************/
                   if(sec_dx==0||sec_nb==0) //東西或南北先到達1S時即開始重新計時
                   {
                          sec_dx=set_timedx;
                          sec_nb=set_timenb; //第一次循環結束重置
                         if(time==1)
                          {
                                 P1=0XF3;  //東西通行
                          }
                          else
                          {
                                 P1=0xde; //南北通行
                          }
                          time=!time;   //取反
                          
                   }
            
     }
}
void key_to1()
{
     TR0=0; //關定時器
     
     if(set==0)
     sec_nb++; //南北加1S
     else
     sec_dx++;//東西加1S
     
     if(sec_nb==100)
            sec_nb=1;
     if(    sec_dx==100)
            sec_dx=1;//加到100置1
     
}
void key_to2()
{
     TR0=0;//關定時器
     
     if(set==0)
     sec_nb--; //南北減1S
     else
     sec_dx--; //東西減1S
     if(sec_nb==0)
            sec_nb=99;      
     if(    sec_dx==0)
            sec_dx=99;//減到1重置99
     
}
void int0(void)interrupt 0 using 1   //東西強行
{
     TR0=0;
     P1=0XF3;
     sec_dx=88;
     sec_nb=88;
     int0_time=1;
     
}
void int1(void)interrupt 2 using 1    //南北強行
{
     TR0=0;
     P1=0XDE;
     sec_nb=88;
     sec_dx=88;
     int0_time=1;
}
void delay(int ms)
{
     uint j,k;
     for(j=0;j<ms;j++)
     for(k=0;k<124;k++);
}
系統調試與測試系統操作說明
本設計采用的是開關鍵盤,共6個鍵。鍵盤用來輸入倒計時時間數字信息;功能菜單選擇鍵則用于主次干道通行時間分別設置、確定、取消(即調時方向的切換、倒計時的加減、東西強行、南北強行,調完確認)等功能。
系統分為兩個狀態:設置狀態和顯示狀態。利用鍵盤可以進行兩個狀態間的切換;開機時,系統為顯示狀態,此時顯示四個路口數碼管從默認的倒計時時間開始倒計時;顯示狀態時,交通燈模組的四個LED數碼管進行倒計時;顯示過程中按鍵可以重新進入設置狀態。
調試
根據電路功能逐級進行:
1.通行方式功能調試:對行人和行車方向指示燈亮度和驅動電路調試;
2.倒計時功能調試:數碼管亮度調試;
3.緊急情況手動控制功能調試:包括按鍵功能的調試。
調試結果如下圖所示:
設計總結
通過本次課程設計,我深深的體會到了作為一個硬件工程師的艱辛。即使做一個小小的項目,都需要做這么多細致入微的工作,必須考慮到問題的任何一個細節,否則最后也將是功敗垂成。
    原理圖設計: 當我們選取了這樣一個題目,我們就開始收集相關的各種資料,對題目有個大致的了解,規劃一下設計的任務將要完成哪些功能。然后就具體的每一項功能應該怎樣具體的設計,例如用什么方法完成這一功能,這種想法是否合理,比較使用哪個芯片來完成這項功能。經過長時間的查閱資料、思索、推敲,最后定出了這次設計的原理圖。

    硬件焊接:開始制作實物之前,按照老師的要求先進行整板的規劃,這是一個非常關鍵的步驟,因為當你焊接上器件之后將會很難修改。結果發現了真的還有一些不足,比如在畫板的過程中我們居然忘記留出電源接口,還有一些兩根電源線沒有和其他線接到一塊,另外我給按鍵留的引腳的孔太小了,數碼管的引腳情況也給弄錯了,這些都是因為經驗不夠和粗心造成的。這也都給以后的學習留下了經驗和教訓,必須先拿到或熟悉芯片才能確定引腳的間距以及大小,制板過程必須要細心。發現這些錯誤,在焊接過程中我們采取了一系列的措施來補救這些錯誤。關于焊接,因為自己的水平確實不怎么樣,這需要一定的經驗和技巧,但是我卻是遲遲把握不到這種技巧。剛開始烙鐵和焊錫配合不到一塊,然后就是焊錫的量的控制問題,始終達不到老師說明的那種效果,這些都說明了我在實際動手能力方面還有待加強
     編程調試:在整個程序的編寫過程中,研究每個子程序是否可行,我是通過Keil C和Proteus兩個軟件來實現的。Proteus是一個單片機的仿真軟件,發現它之后真的很受用,通過它可以不用連接硬件就能檢查程序是否可行。Keil C則幫助我檢查程序是否存在語法錯誤之類的問題,還可以生成hex文件,供proteus軟件仿真使用。通過這兩個軟件,我完成了整個設計程序的編寫與調試工作。
    通過上面的這個步驟,把程序調試好,接下來就是真正的硬件連接調試了。程序既然已經在仿真的軟件上通過認證,如果連接上硬件不可行的話,說明在硬件上某個部分存在一定的問題。這點得到了驗證:硬件模擬的時候,緊急情況用的開關有一個有問題,按下的時候沒有反應。用萬用表檢測發現,開關內部的連接沒有錯誤,但是當開關按下的時候,不是接通的,說明此開關有問題。于是我又將有問題的開關進行了更換,結果硬件連接調試很順利。
    通過這次畢業設計,使我得到了一次用專業知識、專業技能分析和解決問題全面系統的鍛煉。使我在單片機的基本原理、單片機應用系統開發過程,以及在常用編程設計思路技巧的掌握方面都能向前邁了一大步,為日后成為合格的應用型人才打下良好的基礎。

完整的Word格式文檔51黑下載地址:
基于單片機的交通信號燈模擬控制系統.doc (147 KB, 下載次數: 50)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:665208 發表于 2019-12-16 15:40 | 只看該作者
在?有仿真圖嗎?附件里有嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表