① 模擬交通燈套件一直閃爍
按鍵進入深夜模式四個方向黃燈閃爍提示車輛注意來往車輛,還可以通過按鍵調節綠燈通行的時間。
套件是基於51單片機的交通燈模擬設計,通過對單片機編程,控制數碼管顯示和LED亮滅的變化。有深夜模式,按鍵進入深夜模式四個方向黃燈閃爍提示車輛注意來往車輛,還可以通過按鍵調節綠燈通行的時間。本電路使用一個51單片機,結合一個2位數碼管和三色LED燈,模擬現實十字路口交通燈的工作狀態完成不同信號指示燈的亮滅燈及倒計時功能。另外可通過按鍵設置,使得倒計時的時間加減可調以及切換不同特定情況下的工作模式。按鍵1為交通燈深夜模式開/關,按下後進入深夜模式,4個方向LED(黃)閃爍,再次按下後則退出深夜模式,交通燈正常運行。按鍵2為調整時間開/關,上電後,交通燈正常運行,按下此按鍵後,進入調時模式,此時按鍵3和4均有效,按鍵3為通行時間加,按鍵4通行時間減。設定好通行時間後,按鍵2 再次按下,退出調時模式。交通燈按照您調整好的時間開始正常運行。正常運行時,按鍵3 和 按鍵4 均無效。
② 基於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/
③ 單片機設計急救車優先的交通燈控制
ORG 0000H
LJMP STAR
STAR:MOV P1,#00H
MOV P0,#0FFH
MOV P3,#00H
setb p1.6
L1:CLR P1.7
JB P1.0 , WAN ;;判斷方式轉換
;;MOV P3,#00H ;;P3口清零
SETB P3.2 ;;主幹綠燈
SETB P3.3 ;;次道紅燈
MOV 31H,#03CH ;;付初值60秒
MOV R4,#03CH
L2 :CALL DIS1 ;;調用顯示
CALL YS
clr p1.6
DEC R4 ;;減一
DJNZ 31H,L2 ;;判斷是否計數完成
CLR P3.2 ;;主黃燈亮
CLR P3.3
SETB P3.1
mov 32H,#05H
MOV R4 ,#05H
L3:
setb p3.3
CALL DIS1 ;;調用顯示
CALL YS
DEC R4
CLR p3.3
DJNZ 32H,L3
CLR P3.1
CLR P3.4
SETB P3.0
SETB P3.5
mov 33H ,#020H ;;主幹紅燈 次道綠燈20秒
MOV R4,#02DH
setb p1.6
L4 :
CALL DIS1
CALL YS
clr p1.6
DEC R4
DJNZ 33H,L4
CLR P3.2 ;;次道黃燈亮5秒鍾
CLR P3.5
setb p3.4
mov 34h,#05h
MOV R4 ,#05H
L8:setb p3.0
CALL DIS1
CALL YS
clr p3.0
CALL DIS1
CALL YS
setb p3.0
clr p3.0
DEC R4
DJNZ 34H,L8
LJMP L1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wan:SETB P1.7
JB P1.0 , L1 ;;判斷方式轉換
MOV P3,#00H ;;P3口清零
SETB P3.2 ;;主幹綠燈
SETB P3.3 ;;次道紅燈
MOV 31H,#040D ;;付初值60秒
MOV R4,#040D
L12 :CALL DIS1 ;;調用顯示
CALL YS
DEC R4 ;;減一
DJNZ 31H,L12 ;;判斷是否計數完成
CLR P3.2 ;;主黃燈亮
CLR P3.3
SETB P3.1
mov 32H,#05H
MOV R4 ,#05H
L13: CALL DIS1
CALL YS
setb p3.3
CALL DIS1
CALL YS
DEC R4
CLR p3.3
DJNZ 32H,L13
CLR P3.1
CLR P3.4
SETB P3.0
SETB P3.5
mov 33H ,#010H ;;主幹紅燈 次道綠燈20秒
MOV R4,#010H
L14 :CALL DIS1
CALL YS
CALL DIS1
DEC R4
DJNZ 33H,L14
CLR P3.2 ;;次道黃燈亮5秒鍾
CLR P3.5
setb p3.4
mov 34h,#05h
MOV R4 ,#05H
L18:setb p3.0
CALL DIS1
CALL YS
clr p3.0
CALL DIS1
CALL YS
setb p3.0
clr p3.0
DEC R4
DJNZ 34H,L18
LJMP WAN
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
YS: MOV 72H,#80D
LOOP3:MOV 71H,#100D
LOOP1:MOV 70H,#22D
LOOP0:DJNZ 70H,LOOP0
DJNZ 71H,LOOP1
MOV 70H,#46D
LOOP2:DJNZ 70H,LOOP2
DJNZ 72H,LOOP3
MOV 70H,#48D
LOOP4:DJNZ 70H,LOOP4
RET
Dis1: mov A,r4
mov B,#10D
div AB
lcall SEG7
CLR P2.0
mov P0,A
lcall DLY
mov A,B
lcall SEG7
SETB P2.0
mov P0,A
lcall DLY
RET
SEG7: MOV DPTR,#TAB
movc A,@A+DPTR
RET
TAB:DB 03FH,006H,05BH,04FH,066H
DB 06DH,07DH,007H, 07FH,06Fh
DLY:
mov R7,#2D
D1: mov R6,#249D
DJNZ R6,$
DJNZ R7,D1
RET
④ 單片機開發板的燈總是閃爍怎麼回事
1、單片機裡面沒有任何程序或雜亂的數據,有可能閃爍,這是由於單片機總是自動復位造成的。
2、單片機有程序控制LED閃爍。
3、開發板有問題,比如電源不穩,其他硬體毛病等,閃爍也可能發生。
⑤ 單片機交通燈程序
採用51單片機作為系統的MCU,基本完成控制兩組交通指示燈交替亮
每個街口有左拐、直行及行人三種指示燈。直行燈每個燈有紅、黃、綠三種顏色。自行車與汽車共用左拐和直行燈。
首先東西向直行綠燈和行人燈亮1分鍾,左轉燈亮30秒,黃燈亮5秒(同時南北向紅燈亮95秒),然後東西向紅燈亮95秒鍾(同時首先南北向直行綠燈和行人燈亮1分鍾,左轉燈亮30秒,黃燈亮5秒),然後東西向的綠燈亮,依次類推。
每次綠燈亮的時候,對應的行人燈亮。
60S/30S/5S/60S/30S/5S
東西道
綠和行人/左轉/黃/紅/紅/紅
南北道
紅/紅/紅/綠和行人/左轉/黃
行人燈亮的時候有聲音提示盲人能通過。
突發交通事故的時候能夠緊急全紅燈。
在有重要人物通過的時候能手動改為綠燈。
ORG 0000H ;主程序的入口地址
LJMP MAIN ;跳轉到主程序的開始處
ORG 0003H ;外部中斷0的中斷程序入口地址
ORG 000BH ;定時器0的中斷程序入口地址
LJMP T0_INT ;跳轉到中斷服務程序處
ORG 0013H ;外部中斷1的中斷程序入口地址
MAIN : MOV SP,#50H
MOV IE,#8EH ;CPU開中斷,允許T0中斷,T1中斷和外部中斷1中斷
MOV TMOD,#51H ;設置T1為計數方式,T0為定時方式,且都工作於模式1
MOV TH1,#00H ;T1計數器清零
MOV TL1,#00H
SETB TR1 ;啟動T1計時器
SETB EX1 ;允許INT1中斷
SETB IT1 ;選擇邊沿觸發方式
MOV DPTR ,#0003H
MOV A, #80H ;給8255賦初值,8255工作於方式0
MOVX @DPTR, A
AGAIN: JB P3.1,N0 ;判斷是否要設定東西方向紅綠燈時間的初值,若P3.1為1 則跳轉
MOV A,P1
JB P1.7,RED ;判斷P1.7是否為1,若為1則設定紅燈時間,否則設定綠燈時間
MOV R0,#00H ;R0清零
MOV R0,A ;存入東西方向綠燈初始時間
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
RED: MOV A,P1
ANL A,#7FH ;P1.7置0
MOV R7,#00H ;R7清零
MOV R7,A ;存入東西方向紅燈初始時間
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
;----------------------------------
N0: SETB TR0 ;啟動T0計時器
MOV 76H,R7 ;紅燈時間存入76H
N00: MOV A,76H ;東西方向禁止,南北方向通行
MOV R3,A
MOV DPTR,#0000H ;置8255A口,東西方向紅燈亮,南北方向綠燈亮
MOV A,#0DDH
MOVX @DPTR, A
N01: JB P2.0,B0
N02: SETB P3.0
CJNE R3,#00H,N01 ;比較R3中的值是否為0,不為0轉到當前指令處執行
;------黃燈閃爍5秒程序------
N1: SETB P3.0
MOV R3,#05H
MOV DPTR,#0000H ;置8255A口,東西,南北方向黃燈亮
MOV A,#0D4H
MOVX @DPTR,A
N11: MOV R4,#00H
N12: CJNE R4,#7DH,$ ;黃燈持續亮0.5秒
N13: MOV DPTR,#0000H ; 置8255A口,南北方向黃燈滅
MOV A,#0DDH
MOVX @DPTR,A
N14: MOV R4,#00H
CJNE R4,#7DH,$ ;黃燈持續滅0.5秒
CJNE R3,#00H,N1 ;閃爍時間達5秒則退出
;-----------------------------------
N2: MOV R7,#00H
MOV A,R0 ;東西通行,南北禁止
MOV R3,A
MOV DPTR,#0000H ; 置8255A口,東西方向綠燈亮,南北方向紅燈亮
MOV A,#0EBH
MOVX @DPTR,A
N21: JB P2.0,T03
N22: CJNE R3,#00H,N21
;------黃燈閃爍5秒程序------
N3: MOV R3,#05H
MOV DPTR,#0000H ;置8255A口,東西,南北方向黃燈亮
MOV A,#0E2H
MOVX @DPTR,A
N31: MOV R4,#00H
CJNE R4,#7DH,$ ;黃燈持續亮0.5秒
N32: MOV DPTR,#0000H ; 置8255A口,南北方向黃燈滅
MOV A,#0EBH
MOVX @DPTR,A
N33: MOV R4,#00H
CJNE R4,#7DH,$ ;黃燈持續滅0.5秒
CJNE R3,#00H,N3 ;閃爍時間達5秒則退出
SJMP N00
;------闖紅燈報警程序------
B0: MOV R2,#03H ;報警持續時間3秒
B01: MOV A,R3
JZ N1 ;若倒計時完畢,不再報警
CLR P3.0 ;報警
CJNE R2,#00H,B01 ;判斷3秒是否結束
SJMP N02
;------1秒延時子程序-------
N7: RETI
T0_INT:MOV TL0,#9AH ;給定時器T0送定時10ms的初值
MOV TH0,#0F1H
INC R4
INC R5
CJNE R5,#0FAH,T01 ;判斷延時是否夠一秒,不夠則調用顯示子程序
MOV R5,#00H ;R5清零
DEC R3 ;倒計時初值減一
DEC R2 ;報警初值減一
T01: ACALL DISP ;調用顯示子程序
RETI ;中斷返回
;------顯示子程序------
DISP: JNB P2.4,T02
DISP1: MOV B,#0AH
MOV A,R3 ;R3中值二轉十顯示轉換
DIV AB
MOV 79H,A
MOV 7AH,B
DIS: MOV A,79H ;顯示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS2: MOV A,7AH ;顯示個位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
RET
;------東西方向車流量檢測程序------
T03: MOV A,R3
SUBB A,#00H ;若綠燈倒計時完畢,不再檢測車流量
JZ N3
JB P2.0,T03
INC R7
CJNE R7,#64H,E1
MOV R7,#00H ;中斷到100次則清零
E1: SJMP N22
;------東西方向車流量顯示程序------
T02: MOV B,#0AH
MOV A,R7 ;R7中值二轉十顯示轉換
DIV AB
MOV 79H,A
MOV 7AH,B
DIS3: MOV A,79H ;顯示十位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0F7H
MOVX @DPTR,A
LCALL DELAY
DS4: MOV A,7AH ;顯示個位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
LJMP N7
;------延時4MS子程序----------
DELAY: MOV R1,#0AH
LOOP: MOV R6,#64H
NOP
LOOP1: DJNZ R6,LOOP1
DJNZ R1,LOOP
RET
;------字元表------
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
⑥ 單片機控制的交通燈
題目 交通燈控制系統的設計 一、課程設計的目的與要求 1、課程設計目的: (1)進一步理解和消化書本知識,運用所學知識和技能進行簡單的設計。 (2)通過課程設計提高應用能力,分析問題和解決問題的能力。 (3)培養查閱資料的習慣,訓練和提高自學,獨立思考的能力。 2、課程設計要求 交通燈控制系統的設計 1) 掌握在單片機系統中擴展簡單I/O介面的方法。 2) 掌握數據輸出程序的設計方法。 3) 掌握模擬交通燈控制的實現方法。 4) 掌握外部中斷技術的基本使用方法。 5) 掌握中斷處理程序的編程方法。 從課程設計的目的出發,通過設計工作的各個環節,達到以下要求: (1)能夠正確理解課程設計的題目和意義,全面思考問題。 (2)運用科學合理的方法,認真按時完成。 二、課程設計課題的分析 1、電路的設計 1)原理 要完成本實驗,首先必須了解交通燈的亮滅規律。本實驗需要用到試驗箱上八個發光二極體中的六個,即紅、綠、黃各兩個。將L1(紅)、L2(綠)、L3(黃)作為東西方向的指示燈,將L5(紅)、L6(綠)、L7(黃)作為南北方向的指示燈。交通燈的亮滅規律為:初始態是兩個路口的紅燈全亮,之後,東西路口的綠燈亮,南北路口的紅燈亮,東西方向通車,延時一段時間後,東西路口綠燈滅,黃燈開始閃爍。閃爍若干次後,東西路口紅燈亮,而同時南北路口的綠燈亮,南北方向開始通車,延時一段時間後,南北路口的綠燈滅,黃燈開始閃爍。閃爍若干次後,再切換到東西路口方向,重復上述過程。 各發光二極體的陽極通過保護電阻接到+5V的電源上,陰極接到輸入端上,因此使其點亮使相應使相應輸入端為低電平。 當有急救車到達時,兩個方向上的紅燈亮,以便讓急救車通過,假設急救車通過路口的時間為10秒,急救車通過後,交通燈恢復中斷前的狀態。本程序以單次脈沖為中斷申請,表示有急救車通過,單次脈沖輸出端P-接CPU板上的INT0。 2)、硬體電路圖 圖1—1 交通燈控制系統的硬體接線圖 74LS273的輸出00—07接發光二極體L1—L8,74LS273的片選CS273接片選信號CS2,此時74LS273的片選地址為CFA0—CFA7之間任選。 3)、程序流程圖 主程序流程 圖1—2 主程序軟體流程圖 中斷程序流程圖 三、課程設計的結果 1、程序 NAME JIAOTONGGENG OUTPORT EQU 0CFB0H ;埠地址 SAVE EQU 55H ;SAVE保存從埠CFA0輸出的數據 CSEG AT 0000H LJMP START CSEG AT 4003H LJMP INT CSEG AT 4100H START: SETB IT0 ;中斷程序初始化 SETB EX0 SETB EA MOV A,#11H ;置首顯示碼,兩紅燈全亮 MOV SAVE,A ;保存 ACALL DISP ;顯示輸出 ACALL DE3S ;延時3秒 LLL: MOV A,#12H ;東西路口綠燈亮,南北路口紅燈亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延時10秒 MOV A,#10H ;東西路口綠燈滅 MOV SAVE,A ACALL DISP MOV R2,#05H ;東西路口黃燈閃爍5次 TTT: MOV A,#14H MOV SAVE,A ACALL DISP ACALL DE02S ;延時0.2秒 MOV A,#10H MOV SAVE,A ACALL DISP ACALL DE02S DJNZ R2,TTT MOV A,#11H ;紅燈全亮 MOV SAVE,A ACALL DISP ACALL DE02S ;延時0.2秒 MOV A,#21H ;東西路口紅燈亮,南北路口綠燈亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延時10秒 MOV A,#01H ;南北路口綠燈滅 MOV SAVE,A ACALL DISP MOV R2
⑦ 交通燈 C語言 單片機。中斷函數問題
參考《51單片機C語言創新教程》溫子祺等著。
源碼轉自:《51單片機C語言創新教程》。
/*實驗名稱:交通燈實驗
*描述:交通燈實驗要求紅燈亮15秒,綠燈亮10秒,黃燈亮5秒,
當紅燈切換為綠燈或者綠燈切換為紅燈,
要實現燈閃爍。紅燈、綠燈、黃燈的點亮持續時間可以通過串口來修改,
並在下一個循環中更新數值。
*作者:溫子祺
*修改日期:2010/5/4
*說明:代碼注釋與講解詳見《51單片機C語言創新教程》溫子祺等著,北京航空航天大學出版社
*/
#include"stc.h"
typedefunsignedcharUINT8;
typedefunsignedint UINT16;
typedefunsignedlongUINT32;
typedefcharINT8;
typedefintINT16;
typedeflongINT32;
#defineTIMER0_INITIAL_VALUE5000
#defineHIGH1
#defineLOW0
#defineON1
#defineOFF0
#defineSEG_PORTP0
#defineLS164_DATA(x){if((x))P0_4=1;elseP0_4=0;}
#defineLS164_CLK(x){if((x))P0_5=1;elseP0_5=0;}
#defineNORTH_R_LIGHT(x){if((x))P2_0=0;elseP2_0=1;}
#defineNORTH_Y_LIGHT(x){if((x))P2_1=0;elseP2_1=1;}
#defineNORTH_G_LIGHT(x){if((x))P2_2=0;elseP2_2=1;}
#defineSOUTH_R_LIGHT(x){if((x))P2_3=0;elseP2_3=1;}
#defineSOUTH_Y_LIGHT(x){if((x))P2_4=0;elseP2_4=1;}
#defineSOUTH_G_LIGHT(x){if((x))P2_5=0;elseP2_5=1;}
#defineTRAFFIC_STATUS_10
#defineTRAFFIC_STATUS_21
#defineTRAFFIC_STATUS_32
#defineUART_MARKER0xEE
UINT8Timer0IRQEvent=0;
UINT8Time1SecEvent=0;
UINT8Time500MsEvent=0;
UINT8TimeCount=0;
UINT8SegCurPosition=0;
UINT8LightOrgCount[4]={15,5,15,5};
UINT8LightCurCount[4]={15,5,15,5};
UINT8TrafficLightStatus=0;
codeUINT8SegCode[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
UINT8SegBuf[4]={0};
codeUINT8SegPosition[4]={0x07,0x0b,0x0d,0x0e};
typedefstruct_LIGHT_VAL
{
UINT8Head;
UINT8val[4];
}LIGHT_VAL;
typedefunion_LIGHT_VAL_EX
{
LIGHT_VALlv;
UINT8p[5];
}LIGHT_VAL_EX;
voidLS164Send(UINT8byte)
{
UINT8j;
for(j=0;j<=7;j++)
{
if(byte&(1<<(7-j)))
{
LS164_DATA(HIGH);
}
else
{
LS164_DATA(LOW);
}
LS164_CLK(LOW);
LS164_CLK(HIGH);
}
}
voidRefreshDisplayBuf(UINT8s1) //刷新顯示緩存
{
SegBuf[0]=s1%10;
SegBuf[1]=s1/10;
SegBuf[2]=s1%10;
SegBuf[3]=s1/10;
}
voidSegDisplay(void)
{
UINT8t;
t=SegCode[SegBuf[SegCurPosition]];
SEG_PORT|=0x0f;
LS164Send(t);
SEG_PORT=(SEG_PORT|0x0f)&SegPosition[SegCurPosition];
if(++SegCurPosition>=4)
{
SegCurPosition=0;
}
}
voidTimerInit(void)
{
TH1=0;
TL1=0;
TH0=(65536-TIMER0_INITIAL_VALUE)/256;
TL0=(65536-TIMER0_INITIAL_VALUE)%256;//定時1MS
TMOD=0x51; /*01010001T1計數,T0定時*/
}
voidTimer0Start(void)
{
TR0=1; //啟動計時器1
ET0=1;
}
voidTimer0Stop(void)
{
TR0=0; //啟動計時器1
ET0=0;
}
voidPortInit(void)
{
P0=P1=P2=P3=0xFF;
}
voidUartInit(void)
{
SCON=0x40;
T2CON=0x34;
RCAP2L=0xD9;
RCAP2H=0xFF;
REN=1;
ES=1;
}
voidUartSendByte(UINT8byte)
{
SBUF=byte;
while(TI==0);
TI=0;
}
voidUartPrintfString(INT8*str)
{
while(str&&*str)
{
UartSendByte(*str++);
}
}
voidmain(void)
{
UINT8i=0;
PortInit();
TimerInit();
Timer0Start();
UartInit();
RefreshDisplayBuf(LightCurCount[0]);
EA=1;
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON);
while(1)
{
if(Timer0IRQEvent)
{
Timer0IRQEvent=0;
TimeCount++;
if(TimeCount>=200)
{
TimeCount=0;
if(LightCurCount[0])
{
TrafficLightStatus=0;
}
elseif(LightCurCount[1])
{
TrafficLightStatus=1;
}
elseif(LightCurCount[2])
{
TrafficLightStatus=2;
}
elseif(LightCurCount[3])
{
TrafficLightStatus=3;
}
else
{
for(i=0;i<4;i++)
{
LightCurCount[i]=LightOrgCount[i];
}
TrafficLightStatus=0;
}
switch(TrafficLightStatus)
{
case0:
{
NORTH_R_LIGHT(ON);
SOUTH_R_LIGHT(OFF);
NORTH_G_LIGHT(OFF);
SOUTH_G_LIGHT(ON);
NORTH_Y_LIGHT(OFF);
SOUTH_Y_LIGHT(OFF);
}
break;
case1:
{
if(LightCurCount[1]%2)
{
NORTH_R_LIGHT(ON);
SOUTH_G_LIGHT(ON);
}
else
{
NORTH_R_LIGHT(OFF);
SOUTH_G_LIGHT(OFF);
}
NORTH_Y_LIGHT(ON);
SOUTH_Y_LIGHT(ON);
}
break;
case2:
{
NORTH_R_LIGHT(OFF);
SOUTH_R_LIGHT(ON);
NORTH_G_LIGHT(ON);
SOUTH_G_LIGHT(OFF);
NORTH_Y_LIGHT(OFF);
SOUTH_Y_LIGHT(OFF);
}
break;
case3:
{
if(LightCurCount[3]%2)
{
NORTH_G_LIGHT(ON);
SOUTH_R_LIGHT(ON);
}
else
{
NORTH_G_LIGHT(OFF);
SOUTH_R_LIGHT(OFF);
}
NORTH_Y_LIGHT(ON);
SOUTH_Y_LIGHT(ON);
}
break;
default:break;
}
RefreshDisplayBuf(LightCurCount[TrafficLightStatus]);
LightCurCount[TrafficLightStatus]--;
}
SegDisplay();
}
}
}
voidUartIRQ(void)interrupt4
{
staticUINT8cnt=0;
staticLIGHT_VAL_EXLightValEx;
if(RI)
{
RI=0;
LightValEx.p[cnt++]=SBUF;
if(LightValEx.lv.Head==UART_MARKER)
{
if(cnt>=5)
{
for(cnt=1;cnt<5;cnt++)
{
LightOrgCount[cnt-1]=LightValEx.lv.val[cnt];
LightCurCount[cnt-1]=LightValEx.lv.val[cnt];
}
cnt=0;
UartPrintfString("設置交通燈完成 ");
}
}
else
{
cnt=0;
}
}
}
voidTimer0IRQ(void)interrupt1
{
ET0 =0;
TH0=(65536-TIMER0_INITIAL_VALUE)/256;
TL0=(65536-TIMER0_INITIAL_VALUE)%256;//定時1MS
Timer0IRQEvent=1;
ET0 =1;
}
=====================================================================
坐等拿分!
⑧ 急單片機交通燈程序修改~高手請進
及在學的學生自行設計和製造中檔的、有市場競爭力的廣泛產品,就是在提高民族的整體素質,這就是古人曰;取法乎上,僅得乎中;你們看高考狀元、博士後、博導的效力更高嗎?空談創新、轉型是浪費社會資源,糟蹋學生的寶貴青春時光,毀掉他們的前程,在發達國家和跨國公司面前抬不起頭。做硬體非常地花費時間,費錢,沒有幾十年的連續不間斷歷練,沒有財政支持,沒有生產實踐驗證,沒有商業實戰建議,是空談,而能走出來的人是十分稀少的,一個是淘汰率高,一個是沒有金錢和時間支持,更重要的,是許許多多人,到了生命終了,都不知道自己錯在哪裡?什麼沒有做好?根本上就不知道在當時的歷史條件、環境約束下,最佳的做法是什麼?還是科科優秀,考個高考狀元來的實惠,有說服力!!!就業是壓倒一切的首要任務,是人類生存的根本!!!政府應該給窮人錢嗎?應該公開科技館展品的全部設計、加工、調整、部件采購地點資料,授人以漁,提高全民族、全體國民的素質。現在的教材都是一大抄,現在都時興系統集成,高科技裝配工,用錢砸就可以了。國家的戰略機密當然要嚴格保密, 商業機密由受益者保護。
國外用社會資源完成的學術研究,一般是完全公開。 中國的許多用國家資源完成的研究,應該公開,高等院校的教材和實驗書籍應該公開,否則加劇學術腐敗!這是對使用國家和社會資源負責的體現。 在中國,知識公有化,實質內容和技術手段競爭公開化,實際裝置可以在第三者免費復制,技術指標可以由獨立的第三者測量、公開性能比較數據、指標,是徹底提升基礎教育跨過久攻不克門檻的唯一途徑,國家應該支付相關費用;這不是抄襲所能替代的。 本人在25年前設計的下一代鍵盤,因為沒有專利申請資助,沒有實驗室,在幾個行業中內部已經無償公開。向科技博物館、科普展覽館提供創新展項,公開所有設計、采購、加工、調試、維修資料,提高全國國民的基礎素質。誰能給我講講70 80年代的事啊 要貼近生活的,講講老一輩人的經歷就行70年代教材、工業設備、技術革新資料完全公開,全國相互學習,毫無保留地各地交流,原材料、設備利用率最高,從各種機床、汽車、線切割機、電火花加工機床、水泵、內燃機、電動機、鍾表、自行車、燈具等等的零配件全國通用、互換性好,基礎圖紙公開,全國統一設計DDZ儀表、全國統一設計N1鍾芯等等。80年代
⑨ 急求單片機設計《急救車優先的交通燈控制》
/*沒有使用中斷,硬體包括單片機、電源、晶振、復位電路、六個led燈、一個開關。單片機使用11.0592M晶振*/
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitsw=P3^3;//模擬救護車的開關
uintx;
voiddelay10ms()
{
uinti;
for(i=120;i>0;i--)//改變i的初值以改變各狀態轉變間隔時間,使用時改為1200
{;;}
}
voiddelays()
{
uintz;
for(z=2000;z>0;z--)
delay10ms();
}
voidamb(uchardat,uchartc)
{
x=tc*100;
while(x>0)
{
if(sw==0)
{
P1=0xf6;
delays();
P1=dat;
}
delay10ms();
x--;
}
}
/*綠燈沒有閃爍,黃燈直接亮了,P1^0至P1^5依次連接南北方向的紅、黃、綠燈和東西方向的紅、黃、綠燈(led)。*/
voidmain()
{
P1=0xf6;
delays();
while(1)
{
P1=0xf3;
amb(0xf3,20);
P1=0xf5;
amb(0xf5,4);
P1=0xde;
amb(0xde,20);
P1=0xee;
amb(0xee,4);
}
}
至於Proteus的模擬,我以前沒用過,畫出來的圖軟體提示錯誤,我就不弄了。同學你也是電相關專業的吧,應該做得出來。該程序我在單片機實驗板上測試過,沒問題,模擬的救護車通過後各燈回到救護車到來時的狀態。除了綠燈不會閃,時間不是很准確,大致符合要求了。
⑩ 單片機交通燈LED動態顯示,黃燈閃爍延時
很容易改,提示你一下。延時程序改為定時器延時,你要設置一秒鍾的中斷。在中斷中加入 DEC R2這一句,使中斷一次自動減一。
動態顯示也很簡單,主要修改的就是你的 顯示子程序。
XS: MOV B,#0AH;拆分數顯
MOV A,R2
DIV AB;十位存A,個位存B
MOV DPTR ,#TAB;將表TAB存入DPTR寄存器。
MOVC A,@A+DPTR;將A和DPTR相加作為地址,並把地址中對應的值賦予A
setb p2.0
MOV P0,A;將A的值經過P0口輸出。
MOV A,B;將B的值賦予A
MOVC A,@A+DPTR;將A和DPTR相加作為地址,把地址中對應的值賦予A
clr p2.0
MOV P0,A;將A的值經過P2口輸出
RET
兩個數碼管都接PO口,。P2.0出來的線分兩根一根接一個非門然後接一個數碼管的公共端。另一根直接接另外一個數碼管的公共端。