㈠ 求51單片機控制的交通燈電路圖
一、設計任務與要求
1.設計一個十字路口的交通燈控制電路,要求甲車道和乙車道兩條交叉道路上的車輛交替運行,每次通行時間都設為25秒;
2.要求黃燈先亮5秒,才能變換運行車道;
3.黃燈亮時,要求每秒鍾閃亮一次 。
二、實驗預習要求
1.復習數字系統設計基礎。
2.復習多路數據選擇器、二進制同步計數器的工作原理。
3.根據交通燈控制系統框圖,畫出完整的電路圖。
三、設計原理與參考電路
1.分析系統的邏輯功能,畫出其框圖
交通燈控制系統的原理框圖如圖12、1所示。它主要由控制器、定時器、解碼器和秒脈沖信號發生器等部分組成。秒脈沖發生器是該系統中定時器和控制器的標准時鍾信號源,解碼器輸出兩組信號燈的控制信號,經驅動電路後驅動信號燈工作,控制器是系統的主要部分,由它控制定時器和解碼器的工作。圖中:
TL: 表示甲車道或乙車道綠燈亮的時間間隔為25秒,即車輛正常通行的時間間隔。定時時間到,TL=1,否則,TL=0。
TY:表示黃燈亮的時間間隔為5秒。定時時間到,TY=1,否則,TY=0。
ST:表示定時器到了規定的時間後,由控制器發出狀態轉換信號。由它控制定時器開始下個工作狀態的定時。
圖12、1 交通燈控制系統的原理框圖 2.畫出交通燈控制器的ASM(Algorithmic State Machine,演算法狀態機)
(1)圖甲車道綠燈亮,乙車道紅燈亮。表示甲車道上的車輛允許通行,乙車道禁止通行。綠燈亮足規定的時間隔TL時,控制器發出狀態信號ST,轉到下一工作狀態。
(2)甲車道黃燈亮,乙車道紅燈亮。表示甲車道上未過停車線的車輛停止通行,已過停車線的車輛繼續通行,乙車道禁止通行。黃燈亮足規定時間間隔TY時,控制器發出狀態轉換信號ST,轉到下一工作狀態。
(3)甲車道紅燈亮,乙車道黃燈亮。表示甲車道禁止通行,乙車道上的車輛允許通行綠燈亮足規定的時間間隔TL時,控制器發出狀態轉換信號ST,轉到下一工作狀態。
(4)甲車道紅燈亮,乙車道黃燈亮。表示甲車道禁止通行,乙車道上位過縣停車線的車輛停止通行,已過停車線的車輛停止通行,已過停車線的車輛繼續通行。黃燈亮足規定的時間間隔TY時,控制器發出狀態轉換信號ST,系統又轉換到第(1)種工作狀態。
交通燈以上4種工作狀態的轉換是由控制器器進行控制的。設控制器的四種狀態編碼為00、01、11、10,並分別用S0、S1、S3、S2表示,則控制器的工作狀態及功能如表12、1所示,控制器應送出甲、乙車道紅、黃、綠燈的控制信號。為簡便起見,把燈的代號和燈的驅動信號合二為一,並作如下規定:
表12、1 控制器工作狀態及功能
控制狀態 信號燈狀態 車道運行狀態
S0(00) 甲綠,乙紅 甲車道通行,乙車道禁止通行
S1(01) 甲黃,乙紅 甲車道緩行,乙車道禁止通行
S3(11) 甲紅,乙綠 甲車道禁止通行,甲車道通行
S2(10) 甲紅,乙黃 甲車道禁止通行,甲車道緩行
AG=1:甲車道綠燈亮;
BG=1:乙車道綠燈亮;
AY=1:甲車道黃燈亮;
BY=1:乙車道黃燈亮;
AR=1:甲車道紅燈亮;
BY=1:乙車道紅燈亮;
由此得到交通燈的ASM圖,如 圖12、2所示。設控制器的初始狀態為S0(用狀態框表示S0),當S0的持續時間小於25秒時,TL=0(用判斷框表示TL),控制器保持S0不變。只有當S0的持續時間等於25秒時,TL=1,控制器發出狀態轉換信號ST(用條件輸出框表示ST),並轉換到下一個工作狀態。依此類推可以弄懂ASM圖所表達的含義。
3.單元電路的設計
(1)定時器
定時器由與系統秒脈沖(由時鍾脈沖產生器提供)同步的計數器構成,要求計數器在狀態信號ST作用下,首先清零,然後在時鍾脈沖上升沿作用下,計數器從零開始進行增1計數,向控制器提供模5的定時信號TY和模25的定時信號TL。
計數器選用集成電路74LS163進行設計較簡便。74LS163是4位二進制同步計數器,它具有同步清零、同步置數的功能。74LS163的外引線排列圖和時序波形圖如圖12、3所示,其功能表如表12、2所示。圖中, 是低電平有效的同步清零輸入端, 是低電平有效才同步並行置數控制端,CTp、CTT是計 圖12、2 交通燈的ASM圖數控制端,CO是進位輸出端,D0~D3是並行數據輸入端,Q0~Q 3是數據輸出端。由兩片74LS163級聯組成的定時器電路如圖12、4所示。電路的工作原理請自行分析。
(a)
圖12、3 74LS163的外引線排列圖和時序波形圖
(2)控制器
控制器是交通管理的核心,它應該能夠按照交通管理規則控制信號燈工作狀態的轉換。從ASM圖可以列出控制器的狀態轉換表,如表12、3所示。選用兩個D觸發器FF1、FFO做為時序寄存器產生 4種狀態,控制器狀態轉換的條件為TL和TY,當控制器處於Q1n+1Q0n+1= 00狀態時,如果TL= 0,則控制器保持在00狀態;如果,則控制器轉換到Q1n+1Q0n+1= 01狀態。這兩種情況與條件TY無關,所以用無關項"X"表示。其餘情況依次類推,同時表中還列出了狀態轉換信號ST。
圖12、4 定時器電路圖
表12、2 74LS163功能表
|
表12、3 控制器狀態轉換表
根據表12、3、可以推出狀態方程和轉換信號方程,其方法是:將Q1n+1、Q0n+1和 ST為1的項所對應的輸人或狀態轉換條件變數相與,其中"1"用原變數表示,"0"用反變數表示,然後將各與項相或,即可得到下面的方程:
根據以上方程,選用數據選擇器 74LS153來實現每個D觸發器的輸入函數,將觸發器的現態值( )加到74LS153的數據選擇輸入端作為控制信號.即可實現控制器的功能。控制器的邏輯圖如圖12、5所示。圖中R、C構成上電復位電路 。
圖 12、5控制器邏輯圖
(3)解碼器
解碼器的主要任務是將控制器的輸出 Q1、 Q0的4種工作狀態,翻譯成甲、乙車道上6個信號燈的工作狀態。控制器的狀態編碼與信號燈控制信號之間的關系如表 12、4所示。實現上述關系的解碼電路請讀者自行設計。
四、實驗儀器設備
1. 數字電路實驗箱
2. 集成電路74LS74 1片,74LS10 1片,74LS00 2片,74LS153 2片,74LS163 2片,NE555 1片
3. 電阻 51KΩ 1隻,200Ω 6隻
4. 電容 10Uf 1隻
5. 其它 發光二極體 6隻
五、實驗內容及方法
表12、4控制器狀態編碼與信號燈關系表
狀態 AG AY AR BG BY BR
00 1 0 0 0 0 1
01 0 1 0 0 0 1
10 0 0 1 1 0 0
11 0 0 1 0 1 0
1.設計、組裝解碼器電路,其輸出接甲、乙車道上的6隻信號燈(實驗時用發光二極體代替),驗證電路的邏輯功能。
2.設計、組裝秒脈沖產生電路。
3.組裝、調試定時電路。當 CP信號為 1Hz正方波時,畫出CP、 Q0、 Q1、 Q2、Q3、Q4、TL.、TY的波形,並注意它們之間一的時序關系。
4.組裝、調試控制器電路。
5.完成交通燈控制電路的聯調,並測試其功能。
㈡ 跪求用單片機8051晶元設計的交通信號燈,那位大哥,大姐,幫下小弟
單片機課程設計與總結報告
摘要
近年來隨著科技的飛速發展,單片機的應用正在不斷地走向深入,同時帶動傳統控制檢測日新月益更新。在實時檢測和自動控制的單片機應用系統中,單片機往往是作為一個核心部件來使用,僅單片機方面知識是不夠的,還應根據具體硬體結構,以及針對具體應用對象特點的軟體結合,加以完善。交通信號燈的出現,使交通得以有效管制,對於疏導交通流量、提高道路通行能力,減少交通事故有明顯效果。本系統採用單片機AT89C51為中心器件來設計交通燈控制器,系統實用性強、操作簡單、擴展性強。
目錄
一.設計任務…………………………
二.交通燈的設計程序框圖………………
三.交通燈程序的主程序 ………………
四.系統硬體電路的設計……………………
五.原理圖………………
六.檢測與調試…………………………….
七.總結與體會……………………………….
八.致謝……………………………….
一.設計任務
(一)、功能及技術指標要求
設計交通燈的基本要求 : 設計一個交通燈,要應用DVCC實驗系統。
(二)、設計內容
按設計技術指標進行交通燈的硬體和軟體設計。
(三)設計思路及關鍵技術
一個完整的交通燈相當於一個簡單的單片機系統,該系統有交通燈設置電路、單片機、顯示電路等構成。單片機是集成的IC晶元,只需根據實際設計要求選型。其他部分都需要根據應用要求和性能指標自行設計。
基於單片機的交通燈的設計時要充分的認識以下兩個問題:
1.因為本實驗是交通燈控制實驗,所以要先了解實際交通燈的變化規律。假設一個十字路口為東西南北走向。初始狀態0為東西紅燈,南北紅燈。然後轉狀態1南北綠燈通車,東西紅燈。過一段時間轉狀態2,南北綠燈閃幾次轉亮黃燈,延時幾秒,東西仍然紅燈。再轉狀態3,東西綠燈通車,南北紅燈。過一段時間轉狀態4,東西綠燈閃幾次轉亮黃燈,延時幾秒,南北仍然紅燈。最後循環至狀態1。
2.雙色LED是由一個紅色LED管芯和一個綠色LED管芯封裝在一起,公用負端。當紅色正端加高電平,綠色正端加低電平時,紅燈亮;紅色正端加低電平,綠色正端加高電平時,綠燈亮;兩端都加高電平時,黃燈亮。
二. 交通燈的設計程序框圖
開始
↓
四個路口紅燈亮
↓
東西綠燈亮,南北紅燈亮,延時
↓
東西黃燈閃爍,南北紅燈亮,延時
↓
東西紅燈亮,南北綠燈亮,延時
↓
東西紅燈亮,南北黃燈閃爍,延時
↓
三.交通燈程序的主程序
程序如下:
ORG 0000H
SJMP A3 ;四盞紅燈亮
A3:MOV SP,#60H
MOV A, #24H
MOV P1, A
CLR P3.4
CLR P3.3
SETB P3.5
SETB P3.2 ;顯示5秒
MOV R4,#05H
LOOP1:MOV R2,#03H
LCALL xian ;調顯示子程序
DJNZ R4,LOOP1
MOV R4,#00H
MOV R2,#03H
LCALL xian
;東西綠燈亮,南北紅燈亮
A2:MOV A,#0CH
CLR P3.5
MOV P1,A
SETB P3.3
CLR P3.4
SETB P3.2 ;顯示20秒
MOV R4,#14H
LOOP2 :MOV R2,#03H
LCALL xian ;調顯示子程序
DJNZ R4,LOOP2
MOV R4,#00H
MOV R2,#03H
LCALL xian ;調顯示子程序
SETB P3.2
CLR P3.3 ; 顯示5秒
MOV R4 ,#05H ;東西黃燈亮,南北紅燈亮
LOOP9:MOV A,#14H
MOV P1 ,A
CLR P3.5
SETB P3.4
MOV R2,#02H
LCALL xian ;調顯示子程序
MOV R2,#01H ;定時
LCALL DELAY ;調延時子程序
;南北紅燈亮
MOV A ,#04H
MOV P1 ,A
CLR P3.4
CLR P3.5
MOV R2,#01H ;定時
LCALL DELAY ;調延時子程序
DJNZ R4,LOOP9
MOV R4,#00H
MOV R2,#03H
LCALL xian ;調顯示子程序
;東西紅燈亮,南北綠燈亮
A8: MOV A, #61H
MOV P1,A
CLR P3.4
CLR P3.3
CLR P3.2
SETB P3.5 ; 顯示20秒
MOV R4,#14H
LOOP3: MOV R2,#03H
LCALL xian ;調顯示子程序
DJNZ R4,LOOP3
MOV R4,#00H
MOV R2,#03H
LCALL xian ;調顯示子程序
SETB P3.5
MOV R4 ,#05H
LOOP10: MOV R2,#02H
LCALL xian ;調顯示子程序
; 東西紅燈亮,南北黃燈亮
A0:MOV A,#0A2H
MOV P1,A
CLR P3.4
CLR P3.3
CLR P3.2
MOV R2,#01H ;定時
LCALL DELAY ;調延時子程序
; 東西紅燈亮
MOV A,#20H
MOV P1,A
CLR P3.4
CLR P3.3
CLR P3.2
MOV R2,#01H ;定時
LCALL DELAY ;調延時子程序
DJNZ R4,LOOP10
MOV R4,#00H
MOV R2,#03H
LCALL xian ;調顯示子程序
LJMP A2 ;延時子程序
DELAY:PUSH 2
PUSH 1
PUSH 0
DELAY1: MOV 1,#00H
DELAY2:MOV 0,#0B2H
DJNZ 0,$
DJNZ 1,DELAY2
DJNZ 2,DELAY1
POP 0
POP 1
POP 2
DJNZ R2 ,DELAY
RET
;顯示子程序
xian: MOV A,R4
MOV B,#10
DIV AB
MOV R6,A
MOV DPTR,#TAB
MOV A,B
MOVC A,@A+DPTR
MOV SBUF,A
MOV R7,#0FH
H55S:DJNZ R7,H55S
MOV A,R6
MOVC A,@A+DPTR
MOV SBUF,A
MOV R7,#0FH
H55S1:DJNZ R7,H55S1
LCALL DELAY
RET
TAB:DB 0fch,60h,0dah,0f2h,66h,0b6h,0beh,0e0h
DB 0feh,0f6h,0eeh,3eh,9ch,7ah,9eh,8eh
END
四.系統硬體電路的設計
(1)晶元由DVCC實驗系統提供(AT89C51)
1.主要特性:
•與MCS-51 兼容
•4K位元組可編程閃爍存儲器
壽命:1000寫/擦循環
數據保留時間:10年
•全靜態工作:0Hz-24Hz
•三級程序存儲器鎖定
•128*8位內部RAM
•32可編程I/O線
•兩個16位定時器/計數器
•5個中斷源
•可編程串列通道
•低功耗的閑置和掉電模式
•片內振盪器和時鍾電路
2.管腳說明:
VCC:供電電壓。
GND:接地。
P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用於外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。
P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1後,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由於內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。
P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫「1」時,其管腳被內部上拉電阻拉高,且作為輸入。並因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由於內部上拉的緣故。P2口當用於外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址「1」時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。
P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入「1」後,它們被內部上拉為高電平,並用作輸入。作為輸入,由於外部下拉為低電平,P3口將輸出電流(ILL)這是由於上拉的緣故。P3口也可作為AT89C51的一些特殊功能口,如下表所示:
口管腳 備選功能
P3.0 RXD(串列輸入口) P3.1 TXD(串列輸出口)
P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1)
P3.4 T0(記時器0外部輸入) P3.5 T1(記時器1外部輸入)
P3.6 /WR(外部數據存儲器寫選通) P3.7 /RD(外部數據存儲器讀選通)
P3口同時為閃爍編程和編程校驗接收一些控制信號。
RST:復位輸入。當振盪器復位器件時,要保持RST腳兩個機器周期的高電平時間。
ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用於鎖存地址的地位位元組。在FLASH編程期間,此引腳用於輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振盪器頻率的1/6。因此它可用作對外部輸出的脈沖或用於定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,置位無效。
/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。
/EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用於施加12V編程電源(VPP)。
XTAL1:反向振盪放大器的輸入及內部時鍾工作電路的輸入。
XTAL2:來自反向振盪器的輸出。
3.振盪器特性: XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內振盪器。石晶振盪和陶瓷振盪均可採用。如採用外部時鍾源驅動器件,XTAL2應不接。有餘輸入至內部時鍾信號要通過一個二分頻觸發器,因此對外部時鍾信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。
4.晶元擦除: 整個PEROM陣列和三個鎖定位的電擦除可通過正確的控制信號組合,並保持ALE管腳處於低電平10ms 來完成。在晶元擦操作中,代碼陣列全被寫「1」且在任何非空存儲位元組被重復編程以前,該操作必須被執行。
此外,AT89C51設有穩態邏輯,可以在低到零頻率的條件下靜態邏輯,支持兩種軟體可選的掉電模式。在閑置模式下,CPU停止工作。但RAM,定時器,計數器,串口和中斷系統仍在工作。在掉電模式下,保存RAM的內容並且凍結振盪器,禁止所用其他晶元功能,直到下一個硬體復位為止。
(2) 完整的DVCC實驗箱面板
(3)硬體電路連接說明
五.原理圖
六.檢測與調試
1、硬體調試:
硬體調試是利用DVCC實驗與開發系統、基本測試儀器(萬用表、示波器等),檢查用戶系統硬體中存在的故障。
硬體調試可分為靜態調試與動態調試兩步進行。
靜態調試是在用戶系統未工作時的一種硬體檢測。
第一步:目測。檢查外部的各種元件或者是電路是否有斷點。
第二步用萬用表測試。先用萬用表復核目測中有疑問的連接點,再檢測各種電源線與地線之間是否有短路現象。
第三步加電檢測。給板加電,檢測所有插座或是器件的電源端是否符合要求的值
第四步是聯機檢查。因為只有用單片機開發系統才能完成對用戶系統的調試。
動態調試是在用戶系統工作的情況下發現和排除用戶系統硬體中存在的器件內部故障、器件連接邏輯錯誤等的一種硬體檢查。動態調試的一般方法是由近及遠、由分到合。由分到合是指首先按邏輯功能將用戶系統硬體電路分為若干塊,當調試電路時,與該元件無關的 器件全部從用戶系統中去掉,這樣可以將故障范圍限定在某個局部的電路上。當各塊電路無故障後,將各電路逐塊加入系統中,在對各塊電路功能及各電路間可能存在的相互聯系進行調試。由分到合的調試既告完成。由近及遠是將信號流經的各器件按照距離單片機的邏輯距離進行由近及遠的分層,然後分層調試。調試時,仍採用去掉無關元件的方法,逐層調試下去,就會定位故障元件了。
2、軟體調試:
軟體調試是通過對程序的匯編、連接、執行來發現程序中存在的語法錯誤與邏輯錯誤並加以排除糾正的過程。
七.總結與體會
本系統是以單片機AT89C51晶元為核心部件,實現了能根據實際車流量通過AT89C51晶元設置紅、綠燈燃亮時間的功能。此次在軟體上是花費時間最多的,我們上網找資料,上圖書館,盡可能的了解有關於交通燈這方面的知識。通過這次畢業設計,使我得到了一次用專業知識、專業技能分析和解決問題全面系統的鍛煉。使我在單片機的基本原理、單片機應用系統開發過程,以及在常用編程設計思路技巧(特別是匯編語言)的掌握方面都能向前邁了一大步。
八.致謝
通過本次畢業設計,我在塗老師和王老師的精心指導和嚴格要求下,獲得了豐富的理論知識,極大地提高了實踐能力,單片機領域這對我今後進一步學習計算機方面的知識有極大的幫助。在此,忠心感謝塗老師和王老師以及許多同學的指導和支持。
要圖的話,多給我點分,我發到你郵箱里!
㈢ 51單片機C語言程序:交通燈系統
這種問題一般沒人會的,像 CSDN、程序員網 等等有類似的設計,你可以去看看
㈣ 基於51單片機控制交通燈的電路圖與C語言程序
思路:
紅燈停,綠燈行,黃燈閃爍提示行人紅綠燈即將切換。四個方向各有一個紅、黃、綠顯示和兩個數碼管。
東西道為人行道(20秒),南北道為車行道(60秒),黃燈延時最後三秒時,閃爍並切換。
三、硬體電路設計
此電中路設計採用AT89C51單片機,74LS47(數碼管驅動)74LS373(數碼管驅動輸出鎖存),8個數碼管顯示其延時值,四個紅、黃、綠指示燈。硬體設計關鍵在於,延時顯示時,要考慮到當個位數字顯示時,要確保十位數字顯示輸出的不變。因此,可加輸出鎖存器。在延時最後三秒時,要讓黃燈進行閃爍,並同時顯示數字(這一步在軟體設計上很關鍵)。
四、軟體程序(C語言)
以下是整個設計的軟體程序,直接可以編譯成*。Hex代碼。通過以上電路,下載到單片機,可直接運行。
//*****************************//
//程序名:十字路口交通燈控制
//編寫人:黃庭劍
//初寫時間:2009年1月2日
//程序功能:南北為車行道,延時60秒;東西方向為人行道,延時20秒,且在最後3秒黃燈顯示2秒鍾再實現切換.
//CPU說明:AT89C51型單片機;24MHZ晶體振盪器
//完成時間:2009年1月6日
//*****************************//
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
sfrp0=0x80;
sfrp1=0x90;
sfrp2=0xA0;
sfrp3=0xb0;//這部分內容其實在「#include<reg51.h>」里已經有,但裡面定義的必須區分大小寫,在這里,因為我程序採用的是小寫,reg51.h里對各個埠與寄存器的定義都是大寫,所以在編譯連接時,會報錯,所以,在本設計程序里,我只用到了埠,在這里也就只定義了四個,而沒有去改reg51.h裡面的內容。其實兩者是一樣的。
sbitsw=p0^0;
sbitOE=P0^6;
sbitLE=P0^7;//74LS373鎖存器控制端定義
chardisplay[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};//p1口的數碼管時間顯示調用,利用74L74BCD碼,8位驅動輸出;
//函數聲明begin
voiddelay1(intcount);
voiddelay_long(intnumber1,intnumber2);
voidpeople_car_drive();
//函數聲明end
//***********************//延時子程序
voiddelay1(intcount)
{inti;
for(i=count;i>0;i--)
{;}
}
voiddelay_long(intnumber1,intnumber2)
{
inta,b;
for(a=number1;a>0;a--)
{
for(b=number2;b>0;b--)
{_nop_();}
}
}
//**********************//延時子程序
voidpeople_car_drive()
{
intp_1=2,i,j=9,p_2=6;//****************//行人通行時,延時20秒
p2=0x09;//南北紅燈亮
p3=0x24;//東西綠燈亮
while(p_1-->0)
{LE=1;
OE=0;
if(p_1==0){OE=1;}//當十位數減到0時,只顯示個位數
p1=display[p_1];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_1==0&&j==3)break;//減到3時退出循環,讓其黃燈閃爍顯示
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
//*******************************************************************************//
p2=0x12;//南北黃燈閃爍三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
//*****************以下是車輛通行時延時60秒//
p2=0x24;//南北綠燈亮
p3=0x09;//東西紅燈亮
while(p_2-->0)
{LE=1;
OE=0;
if(p_2==0){OE=1;}//當十位數減到0時,只顯示個位數
p1=display[p_2];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_2==0&&j==3)break;//減到2時退出循環
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
p2=0x12;//南北黃燈閃爍三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);//南北黃燈閃爍三秒完畢
}
voidmain()//主函數入口處
{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00;//初始化各埠
{while(1)
{
if(sw==0)
{people_car_drive();}
else
{
p2=0x00;
p3=0x00;//關閉所有交通燈
}
}
}
}
詳情訪問:http://hi..com/hjiannew/
㈤ 模擬交通燈 單片機C51,要電路圖和程序
package guidemo;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
/**
* <p>Title: 圖形用戶界面</p>
*
* <p>Description: 簡單的圖形界面編程</p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author vic
* @version 1.0
*/
public class ColorFrame extends Frame implements MouseListener {
Label L; //標簽
TextField T; //文本域
Button B1, B2; //按鈕
public ColorFrame() {
this.setLayout(null); //想要手動指定各組件的的位置
L = new Label("輸入學號:"); //設定標簽L內容
L.setBounds(60, 50, 50, 25); //設定標簽L外觀
this.add(L); //將標簽L添加到窗口中
T = new TextField("請在這里輸入"); //設定文本域T的內容
T.setBounds(125, 50, 90, 25); //設定文本域T的外觀
this.add(T); //將文本域T添加到窗口中
B1 = new Button("變紅!"); //設定按鈕B1的內容
B1.setBounds(25, 90, 90, 25); //設定按鈕B1的外觀
B1.addMouseListener(this);//在B1上注冊滑鼠監聽器
this.add(B1); //將按鈕B1添加到窗口中
B2 = new Button("變綠!");
B2.setBounds(125, 90, 90, 25);
B2.addMouseListener(this);
this.add(B2);
WindowDestroyer Listener = new WindowDestroyer(); //創建關閉窗口監聽器
this.addWindowListener(Listener); //將監聽器添加到窗口中
this.setBackground(Color.yellow); //設定窗口背景顏色
this.setTitle("This is Frame!"); //設定窗口標題文字
this.setBounds(0, 0, 250, 220); //設定窗口位置和大小
this.setVisible(true); //顯示窗口
}
public void mouseClicked(MouseEvent e) {
if (e.getComponent() == B1) {//getComponent返回按鈕上面的字元串
this.setBackground(Color.red);
}
if (e.getComponent() == B2) {
this.setBackground(Color.green);
}
}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public static void main(String[] args) {
new ColorFrame();
}
}
㈥ 用51單片機編寫城市道路交通燈c語言程序,有左轉右轉
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P3^0; //東西向指示燈
sbit YELLOW_A=P3^1;
sbit GREEN_A=P3^2;
sbit RED_B=P3^3; //南北向指示燈
sbit YELLOW_B=P3^4;
sbit GREEN_B=P3^5;
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit KEY3=P1^2;
//延時倍數,閃爍次數,操作類型變數
uchar Flash_Count=0,Operation_Type=1,LEDsng,LEDsns,LEDewg,LEDews,discnt;
uint Time_Count=0,time;
uchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
void displaysn()
{
LEDsng=((time-Time_Count)/20)%10;
LEDsns=((time-Time_Count)/20)/10;
LEDewg=0x10;
LEDews=0x10;
}
void displayew()
{
LEDewg=((time-Time_Count)/20)%10;
LEDews=((time-Time_Count)/20)/10;
LEDsng=0x10;
LEDsns=0x10;
}
//定時器0 中斷函數
void T0_INT() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
switch(Operation_Type)
{
case 1: //東西向綠燈與南北向紅燈亮
if((Time_Count%20)==0)displayew();
RED_A=0;YELLOW_A=0;GREEN_A=1;
RED_B=1;YELLOW_B=0;GREEN_B=0;
if(++Time_Count!=time) return;
Time_Count=0;
Operation_Type=2;
break;
case 2: //東西向黃燈開始閃爍,綠燈關閉
LEDewg=0x0;
LEDews=0x0;
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_A=~YELLOW_A;GREEN_A=0;
if(++Flash_Count!=10) return; //閃爍
Flash_Count=0;
Operation_Type=3;
break;
case 3: //東西向紅燈與南北向綠燈亮
if((Time_Count%20)==0)displaysn();
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;
if(++Time_Count!=time) return;
Time_Count=0;
Operation_Type=4;
break;
case 4: //南北向黃燈開始閃爍,綠燈關閉
LEDsng=0x0;
LEDsns=0x0;
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_B=~YELLOW_B;GREEN_A=0;
if(++Flash_Count!=10) return; //閃爍
Flash_Count=0;
Operation_Type=1;
break;
}
}
void t1_isr() interrupt 3
{
TR1=0;
TH1=(65536-3000)/256;
TL1=(65536-3000)%256;
TR1=1;
switch(discnt)
{
case 0:
P2=0x02;
P0=ledtab[LEDewg];
break;
case 1:
P2=0x01;
P0=ledtab[LEDews];
break;
case 2:
P2=0x08;
P0=ledtab[LEDsng];
break;
case 3:
P2=0x04;
P0=ledtab[LEDsns];
break;
default:discnt=0;break;
}
discnt++;
discnt&=0x03;
}
void delay()
{
uint i;
for(i=0;i<1000;i++);
}
//主程序
void main()
{
TMOD=0x11; //T0 方式1
EA=1;
ET0=1;
TR0=1;
TH1=(65536-3000)/256;
TL1=(65536-3000)%256;
TR1=1;
ET1=1;
time=100;
Time_Count=100;
Time_Count=0;
Operation_Type=1;
while(1)
{
if(KEY1==0) //按一下加1S
{
delay();
if(KEY1==0)
{
while(KEY1==0);
TR0=0;
time+=20;
LEDsng=(time/20)%10;
LEDsns=(time/20)/10;
LEDewg=0x10;
LEDews=0x10;
}
}
if(KEY2==0) //按一下減1S
{
delay();
if(KEY2==0)
{
while(KEY2==0);
TR0=0;
time-=20;
if(time==0)time=20;
LEDewg=(time/20)%10;
LEDews=(time/20)/10;
LEDsng=0x10;
LEDsns=0x10;
}
}
if(KEY3==0) //啟動
{
delay();
if(KEY3==0)
{
while(KEY2==0);
TR0=1;
Time_Count=0;
}
}
}
}
㈦ 用51單片機製作紅綠燈,要求按鍵能控制整個電路的啟動和停止,用匯編語言怎麼編寫程序
交通路口紅綠燈自動控制器電路圖 如圖所示為交通路口紅綠燈自動控制電路。該控制器主要由四塊555(IC2~IC5)和一些阻容元件組成的四級單穩態延時電路首尾相連而成。輸入的8V電壓經78M05穩壓後為555提供VDD=+5V的電源電壓。 當剛接通電源時,觸發脈沖經IC1(CD4011)門電路和R1、C1延時,再經C2、R22微分後加到IC2②腳,觸發IC2輸出高電平,進入暫穩態,其暫穩態定時時間長短取決於K1的位置,延時td=1.1RC6,設定時間分別為60秒、45秒、30秒。暫穩態結束時,IC2③腳為低電平,其經C3、R23微分後,下降沿又觸發IC3,形成第二級單穩態延時。如此依次觸發定時,完成綠色燈亮-黃色燈亮(8秒、10秒、12秒)-紅色燈亮(60秒、45秒、30秒)的循環周期。 本控制器通過四級電路首尾相接,依次延時觸發,使交通燈依次出現綠-黃-紅(色)信號,指揮行人和車輛在十字路I=1有秩序地通行(綠)-提醒注意(黃)-禁止通行(紅)。 看看這個有用嗎?
㈧ c51單片機c語言交通燈的程序
Proteus模擬原理圖:
程序如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar data buf[4];
uchar data sec_dx=20;//東西數默認
uchar data sec_nb=30;//南北默認值
uchar data set_timedx=20;
uchar data set_timenb=30;
int n;
uchar data b;//定時器中斷次數
sbit k1=P1^6;//定義5組開關
sbit k2=P1^7;
sbit k3=P2^7;
sbit k4=P3^0;
sbit k5=P3^1;
sbit Yellow_nb=P2^5; //南北黃燈標志
sbit Yellow_dx=P2^2; //東西黃燈標志
sbit Green_nb=P2^4;
sbit Green_dx=P2^1;
sbit Buzz=P3^7;
bit Buzzer_Indicate;
bit time=0;//燈狀態循環標志
bit set=1;//調時方向切換鍵標志
uchar code table[11]={ //共陰極字型碼
0x3f, //--0
0x06, //--1
0x5b, //--2
0x4f, //--3
0x66, //--4
0x6d, //--5
0x7d, //--6
0x07, //--7
0x7f, //--8
0x6f, //--9
0x00 //--NULL
};
//函數的聲明部分
void delay(int ms);//延時子程序
void key();//按鍵掃描子程序
void key_to1();//鍵處理子程序
void key_to2();
void key_to3();
void display();//顯示子程序
void logo(); //開機LOGO
void Buzzer();
//主程序
void main()
{
TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
EA=1;
ET0=1;
TR0=1;
EX0=1;
EX1=1;
logo();
P2=0Xc3;// 開始默認狀態,東西綠燈,南北黃燈
sec_nb=sec_dx+5;
while(1)
{
key(); //調用按鍵掃描程序
display(); //調用顯示程序
Buzzer();
}
}
//函數的定義部分
void key() //按鍵掃描子程序
{
if(k1!=1)
{
delay(10);
if(k1!=1)
{
while(k1!=1)
{
key_to1();
for(n=0;n<40;n++)
{ display();}
}
}
}
if(k2!=1)
{
delay(10);
if(k2!=1)
{
while(k2!=1)
{
key_to2();
for(n=0;n<40;n++)
{ display();}
}
}
}
if(k3!=1)
{
TR0=1; //啟動定時器
Buzzer_Indicate=0;
sec_nb=set_timenb; //從中斷回復,仍顯示設置過的數值
sec_dx=set_timedx;
if(time==0)
{ P2=0X99;sec_nb=sec_dx+5; }
else { P2=0xC3;sec_dx=sec_nb+5; }
}
if(k4!=1)
{
delay(5);
if(k4!=1)
{
while(k4!=1);
set=!set;
}
}
if(k5!=1)
{
delay(5);
if(k5!=1)
{
while(k5!=1)
key_to3();
}
}
}
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位 南北秒個位
P1=0xff; // 初始燈為滅的
P0=0x00;
P1=0xfe; //片選LCD1
P0=table[buf[1]];
delay(1);
P1=0xff;
P0=0x00;
P1=0xfd; //片選LCD2
P0=table[buf[2]];
delay(1);
P1=0xff;
P0=0x00;
P1=0Xfb; //片選LCD3
P0=table[buf[3]];
delay(1);
P1=0xff;
P0=0x00;
P1=0Xf7;
P0=table[buf[0]]; //片選LCD4
delay(1);
}
void time0(void) interrupt 1 using 1 //定時中斷子程序
{
b++;
if(b==19) // 定時器中斷次數
{ b=0;
sec_dx--;
sec_nb--;
if(sec_nb<=5&&time==0) //東西黃燈閃
{ Green_dx=0;Yellow_dx=!Yellow_dx;}
if(sec_dx<=5&&time==1) //南北黃燈閃
{ Green_nb=0;Yellow_nb=!Yellow_nb;}
if(sec_dx==0&&sec_nb==5)
sec_dx=5;
if(sec_nb==0&&sec_dx==5)
sec_nb=5;
if(time==0&&sec_nb==0)
{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}
if(time==1&&sec_dx==0)
{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}
}
}
void key_to1() //鍵盤處理子程序之+
{
TR0=0; //關定時器
if(set==0)
set_timenb++; //南北加1S
else
set_timedx++; //東西加1S
if(set_timenb==100)
set_timenb=1;
if( set_timedx==100)
set_timedx=1; //加到100置1
sec_nb=set_timenb ; //設置的數值賦給東西南北
sec_dx=set_timedx;
}
void key_to2() //鍵盤處理子程序之-
{
TR0=0; //關定時器
if(set==0)
set_timenb--; //南北減1S
else
set_timedx--; //東西減1S
if(set_timenb==0)
set_timenb=99;
if( set_timedx==0 )
set_timedx=99; //減到1重置99
sec_nb=set_timenb ; //設置的數值賦給東西南北
sec_dx=set_timedx;
}
void key_to3() //鍵盤處理之緊急車通行
{
TR0=0;
P2=0Xc9;
sec_dx=00;
sec_nb=00;
Buzzer_Indicate=1;
}
void int0(void) interrupt 0 using 1 //只允許東西通行
{
TR0=0;
P2=0Xc3;
Buzzer_Indicate=0;
sec_dx=00;
sec_nb=00;
}
void int1(void) interrupt 2 using 1 //只允許南北通行
{
TR0=0;
P2=0X99;
Buzzer_Indicate=0;
sec_nb=00;
sec_dx=00;
}
void logo()//開機的Logo "- - - -"
{ for(n=0;n<50;n++)
{
P0=0x40;
P1=0xfe;
delay(1);
P1=0xfd;
delay(1);
P1=0Xfb;
delay(1);
P1=0Xf7;
delay(1);
P1 = 0xff;
}
}
void Buzzer()
{
if(Buzzer_Indicate==1)
Buzz=!Buzz;
else Buzz=0;
}
void delay(int ms) //延時子程序
{
uint j,k;
for(j=0;j<ms;j++)
for(k=0;k<124;k++);
}
㈨ 基於51單片機控制交通燈的電路圖與C語言程序
#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar h;
uint r=0;
uint s;
uchar code dis[]={ 0Xc0,0Xf9, 0Xa4,0Xb0,0X99,0X92,0X82,0Xf8,0X80,0X90,0Xff,};
/*0*//*1*//*2*//*3*//*4*//*5*//*6*//*7*//*8*//*9*//*NULL*/
void delay(uint c)
{
uint i,j;
for(i=0;i<c;i++)
for(j=0;j<100;j++);
}
void t0(void) interrupt 0 using 1 //interrupt 1
{
delay(2);
if(INT0==0)
{
r++;
if(r==2)
{
r=0;
}
r%=2;
if(r==0)
{
P0=0xeb;
P1=0x00;
P2=0xff;
}while(1)
{
if(INT0==0|INT1==0|T0==0)
{
delay(2);
if(INT0==0|INT1==0|T0==0)
break;
}
};
}
}
void t1(void) interrupt 2 using 1 //interrupt 2
{
delay(2);
if(INT1==0)
{
r++;
if(r==2)
{
r=0;
}
r%=2;
if(r==0)
{
P0=0xdd;
P1=0x00;
P2=0xff;
}while(1)
{
if(INT1==0|INT0==0|T0==0)
{
delay(2);
if(INT1==0|INT0==0|T0==0)
break;
}
};
}
}
void t2(void) interrupt 1 using 1 //interrupt 3
{
TH0=0xff;
TL0=0xff;
delay(2);
if(T0==0)
{
P0=0xdb;
P1=0x00;
P2=0xff;
}while(1)
{
if(INT0==0|INT1==0)
{
delay(2);
if(INT0==0|INT1==0)
break;
}
};
}
void main(void)
{
TMOD=0x06;
TH0=0xff;
TL0=0xff;
TR0=1;
EA=1;
EX0=1;
EX1=1;
ET0=1;
while(1)
{
P0=0xeb;
for(h=28;h>0;h--)
{
for(s=248;s>0;s--)
{
P1=0x00;
P2=0xff;
P1=0x01;
P2=dis[h/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x02;
P2=dis[h%10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x04;
P2=dis[(h+2)/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x08;
P2=dis[(h+2)%10];
delay(1);
}
}
delay(248);
P0=0xf3;
for(h=3;h>0;h--)
{
delay(392);
P0=0xf3;
delay(1);
P1=0x00;
P2=0xff;
P1=0xaa;
P2=dis[(h-1)%10];
delay(600);
P0=0xfb;
}
delay(248);
P0=0xdd;
for(h=38;h>0;h--)
{
for(s=248;s>0;s--)
{
P1=0x00;
P2=0xff;
P1=0x01;
P2=dis[(h+2)/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x02;
P2=dis[(h+2)%10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x04;
P2=dis[h/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x08;
P2=dis[h%10];
delay(1);
}
}
delay(248);
P0=0xde;
for(h=3;h>0;h--)
{
delay(392);
P0=0xde;
delay(1);
P1=0x00;
P2=0xff;
P1=0xaa;
P2=dis[(h-1)%10];
delay(600);
P0=0xdf;
}
delay(248);
}
}
㈩ 51單片機交通燈電路圖與程序
網路文檔里我已經上傳,你可以去下載http://wenku..com/view/16a276c66137ee06eff918a8.html