單片機交通燈控制課程設計--電子元器件調研與系統設計報告_第1頁
已閱讀1頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  新能源與動力工程學院</p><p>  電子元器件調研與系統設計報告</p><p><b>  交通信號燈的制作</b></p><p>  2015年 12 月 課程設計任務書</p><p>  課程名稱: 電子元器件調研與系統設計報告 指導教師(簽名):

2、 </p><p>  班級: 姓名: 學號: </p><p><b>  目錄</b></p><p>  一、系統方案設計與要求1</p><p>  1.1單片機交通燈控制系統通行方案設計1</p&g

3、t;<p>  1.2單片機交通控制系統的功能要求2</p><p>  1.2.1顯示模塊功能2</p><p>  1.2.2 按鍵模塊功能2</p><p>  1.3單片機交通控制系統的基本構成及原理2</p><p>  二、系統硬件電路的設計3</p><p>  2.1系統硬件總電

4、路構成3</p><p>  2.2單片機最小系統3</p><p><b>  2.3顯示系統4</b></p><p>  2.3.1 LED顯示4</p><p>  2.3.2數碼管顯示4</p><p>  2.4鍵盤輸入電路5</p><p>  三

5、、系統軟件程序的設計5</p><p>  3.1程序主體設計流程5</p><p>  3.2子程序模塊設計6</p><p><b>  四、小結8</b></p><p><b>  五、參考文獻9</b></p><p><b>  附錄A10&

6、lt;/b></p><p><b>  附錄B11</b></p><p><b>  附錄C12</b></p><p>  一、系統方案設計與要求</p><p>  1.1單片機交通燈控制系統通行方案設計</p><p>  設在十字路口,分為東西向和南北向

7、,在任一時刻只有一個方向通行,另一方向禁行,持續(xù)一定時間,經過短暫的過渡時間,將通行禁行方向對換。其具體狀態(tài)如下圖1-1所示。說明:黑色表示亮,白色表示滅。交通狀態(tài)從狀態(tài)1開始變換,直至狀態(tài)6然后循環(huán)至狀1,周而復始,即如圖(圖2-1)所示:直至狀態(tài)6然后循環(huán)至狀態(tài)1,通過具體的路口交通燈狀態(tài)的演示分析我們可以把這四個狀態(tài)歸納如下:</p><p><b>  圖1-1交通狀態(tài)</b><

8、;/p><p>  東西方向紅燈滅,同時綠燈亮,南北方向黃燈滅,同時紅燈亮,倒計時20秒。此狀態(tài)下,東西向禁止通行,南北向允許通行;東西方向綠燈滅,同時黃燈亮,南北方向紅燈亮,倒計時2秒。此狀態(tài)下,除了已經正在通行中的其他所以車輛都需等待狀態(tài)轉換;南北方向紅燈滅,同時綠燈亮,東西方向黃燈滅,同時紅燈亮,倒計時20秒。此狀態(tài)下,東西向允許通行,南北向禁止通行;南北方向綠燈滅,同時黃燈亮,東西方向紅燈亮,倒計時2秒。此狀

9、態(tài)下,除了已經正在通行中的其他所以車輛都需等待狀態(tài)轉換。</p><p>  下面我們可以用圖表表示燈狀態(tài)和行止狀態(tài)的關系如下:</p><p>  表1-1交通狀態(tài)及紅綠燈狀態(tài)</p><p>  東西南北四個路口均有紅綠黃3燈和數碼顯示管4個,在任一個路口,遇紅燈禁止通行,轉綠燈允許通行,之后黃燈亮警告行止狀態(tài)將變換。狀態(tài)及紅綠燈狀態(tài)如表2-1所示。說明:0表示

10、滅,1表示亮。</p><p>  1.2單片機交通控制系統的功能要求</p><p>  本設計能模擬基本的交通控制系統,用紅綠黃燈表示禁行,通行和等待的信號發(fā)生,還能進行倒計時顯示。按鍵可以控制禁行、復位、東西通行、南北通行、時間加、時間減、切換等功能。</p><p>  1.2.1顯示模塊功能</p><p>  顯示模塊分數碼管顯示

11、和LED顯示,數碼管倒計時顯示可以提醒駕駛員在信號燈顏色發(fā)生改變的時間、在“停止”和“通過”兩者間作出合適的選擇。駕駛員和行人普遍都愿意選擇有倒計時顯示的信號控制方式,并且認為有倒計時顯示的路口更安全。倒計時顯示是用來減少駕駛員在信號燈色改變的關鍵時刻做出復雜判斷的一種方法,它可以提醒駕駛員燈色發(fā)生改變的時間,幫助駕駛員在“停止”和“通過”兩者間作出合適的選擇 。通過兩種顯示結合,是本設計更合理可靠。</p><p&

12、gt;  1.2.2 按鍵模塊功能</p><p>  本系統要求的按鍵控制不多,且I/0口足夠,可直接采用獨立式。按鍵可以設置系統的運行狀態(tài),禁行狀態(tài)為數碼管均顯示“00”,紅燈全亮;復位按鍵可以將整個系統復位;東西通行是東西方向的綠燈亮,南北方向上的紅燈亮;南北通行為南北方向上的綠燈亮,東西方向上的紅燈亮;時間加減可以設置通行和等待通行的時間;切換按鍵可以切換加減的方向時間。通過安檢模塊的控制,使得整個系統具

13、有靈活性,實用性。</p><p>  1.3單片機交通控制系統的基本構成及原理</p><p>  十字路口車輛穿梭,行人熙攘,車行車道,人行人道,有條不紊。那么靠什么來實現這井然秩序呢?靠的就是交通信號燈的自動指揮系統。交通信號燈控制方式很多。本系統采用STC89C52單片機以及單片機最小系統和三極管驅動電路以及外圍的按鍵和數碼管顯示等部件,設計一個基于單片機的交通燈設計。設計通過兩位

14、一體共陰極數碼管顯示,并能通過按鍵對定時進行設置。本系統實用性強、操作簡單、擴展功能強。</p><p>  在相同的時間里提高通車的質量、效率。并能在高峰期根據實際狀況結合方程式控制按鈕來調整主次干道的通車時間,降低交通擁擠堵塞現象。并使交通控制系統具有緊急控制,使救護車、救護車通過時, 使兩個方向均亮紅燈,救護車和消防車通過后,恢復原來狀態(tài),增加對出現特殊情況的處理能力。</p><p&g

15、t;  本單片機控制交通燈系統,可用單片機直接控制信號燈的狀態(tài)變化,基本上可以指揮交通的具體通行,當然,接入LED數碼管就可以顯示倒計時以提醒行使者,更具人性化。本系統在此基礎上,單片機對此進行具體處理,及時調整控制指揮。如圖(圖2-2)所示:</p><p>  鍵盤設置模塊對系統輸入模式選擇及具體通行時間設置的信號,系統進入正常工作狀態(tài),執(zhí)行交通燈狀態(tài)顯示控制,同時將時間數據倒計時輸入到LED數碼管上實時顯示

16、。在此過程中還要實時捕捉違規(guī)檢測和緊急按鍵信號,以達到對異常狀態(tài)進行實時控制的目的。急停按鍵和違規(guī)檢測隨時調用中斷。</p><p>  圖1-2 系統的總體框圖</p><p>  據此,本設計系統以單片機為控制核心,連接成最小系統,和按鍵設置模塊等產生輸入,信號燈狀態(tài)模塊,LED倒計時模塊和接受輸出。系統的總體框圖如上所示。</p><p>  二、系統硬件電路

17、的設計</p><p>  2.1系統硬件總電路構成</p><p>  實現本設計要求的具體功能,可以選用stc89C51單片機及外圍器件構成最小控制系統,12個發(fā)光二極管分成4組紅綠黃三色燈構成信號燈指示模塊,8個LED東西南北各兩個構成倒計時顯示模塊,若干按鍵組成時間設置和模式選擇按鈕和緊急按鈕等。</p><p>  本系統以單片機為核心,組成一個處理、自動

18、控制為一身的閉環(huán)控制系統。系統硬件電路由單片機、狀態(tài)燈、LED顯示、按鍵等組成。其具體的硬件電路總圖如圖3-1所示。</p><p>  其中P0,P1,用于送顯LED數碼管的型和位,P2用于控制紅綠黃發(fā)光二極管,XTAL1和XTAL2接入晶振時鐘電路,REST引腳接上復位電路,P3用于口按鍵控制。</p><p>  2.2單片機最小系統</p><p>  ST

19、C89C51單片機的時鐘信號通常有兩種方式產生:一是內部時鐘方式,二是外部時鐘方式。在單片機內部有一振蕩電路,只要在單片機的XTAL1和XTAL2引腳外接石英晶體(簡稱晶振),就構成了自激振蕩器并在單片機內部產生時鐘脈沖信號。圖中電容C1和C2的作用是穩(wěn)定頻率和快速起振,電容值在5-30pF,典型值為30pF。晶振CYS的振蕩頻率范圍在1.2-12MHz間選擇,典型值為12MHz和11.0592MHz。</p><p

20、>  當在STC89C51單片機的RST引腳引入高電平并保持2個機器周期時,單片機內部就執(zhí)行復位操作(若該引腳持續(xù)保持高電平,單片機就處于循環(huán)復位狀態(tài))。</p><p>  最小系統圖如圖2-1所示 </p><p>  圖2-1 單片機最小系統原理圖</p><p><b>  2.3顯示系統</b></p><

21、p>  2.3.1 LED顯示</p><p>  LED交通燈利用發(fā)光二極管來顯示不同顏色的信號指示燈。</p><p><b>  圖2-2 LED燈</b></p><p>  2.3.2數碼管顯示</p><p>  數碼管是一種半導體發(fā)光器件,其基本單元是發(fā)光二極管。數碼管按段數分為七段數碼管和八段數碼管

22、,八段數碼管比七段數碼管多一個發(fā)光二極管單元(多一個小數點顯示);按能顯示多少個“8”可分為1位、2位、4位等等數碼管:按發(fā)光二極管單元連接方式分為共陽極數碼管和共陰極數碼管。共陽數碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數碼管,共陽數碼管在應用時應將公共極COM接到+5V,當某一字段發(fā)光二極管的陰極為低電平時,相應字段就點亮,當某一字段的陰極為高電平時,相應字段就不亮。共陰數碼管是指將所有發(fā)光二極管的陰極接到一起

23、形成公共陰極(COM)的數碼管,共陰數碼管在應用時應將公共極COM接到地線GND上,當某一字段發(fā)光二極管的陽極為高電平時,相應字段就點亮,當某一字段的陽極為低電平時,相應字段就不亮。由于它的價格便宜使用簡單在電器特別是家電領域應用極為廣泛。</p><p>  圖2-3 數碼管顯示</p><p><b>  2.4鍵盤輸入電路</b></p><

24、p>  單片機鍵盤有獨立鍵盤和矩陣式鍵盤兩種:獨立鍵盤每一個I/O 口上只接一個按鍵,按鍵的另一端接電源或接地(一般接地),這種接法程序比較簡單且系統更加穩(wěn)定;而矩陣式鍵盤式接法程序比較復雜,但是占用的I/O少。根據本設計的需要這里選用了獨立式鍵盤接法。</p><p>  在用單片機對鍵盤處理的時候涉及到了一個重要的過程,那就是鍵盤的去抖動。這里說的抖動是機械的抖動,是當鍵盤在未按到按下的臨界區(qū)產生的電平

25、不穩(wěn)定正?,F象,并不是我們在按鍵時通過注意可以避免的。這種抖動一般10~200毫秒之間,這種不穩(wěn)定電平的抖動時間對于人來說太快了,而對于時鐘是微秒的單片機而言則是慢長的。硬件去抖動就是用部分電路對抖動部分加之處理,軟件去抖動不是去掉抖動,而是避抖動部分的時間,等鍵盤穩(wěn)定了再對其處理。所以這里選擇了軟件去抖動,實現法是先查尋按鍵當有低電平出現時立即延時10~200毫秒以避開抖動(經典值為20毫秒),延時結束后再讀一次I/O 口的值,這一次

26、的值如果為1 表示低電平的時間不到10~200 毫秒,視為干擾信號。當讀出的值是0時則表示有按鍵按下,調用相應的處理程序。硬件電路如圖2-4所示:</p><p>  圖2-4 鍵盤控制電路圖</p><p>  三、系統軟件程序的設計</p><p>  3.1程序主體設計流程</p><p>  全部控制程序實際上分為若干模塊:鍵盤設置處

27、理程序,狀態(tài)燈控制程序,LED顯示程序,消抖動延時程序,次狀態(tài)判斷及處理程序,緊?;蜻`規(guī)判斷程序,中斷服務子程序,車流量計數程序,紅綠燈時間調整程序等。</p><p>  整個軟件程序方面主要分兩大部分:按鍵處理程序和50ms掃描程序。流程圖如圖(圖3-1)所示。 </p><p>  圖3-1系統總的流程圖</p><

28、p>  3.2子程序模塊設計</p><p>  按鍵模塊的控制是調用中斷來實現控制的,獨立式鍵盤的實現方法是利用單片機I/O口讀取口的電平高低來判斷是否有鍵按下。將常開按鍵的一端接地,另一端接一個I/O 口,程序開始時將此I/O口置于高電平,平時無鍵按下時I/O口保護高電平。當有鍵按下時,此I/O 口與地短路迫使I/O 口為低電平。按鍵釋放后,單片機內部的上拉電阻使I/O口仍然保持高電平。我們所要做的就是

29、在程序中查尋此I/O口的電平狀態(tài)就可以了解我們是否有按鍵動作了。</p><p><b>  圖3-2中斷子程序</b></p><p>  定時中斷子程序是本設計的重點,負責完成數碼管輸出數據刷新和各個狀態(tài)的處理切換。中斷子程序包括數碼管輸出數據刷新程序和各狀態(tài)處理程序。中斷程序的流程圖如圖3-2所示。</p><p>  圖3-3 定時中

30、斷流程圖</p><p>  定時中斷服務程序在系統中的函數如下:</p><p>  void int_t0( ) interrupt 1 using 1</p><p><b>  {</b></p><p>  TR0 = 0; </p><p>  time++; tc++;

31、 </p><p>  if(tc>=3) {tc=0;} </p><p>  if(time==100) </p><p><b>  {</b></p><p>  waittime--;</p><p><b>  }</b></p><

32、p>  else if(time==200) </p><p><b>  {</b></p><p>  waittime--;</p><p><b>  sec--;</b></p><p><b>  time=0;</b></p><p>

33、;  shu0=sec%10; </p><p>  shu1 =sec/10; </p><p><b>  }</b></p><p>  TH0 = 0xee; </p><p>  TL0 = 0x00; </p><p>  if(tc==0) { smdis=md[sh

34、u0]; weishuang0 = 0; weishuang1 = 1; weishuang2 = 1; } </p><p>  else if(tc==1) { smdis=md[shu1]; weishuang0 = 1; weishuang1 = 0; weishuang2 = 1; } </p><p>  else

35、 if(tc==2) { smdis=md[shu2]; weishuang0 = 1; weishuang1 = 1; weishuang2 = 0; } </p><p>  //if(tc>=3) {tc=0;} </p><p>  TR0 = 1; </p><p><b>  }</b&

36、gt;</p><p>  我們由在主程序中設定的初值可知T0定時5毫秒.這樣每當T0到5毫秒時CPU就響應它的溢出中斷請求,進入他的中斷服務子程序。在中斷服務子程序中,CPU先使軟件計數器加1,然后判斷它是否為200。為零表示1秒已到可以返回到輸出時間顯示程序。并使計數器變量清0.</p><p><b>  四、小結</b></p><p>

37、;  經過這次課程設計,我覺得自己學到了不少東西。歸納起來,主要有以下幾點:</p><p> ?。?)通過這次課程業(yè)設計,我能將以前所學到的專業(yè)知識與實踐相聯系,將所學到的知識充分運用到本次設計中。同時,我也認識到自己知識上不足的地方,體會到了所學理論知識的重要性,知識掌握得越多,設計得就更全面、更順利、更好。</p><p> ?。?)進一步熟悉了單片機的知識。通過本次設計,我對單片機

38、的基本原理、內部結構、各引腳功能、定時器和中斷的應用都有了更深刻的理解。并且,能夠以單片機為基礎元件設計一個簡單的系統。</p><p> ?。?)通過本次設計,熟悉了設計一個項目所必經的幾個階段。本次設計從理論研究到硬件原理圖設計,從元器件的選擇到板的制作,從軟件編程到最后的調試過程都由小組獨立完成。這不僅鍛煉了我們獨立完成設計工作的能力,更重要的是了解了一個電子產品的設計流程,為將來投入工作增加了寶貴的經驗,

39、奠定了堅實的基礎。</p><p> ?。?)提高了自己查找資料的能力。在設計過程中,我碰到了一些暫時無法解決的問題,于是我通過上網查閱和圖書館借閱資料,或是通過與老師同學交流一步步地解決了。從中我懂得了我們這個專業(yè)的知識面相當廣泛,我們需要不斷通過各種途徑更新自己的知識,不斷充實自己,同時要懂得與他人交流意見,積極聽取別人的建議,懂得不斷學習的重要性。</p><p><b>

40、  五、參考文獻</b></p><p>  [l]邊海龍, 孫永奎. 單片機開發(fā)與典型工程項目實例詳解[J]. 電子工業(yè)出版社,2008. </p><p>  [2]王為青,邱文勛. 51單片機開發(fā)案例精選[J].人民郵電出版社,2001..</p><p>  [3]張鑫,華臻,陳書謙. 單片機原理及應用[J].電子工業(yè)出版社,2008.</

41、p><p>  [4]張洪潤,張亞凡. 單片機原理及應用[J]. 清華大學出版社,2005,(4).</p><p>  [5]黃智偉 .凌陽單片機課程設計指導[J]. 北京航空航天大學出版社,2007.</p><p>  [6]蔣輝平,周國雄. 基于Proteus的單片機系統設計與仿真實例[M].機械工業(yè)出版社.2009.</p><p>&

42、lt;b>  附錄A</b></p><p><b>  附錄B</b></p><p><b>  實物顯示圖</b></p><p><b>  附錄C</b></p><p>  #include <reg51.h>//頭文件<

43、/p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int//宏定義</p><p>  uchar data buf[4];//秒顯示的變量</p><p>  uchar data sec_dx=20; //東西數默認</p&g

44、t;<p>  uchar data sec_nb=30;//南北默認值</p><p>  uchar data set_timedx=20;//設置東西方向的時間</p><p>  uchar data set_timenb=30;//設置南北方向的時間</p><p><b>  int n;</b><

45、/p><p>  uchar data countt0,countt1;//定時器0中斷次數</p><p><b>  //定義6組開關</b></p><p>  sbit k4=P3^7; //設置時間</p><p>  sbit k3=P3^6;//時間減</p><p>

46、  sbit k2=P3^5;//時間加</p><p>  sbit k1=P3^4;//切換緊急和夜間</p><p>  sbit Red_nb=P2^6;//南北紅燈標志</p><p>  sbit Yellow_nb=P2^5;//南北黃燈標志</p><p>  sbit Green_nb=P2^4;

47、//南北綠燈標志</p><p>  sbit Red_dx=P2^3;//東西紅燈標志</p><p>  sbit Yellow_dx=P2^2;//東西黃燈標志</p><p>  sbit Green_dx=P2^1;//東西綠燈標志</p><p>  uchar set=0;//調時方向切換鍵標志 =1時,南北,

48、=0時,東西</p><p>  uchar mode=0;</p><p>  bit dx_nb=0;//東西南北控制位</p><p>  bit shanruo=0;//閃爍標志位</p><p>  bit yejian=0;//夜間黃燈閃爍標志位</p><p>  uchar code

49、table[11]={//共陰極字型碼</p><p>  0x3f, //--0</p><p>  0x06, //--1</p><p>  0x5b, //--2</p><p>  0x4f, //--3</p><p>  0x66, //--4</p><p>  0x

50、6d, //--5</p><p>  0x7d, //--6</p><p>  0x07, //--7</p><p>  0x7f, //--8</p><p>  0x6f, //--9</p><p>  0x00 //--NULL</p><p><b>  

51、};</b></p><p><b>  //函數的聲明部分</b></p><p>  void delay(int ms);//延時子程序</p><p>  void key();//按鍵掃描子程序</p><p>  void key_to1();//鍵處理子程序</p&

52、gt;<p>  void key_to2();</p><p>  void key_to3();</p><p>  void display();//顯示子程序</p><p>  void logo(); //開機LOGO</p><p>  void Buzzer();</p><

53、;p><b>  //主程序</b></p><p>  void main()</p><p><b>  {</b></p><p>  TMOD=0X11; //定時器設置</p><p>  TH1=0X3C;</p><p><b>

54、;  TL1=0XB0;</b></p><p>  TH0=0X3C;//定時器0置初值 0.05S</p><p><b>  TL0=0XB0;</b></p><p>  EA=1;//開總中斷</p><p>  ET0=1;//定時器0中斷開啟</p>

55、<p>  ET1=1; //定時器1中斷開啟</p><p>  TR0=1;//啟動定時0</p><p>  TR1=0; //關閉定時1</p><p>  EX0=1;//開外部中斷0</p><p>  EX1=1;//開外部中斷1</p>

56、<p>  logo();//開機初始化</p><p>  P2=0Xc3;// 開始默認狀態(tài),東西綠燈,南北黃燈 </p><p>  sec_nb=sec_dx+5; //默認南北通行時間比東西多5秒</p><p>  while(1) //主循環(huán)</p><p><b&g

57、t;  { </b></p><p>  key(); //調用按鍵掃描程序</p><p>  display(); //調用顯示程序</p><p><b>  }</b></p><p><b>  }</b></p><p><

58、b>  //函數的定義部分</b></p><p>  void key(void)//按鍵掃描子程序</p><p><b>  { </b></p><p>  /*if(k1!=1)//當K1(時間加)按下時</p><p><b>  {</b><

59、/p><p>  display(); //調用顯示,用于延時消抖</p><p>  if(k1!=1)//如果確定按下</p><p><b>  {</b></p><p>  TR0=0; //關定時器</p><p>  shanru

60、o=0;//閃爍標志位關</p><p>  P2=0x00;//滅顯示</p><p>  TR1=0;//啟動定時1</p><p>  if(set==0)//設置鍵按下</p><p>  set_timedx++; //南北加1S</p><p><b

61、>  else</b></p><p>  set_timenb++; //東西加1S</p><p>  if(set_timenb==100)</p><p>  set_timenb=1;</p><p>  if(set_timedx==100)</p><p>  set_tim

62、edx=1; //加到100置1</p><p>  sec_nb=set_timenb ; //設置的數值賦給東西南北</p><p>  sec_dx=set_timedx;</p><p><b>  do</b></p><p><b>  { </b></p>

63、<p>  display(); //調用顯示,用于延時</p><p><b>  }</b></p><p>  while(k1!=1); //等待按鍵釋放</p><p><b>  }</b></p><p><b>  }</b><

64、/p><p>  if(k2!=1)//當K2(時間減)按鍵按下時</p><p><b>  {</b></p><p>  display(); //調用顯示,用于延時消抖 </p><p>  if(k2!=1)//如果確定按下</p><p>

65、;<b>  {</b></p><p>  TR0=0; //關定時器0</p><p>  shanruo=0;//閃爍標志位關</p><p>  P2=0x00;//滅顯示</p><p>  TR1=0;//關定時器1</p><

66、p>  if(set==0)</p><p>  set_timedx--; //南北減1S</p><p><b>  else</b></p><p>  set_timenb--; //東西減1S</p><p>  if(set_timenb==0)</p><p>

67、  set_timenb=99;</p><p>  if(set_timedx==0 )</p><p>  set_timedx=99; //減到1重置99</p><p>  sec_nb=set_timenb ; //設置的數值賦給東西南北</p><p>  sec_dx=set_timedx;</p>

68、<p><b>  do</b></p><p><b>  { </b></p><p>  display(); //調用顯示,用于延時</p><p><b>  }</b></p><p>  while(k2!=1); //等

69、待按鍵釋放</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(k3!=1)//當K3(確認)鍵按下時</p><p><b>  {</b></p><p>  display();

70、 //調用顯示,用于延時消抖</p><p>  if(k3!=1)//如果確定按下</p><p><b>  {</b></p><p>  TR0=1; //啟動定時器0</p><p>  sec_nb=set_timenb;//從中斷回復,仍顯示設置過的數值

71、</p><p>  sec_dx=set_timedx;//顯示設置過的時間</p><p>  TR1=0;//關定時器1</p><p>  if(set==0)//時間倒時到0時</p><p><b>  { </b></p><p>  P2=0X0

72、0; //滅顯示</p><p>  Green_dx=1;//東西綠燈亮</p><p>  Red_nb=1;//南北紅燈亮</p><p>  sec_nb=sec_dx+5; //回到初值</p><p><b>  }</b></p><p><

73、;b>  else </b></p><p><b>  { </b></p><p>  P2=0x00;//南北綠燈,東西紅燈</p><p>  Green_nb=1;</p><p><b>  Red_dx=1;</b></p><p>

74、  sec_dx=sec_nb+5; </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(k4!=1)//當K4(切換)鍵按下</p><p>

75、<b>  {</b></p><p>  display(); //調用顯示,用于延時消抖</p><p>  if(k4!=1)//如果確定按下</p><p><b>  { </b></p><p>  TR0=0;//關定時器0</p&

76、gt;<p>  set=!set;//取反set標志位,以切換調節(jié)方向</p><p>  TR1=0;//關定時器1</p><p>  dx_nb=set;</p><p><b>  do</b></p><p><b>  {</b></p>

77、<p>  display(); //調用顯示,用于延時</p><p><b>  }</b></p><p>  while(k4!=1); //等待按鍵釋放</p><p><b>  }</b></p><p><b>  }</b

78、></p><p>  if(k5!=1)//當K5(禁止)鍵按下時</p><p><b>  {</b></p><p>  display(); //調用顯示,用于延時消抖</p><p>  if(k5!=1)//如果確定按下</p><p&

79、gt;<b>  { </b></p><p>  TR0=0;//關定時器</p><p>  P2=0x00;//滅顯示</p><p><b>  Red_dx=1;</b></p><p>  Red_nb=1;//全部置紅燈</p><

80、p><b>  TR1=0;</b></p><p>  sec_dx=00;//四個方向的時間都為00</p><p>  sec_nb=00;</p><p><b>  do</b></p><p><b>  {</b></p><p

81、>  display(); //調用顯示,用于延時</p><p><b>  }</b></p><p>  while(k5!=1);//等待按鍵釋放</p><p><b>  }</b></p><p><b>  }</b></p>

82、<p>  if(k6!=1)//當K6(夜間模式)按下 </p><p><b>  {</b></p><p>  display(); //調用顯示,用于延時消抖 </p><p>  if(k6!=1)//如果確定按下</p><p><b>

83、  { </b></p><p>  TR0=0;//關定時器</p><p><b>  P2=0x00;</b></p><p><b>  TR1=1;</b></p><p>  sec_dx=00;//四個方向的時間都為00</p><

84、;p>  sec_nb=00;</p><p><b>  do</b></p><p><b>  {</b></p><p>  display(); //調用顯示,用于延時</p><p><b>  }</b></p><p>

85、  while(k6!=1);//等待按鍵釋放</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  */</b></p><p>  if(k2!=1&&set!=0)//當K1(時間

86、加)按下時</p><p><b>  {</b></p><p>  display(); //調用顯示,用于延時消抖</p><p>  if(k2!=1&&set!=0)//如果確定按下</p><p><b>  {</b></p>

87、;<p>  TR0=0; //關定時器</p><p>  shanruo=0;//閃爍標志位關</p><p>  P2=0x00;//滅顯示</p><p>  TR1=0;//啟動定時1</p><p>  if(set==1)//設置鍵按下</p

88、><p>  set_timedx++; //南北加1S</p><p>  else if(set==2)</p><p>  set_timenb++; //東西加1S</p><p>  if(set_timenb==100)</p><p>  set_timenb=1;</p>&

89、lt;p>  if(set_timedx==100)</p><p>  set_timedx=1; //加到100置1</p><p>  sec_nb=set_timenb ; //設置的數值賦給東西南北</p><p>  sec_dx=set_timedx;</p><p><b>  do<

90、/b></p><p><b>  { </b></p><p>  display(); //調用顯示,用于延時</p><p><b>  }</b></p><p>  while(k2!=1); //等待按鍵釋放</p><p><b>

91、  }</b></p><p><b>  }</b></p><p>  if(k3!=1&&set!=0)//當K2(時間減)按鍵按下時</p><p><b>  {</b></p><p>  display(); //調用顯

92、示,用于延時消抖 </p><p>  if(k3!=1&&set!=0)//如果確定按下</p><p><b>  {</b></p><p>  TR0=0; //關定時器0</p><p>  shanruo=0;//閃爍標志位關</p&g

93、t;<p>  P2=0x00;//滅顯示</p><p>  TR1=0;//關定時器1</p><p>  if(set==1)</p><p>  set_timedx--; //南北減1S</p><p>  else if(set==2)</p><p>  se

94、t_timenb--; //東西減1S</p><p>  if(set_timenb==0)</p><p>  set_timenb=99;</p><p>  if(set_timedx==0 )</p><p>  set_timedx=99; //減到1重置99</p><p>  sec

95、_nb=set_timenb ; //設置的數值賦給東西南北</p><p>  sec_dx=set_timedx;</p><p><b>  do</b></p><p><b>  { </b></p><p>  display(); //調用顯示,用于延時<

96、/p><p><b>  }</b></p><p>  while(k3!=1); //等待按鍵釋放</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(k4!=1&&mode

97、==0)//當K3(確認)鍵按下時</p><p><b>  {</b></p><p>  display(); //調用顯示,用于延時消抖</p><p>  if(k4!=1)//如果確定按下</p><p><b>  {</b></p

98、><p>  TR0=0; //啟動定時器0</p><p>  P2=0x00;//滅顯示</p><p>  sec_nb=set_timenb;//從中斷回復,仍顯示設置過的數值</p><p>  sec_dx=set_timedx;//顯示設置過的時間</p><p>  

99、TR1=0;//關定時器1</p><p><b>  set++;</b></p><p><b>  if(set>2)</b></p><p><b>  {</b></p><p><b>  set=0;</b></p&

100、gt;<p>  TR0=1; //啟動定時器0</p><p>  sec_nb=set_timenb;//從中斷回復,仍顯示設置過的數值</p><p>  sec_dx=set_timedx;//顯示設置過的時間</p><p>  TR1=0;//關定時器1</p><p>

101、<b>  P2=0Xc3;</b></p><p>  sec_nb=sec_dx+5;</p><p><b>  }</b></p><p><b>  do</b></p><p><b>  { </b></p><p>

102、;  display(); //調用顯示,用于延時</p><p><b>  }</b></p><p>  while(k4!=1);</p><p><b>  }</b></p><p><b>  }</b></p><

103、;p>  if(k1!=1&&set==0)//當K5(禁止)鍵按下時</p><p><b>  {</b></p><p>  display(); //調用顯示,用于延時消抖</p><p>  if(k1!=1)//如果確定按下</p><p>

104、<b>  {</b></p><p><b>  mode++;</b></p><p>  if(mode==1)</p><p><b>  {</b></p><p>  TR0=0;//關定時器</p><p>  P2=0x00;

105、//滅顯示</p><p><b>  Red_dx=1;</b></p><p>  Red_nb=1;//全部置紅燈</p><p><b>  TR1=0;</b></p><p>  sec_dx=00;//四個方向的時間都為00</p><

106、p>  sec_nb=00;</p><p><b>  }</b></p><p>  else if(mode==2)</p><p><b>  {</b></p><p>  TR0=0;//關定時器</p><p><b>  P2=0x

107、00;</b></p><p><b>  TR1=1;</b></p><p>  sec_dx=00;//四個方向的時間都為00</p><p>  sec_nb=00;</p><p><b>  } </b></p><p>  if(mode&

108、gt;2)</p><p><b>  {</b></p><p><b>  mode=0;</b></p><p>  TR0=1; //啟動定時器0</p><p>  sec_nb=set_timenb;//從中斷回復,仍顯示設置過的數值</p><

109、;p>  sec_dx=set_timedx;//顯示設置過的時間</p><p><b>  TR1=0;</b></p><p><b>  P2=0Xc3;</b></p><p>  sec_nb=sec_dx+5;//關定時器1</p><p><b&g

110、t;  }</b></p><p><b>  do</b></p><p><b>  {</b></p><p>  display(); //調用顯示,用于延時</p><p><b>  }</b></p><p>  wh

111、ile(k1!=1);//等待按鍵釋放</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void display(void) //顯示子程序</p><p&g

112、t;<b>  {</b></p><p>  buf[1]=sec_nb/10; //第1位 東西秒十位</p><p>  buf[2]=sec_nb%10; //第2位 東西秒個位</p><p>  buf[3]=sec_dx/10; //第3位 南北秒十位</p><p>  buf[0]=se

113、c_dx%10; //第4位 南北秒個位</p><p>  P1=0xff; // 初始燈為滅的</p><p>  P0=0x00; ////滅顯示</p><p>  P1=0xfe; //片選LED1</p><p>  P0=table[buf[1]];//送東西時間

114、十位的數碼管編碼</p><p>  delay(1);//延時</p><p>  P1=0xff;//關顯示</p><p>  P0=0x00;//滅顯示</p><p>  P1=0xfd; //片選LED2</p><p>  P0=table[buf[

115、2]]; //送東西時間個位的數碼管編碼</p><p>  delay(1); //延時</p><p>  P1=0xff;//關顯示</p><p>  P0=0x00;//關顯示</p><p>  P1=0Xfb; //片選LED3</p><p>  P0=table[

116、buf[3]];//送南北時間十位的數碼管編碼</p><p>  delay(1);//延時</p><p>  P1=0xff; //關顯示</p><p>  P0=0x00; //關顯示</p><p>  P1=0Xf7; //片選LED4</p><p>  P0=ta

117、ble[buf[0]];//送南北時間個位的數碼管編碼</p><p>  delay(1);//延時</p><p><b>  }</b></p><p>  void time0(void) interrupt 1 using 1 //定時中斷子程序</p><p><b>  {<

118、/b></p><p>  TH0=0X3C;//重賦初值</p><p>  TL0=0XB0;//12m晶振50ms//重賦初值</p><p>  TR0=1;//重新啟動定時器</p><p>  countt0++;//軟件計數加1</p><p&g

119、t;  if(countt0==10)//加到10也就是半秒</p><p><b>  {</b></p><p>  if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1)) //東西黃燈閃</p><p><b>  {</b>&l

120、t;/p><p>  Green_dx=0;</p><p>  Yellow_dx=0;</p><p>  } </p><p>  if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1)) //南北黃燈閃</p><p><

121、;b>  { </b></p><p>  Green_nb=0;</p><p>  Yellow_nb=0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(countt0==20)

122、 // 定時器中斷次數=20時(即1秒時)</p><p>  {countt0=0;//清零計數器</p><p>  sec_dx--;//東西時間減1</p><p>  sec_nb--;//南北時間減1</p><p>  if((sec_nb<=5)&

123、&(dx_nb==0)&&(shanruo==1)) //東西黃燈閃</p><p><b>  {</b></p><p>  Green_dx=0;</p><p>  Yellow_dx=1;</p><p>  } </p><p>  i

124、f((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1)) //南北黃燈閃</p><p><b>  { </b></p><p>  Green_nb=0;</p><p>  Yellow_nb=1;</p><p>  } &

125、lt;/p><p>  if(sec_dx==0&&sec_nb==5) //當東西倒計時到0時,重置5秒,用于黃燈閃爍時間 </p><p><b>  {</b></p><p><b>  sec_dx=5;</b></p><p>  shanruo=1;</p&g

126、t;<p><b>  }</b></p><p>  if(sec_nb==0&&sec_dx==5)//當南北倒計時到0時,重置5秒,用于黃燈閃爍時間 </p><p><b>  {</b></p><p><b>  sec_nb=5;</b></p

127、><p>  shanruo=1;</p><p><b>  }</b></p><p>  if(dx_nb==0&&sec_nb==0)//當黃燈閃爍時間倒計時到0時,</p><p><b>  {</b></p><p>  P2=0x00;

128、//重置東西南背方向的紅綠燈</p><p>  Green_nb=1;</p><p><b>  Red_dx=1;</b></p><p>  dx_nb=!dx_nb;</p><p>  shanruo=0;</p><p>  sec_nb=set_timenb;//重賦南北

129、方向的起始值</p><p>  sec_dx=set_timenb+5;//重賦東西方向的起始值</p><p><b>  }</b></p><p>  if(dx_nb==1&&sec_dx==0)//當黃燈閃爍時間到</p><p><b>  {</b>&l

130、t;/p><p>  P2=0X00;//重置東西南北的紅綠燈狀態(tài)</p><p>  Green_dx=1; //東西綠燈亮</p><p>  Red_nb=1; //南北紅燈亮</p><p>  dx_nb=!dx_nb; //取反</p><p>  shanruo=0;

131、//閃爍</p><p>  sec_dx=set_timedx;//重賦東西方向的起始值</p><p>  sec_nb=set_timedx+5;//重賦南北方向的起始值</p><p><b>  }</b></p><p><b>  }</b></p>&

132、lt;p><b>  }</b></p><p>  void time1(void) interrupt 3 //定時中斷子程序</p><p><b>  {</b></p><p>  TH1=0X3C;//重賦初值</p><p>  TL1=0XB0;/

133、/12m晶振50ms//重賦初值</p><p>  countt1++;//軟件計數加1</p><p>  if(countt1==10) // 定時器中斷次數=10時(即0.5秒)</p><p><b>  {</b></p><p>  Yellow_nb=0;//南北黃燈滅

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論