NAME T3 ;I/O口擴展實驗一
PORT EQU 0CFA0H ;片選地址CS0
CSEG AT 0000H
LJMP START
CSEG AT 4100H
START: MOV A,#11H ;兩個紅燈亮,黃燈、綠燈滅
ACALL DISP ;調用273顯示單元(以下雷同)
ACALL DE3S ;延時3秒
LLL: MOV A,#12H ;東西路口綠燈亮;南北路口紅燈亮
ACALL DISP
ACALL DE10S ;延時10秒
MOV A,#10H ;東西路口綠燈滅;南北路口紅燈亮
ACALL DISP
MOV R2,#05H ;R2中的值為黃燈閃爍次數
TTT: MOV A,#14H ;東西路口黃燈亮;南北路口紅燈亮
ACALL DISP
ACALL DE02S ;延時0.2秒
MOV A,#10H ;東西路口黃燈滅;南北路口紅燈亮
ACALL DISP
ACALL DE02S ;延時0.2秒
DJNZ R2,TTT ;返回TTT,使東西路口;黃燈閃爍五次
MOV A,#11H ;兩個紅燈亮,黃燈、綠燈滅
ACALL DISP
ACALL DE02S ;延時0.2秒
MOV A,#21H ;東西路口紅燈亮;南北路口綠燈亮
ACALL DISP
ACALL DE10S ;延時10秒
MOV A,#01H ;東西路口紅燈亮;南北路口綠燈滅
ACALL DISP
MOV R2,#05H ;黃燈閃爍五次
GGG: MOV A,#41H ;東西路口紅燈亮;南北路口黃燈亮
ACALL DISP
ACALL DE02S ;延時0.2秒
MOV A,#01H ;東西路口紅燈亮;南北路口黃燈滅
ACALL DISP
ACALL DE02S ;延時0.2秒
DJNZ R2,GGG ;返回GGG,使南北路口;黃燈閃爍五次
MOV A,#03H ;兩個紅燈亮,黃燈、綠燈滅
ACALL DISP
ACALL DE02S ;延時0.2秒
JMP LLL ;轉LLL循環
DE10S: MOV R5,#100 ;延時10秒
JMP DE1
DE3S: MOV R5,#30 ;延時3秒
JMP DE1
DE02S: MOV R5,#02 ;延時0.2秒
DE1: MOV R6,#200
DE2: MOV R7,#126
DE3: DJNZ R7,DE3
DJNZ R6,DE2
DJNZ R5,DE1
RET
DISP: MOV DPTR,#PORT ;273顯示單元
CPL A
MOVX @DPTR,A
RET
END
你看看行不行 如果不行你自己再稍微改一下吧 反正大概就這些了
希望對你能有所幫助。
⑵ 求大神解答,用51單片機匯編語言實現一個紅綠燈的程序,不是一個路口的,大概注釋下就好
;------------------------------------
;程序實現功能
;西南北路口直行與轉彎交替通行,數碼管顯示直行通行倒計時,紅綠黃燈顯示包括人行道在內的道路交通狀態。
;某一方向道路擁擠時,可以人工控制調節東西南北方向通行時間。
;緊急情況時,各路口交通燈顯示紅燈,數碼管保持數據不變。
;工作寄存器及存儲單元分配
;1.工作寄存器
;R2設置為定時器定時中斷次數,R6、R7用於延時程序中的寄存器
;2.片內存儲單元
;30H、31H作為兩組數碼管顯示數據存儲單元;32H、33H作為交通燈初始狀態存儲單元;40H、41H作為交通燈顯示數據存儲單元
;3.標志位
;00H:南北通行標志位 ; 01H:東西通行標志位;02H:緊急事件標志位
;-----------------------------------
SNF EQU 00H ;;;南北通行標志位
EWF EQU 01H ;;;東西通行標志位
URF EQU 02H ;;;緊急事件標志位
ORG 0000H
LJMP MAIN ;;;上電轉主程序
ORG 000BH ;;;定時中斷入口
LJMP DSZD
ORG 0003H ;;;緊急中斷入口
LJMP URZD
ORG 0030H
MAIN: LCALL INIT ;;;調用初始化子程序
LOOP: LCALL DIS ;;;循環執行顯示子程序
AJMP LOOP
;///////////初始化程序
INIT: SETB SNF
SETB EWF
SETB URF
MOV R2,#20 ;;;定時器中斷20次為1s
MOV TMOD,#01H ;;;初始化定時器
MOV TL0,#0B0H
MOV TH0,#3CH
SETB EA ;;;開定時中斷與緊急中斷
SETB ET0
SETB TR0
SETB EX0
SETB IT0 ;;;設置中斷程式控制方式
MOV DPTR,#TAB ;;;數值首地址放入DPTR中
MOV 40H,#40 ;;;東南西北通行時間設置
MOV 41H,#40
MOV 30H,#40 ;;;通行時間初始化
MOV 31H,#60
MOV P0,#4CH ;;;初始化時南北通行並把交通燈狀態分別放在32H和33H中
MOV 32H,#4CH
MOV P2,#15H
MOV 33H,#15H
RET
;////////////顯示子程序
DIS: MOV P3,#0DFH ;;;選中南北方向的十位數碼管
MOV A,30H ;;;把顯示數據送人數碼管顯示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A ;;;
LCALL D1MS
MOV P3,#0EFH ;;;選中南北方向的個位數碼管
MOV A,B ;;;送入數碼管顯示
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#7FH ;;;選中第東西方向的十位數碼管
MOV A,31H ;;;送入數碼管顯示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#0BFH ;;;選中第東西方向的個位數碼管
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
SETB P3.0
SETB P3.1
JNB P3.0,DIS_S ;;;查詢是否第一個按鍵按下
JNB P3.1,DIS_E ;;;查詢是否第二個按鍵按下
AJMP DIS_R ;;;沒有鍵按下則返回
DIS_S:LCALL D5MS ;;;按鍵去抖
JNB P3.0,DIS_SN
AJMP DIS_R
DIS_SN:MOV 40H,#50 ;;;對通行時間從新分配,南北通行時間加長
MOV 41H,#30
AJMP DIS_R
DIS_E:LCALL D5MS ;;;按鍵去抖
JNB P3.1,DIS_EW
AJMP DIS_R
DIS_EW:MOV 40H,#30 ;;;東西通行時間加長
MOV 41H,#50
DIS_R:RET
;///////定時中斷處理程序
DS_C: LJMP DS_R ;;;接力跳轉
DSZD: PUSH ACC ;;;保護現場
PUSH PSW
CLR TR0 ;;;關定時器及中斷標志位並重新賦值
CLR TF0
MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R2,DS_C ;;;判斷1m時間是否到達
MOV R2,#20 ;;;到達重新賦值
DEC 30H ;;;南北方向通行時間減一
MOV A,30H ;;;把減一後的時間送入顯示存儲單元
;;;;;;;南北通行到達最後4秒時黃燈閃爍
DS_10:CJNE A,#4,DS_11 ;;;如果通行時間剩餘4秒
JNB SNF,DS_11 ;;;判斷是否是南北通行
MOV P0,#8AH
MOV 32H, #8AH ;;;把交通燈狀態存入存儲單元(後面類似)
DS_11:CJNE A,#3,DS_12 ;;;不是剩餘3秒,返回
JNB SNF,DS_12 ;;;不是南北通行時間,返回
MOV P0,#88H
MOV 32H, #88H
DS_12:CJNE A,#2,DS_13
JNB SNF,DS_13
MOV P0,#8AH
MOV 32H, #8AH
DS_13:CJNE A,#1,DS_14
JNB SNF,DS_14
MOV P0,#88H
MOV 32H, #88H
;------------------------
DS_14:JNZ DS_NE ;;;通行時間沒有結束轉向改變東西方向的數碼管
CPL SNF ;;;如果通行時間結束則對標志位取反
JNB SNF,DS_1 ;;;判斷是否南北通行
MOV 30H,40H ;;;是,點亮相應的交通燈
MOV P0,#4CH
MOV 32H,#4CH ;;;存儲交通燈狀態
MOV P2,#15H
MOV 33H, #15H ;;;存儲交通燈狀態
DS_NE:DEC 31H ;;;東西方向通行時間減一
MOV A,31H ;;;把通行剩餘時間送入顯示存儲單元
;;;;;;;;東西方向通行時間剩餘4秒鍾黃燈閃爍(程序注釋與南北方向類似 略)
DS_20:CJNE A,#4,DS_21
JB EWF,DS_21
MOV P0,#51H
MOV 32H, #51H
DS_21:CJNE A,#3,DS_22
JB EWF,DS_22
MOV P0,#41H
MOV 32H, #41H
DS_22:CJNE A,#2,DS_23
JB EWF,DS_23
MOV P0,#51H
MOV 32H, #51H
DS_23:CJNE A,#1,DS_24
JB EWF,DS_24
MOV P0,#41H
MOV 32H, #41H
;-----------------------------
DS_24:JNZ DS_R ;;;東西方向時間沒有結束,返回
CPL EWF ;;;對通行狀態取反
JNB EWF,DS_2 ;;;東西方向通行時間到來,跳轉
MOV 31H,#80 ;;;東西方向通行結束,重新顯示時間
MOV P0,#89H ;;;點亮相應的交通燈
MOV 32H, #89H
MOV P2,#29H
MOV 33H, #29H
AJMP DS_R
DS_1: MOV 30H,#80 ;;;南北通行時間結束,重新對顯示存儲單元賦值
MOV P0,#89H ;;;執行轉彎狀態1
MOV 32H, #89H
MOV P2,#26H
MOV 33H, #26H
AJMP DS_NE
DS_2: MOV 31H,41H ;;;東西方向開始通行,賦值予顯示存儲單元
MOV P0,#61H ;;;點亮相應的交通燈
MOV 32H, #61H
MOV P2,#15H
MOV 33H, #15H
DS_R: SETB TR0
POP PSW ;;;恢復現場
POP ACC
RETI
;/////////////緊急中斷處理程序
URZD: PUSH ACC ;;;保護現場
PUSH PSW
CLR IE0 ;;;清除中斷標志位
CLR TR0 ;;;關定時器
CPL URF ;;;緊急事件標志位
JB URF,UR_CON ;;;緊急結束;跳轉
MOV P0,#49H ;;;各路口燈全顯示紅燈亮
MOV P2,#15H
AJMP UR_R
UR_CON:SETB TR0 ;;;恢復正常交通
MOV A,32H
MOV P0,A
MOV A,33H
MOV P2,A
UR_R: POP PSW ;;;恢復現場
POP ACC
RETI
;////////////查表指令0,1,2,3,4,5,6,7,8,9
TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH
DB 7DH, 07H, 7FH, 6FH
;//////////延時5ms與1ms
D5MS: MOV R7,#5
D1MS: MOV R7,#10
MOV R6,#50
L1: DJNZ R6,$
DJNZ R7,L1
RET
⑶ 單片機編程 交通燈的控制(求wave軟體的程序源程序*.asm)
五、設計說明
1. 因為本設計是交通燈控制設計,所以要先了解實際交通燈的變化規律。假設一個十字路口為東西南北走向。初始狀態0為東西紅燈,南北紅燈,然後轉狀態l南北綠燈通車,東西紅燈;過一段時間轉狀態2,南北綠燈閃幾次轉亮黃燈,延時3秒,東西仍然紅燈;再轉狀態3,東西綠燈通車,南北紅燈;過一段時間轉狀態4,東西綠燈閃幾次轉亮黃燈,延時3秒,南北仍然紅燈;然後在循環至狀態1,依次類推。
2. 中斷服務程序的關鍵是:(1)保護進入中斷時的狀態,並在退出中斷之前恢復進入時的狀態。(2)必須在中斷程序中設定是否允許中斷重入。
ORG 0000H
AJMP MAIN
ORG 0003H
LJMP INT
ORG 0040H
MAIN:MOV SP,#60H
SETB EA
SETB EX0
SETB PX0
SETB IT0
MOV P1,#09H
ACALL DELAY1S
ABC:MOV R0,#3
MOV R1,#3
MOV P1,#0CH
ACALL DELAY1S
DEF:
CLR P1.2
ACALL DELAY2S
SETB P1.2
ACALL DELAY2S
DJNZ R0,DEF
MOV P1,#0AH
ACALL DELAY1S
MOV P1,#11H
ACALL DELAY1S
MOV P1,#21H
ACALL DELAY1S
GHI:CLR P1.5
ACALL DELAY2S
SETB P1.5
ACALL DELAY2S
DJNZ R1,GHI
MOV P1,#11H
AJMP ABC
INT: CLR EA
PUSH PSW
PUSH ACC
PUSH 05H
PUSH 06H
PUSH 07H
PUSH P1
SETB EA
MOV P1,#09H
ACALL DELAY1S
CLR EA
POP P1
POP 07H
POP 06H
POP 05H
POP ACC
POP PSW
SETB EA
RETI
DELAY1S:MOV R7,#5
DEL:MOV R6,#255
DE:MOV R5,#255
DJNZ R5,$;FOSC=6MHZ
DJNZ R6,DE
DJNZ R7,DEL
RET
DELAY2S:MOV R4,#250
DELL:MOV R3,#250
DJNZ R3,$;FOSC=6MHZ
DJNZ R4,DELL
RET
END
⑷ 單片機交通燈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;
}
=====================================================================
坐等拿分!
⑸ 80c51單片機交通燈程序
ORG 1000H
L:JNB P3.0,LP3
JNB P3.1,LP2 ;判斷p3.1,p3.0口
;如果P3.0為1的話,正常運行交通燈
;如果P3.1為1的話,正常運行交通燈
;如果P3.1為0的話,依次點亮燈
;如果P3.0為0的話,停止交通燈,只有黃燈閃爍
;正常運行交通燈
LP1:
MOV P1,#61H
CLR P3.2
CLR P3.3
CLR P3.4
SETB P3.5 ;1,3 路口紅燈亮,2,4 路口綠燈亮
LCALL DELAY1
MOV B,#04H ;設置循環次數為4次
M:MOV P1,#51H
CLR P3.5
SETB P3.4 ;1,3路口紅燈亮,2,4路口黃燈亮
LCALL DELAY2
MOV P1,#41H
CLR P3.4 ;1,3路口紅燈亮,2,4路口黃燈滅
LCALL DELAY2
DJNZ B,M
MOV P1,#0CH
SETB P3.2
SETB P3.3 ;1,3路口綠燈亮,2,4路口紅燈亮
LCALL DELAY1
MOV B,#04H
N:MOV P1,#8AH
CLR P3.2 ;1,3路口黃燈亮,2,4路口紅燈亮
LCALL DELAY2
MOV P1,#08H ;1,3路口黃燈滅,2,4路口紅燈亮
LCALL DELAY2
DJNZ B,N
AJMP L
;黃燈閃
LP3: CLR P1.7
CLR P3.2
CLR P3.3
CLR P3.5
MOV P1,#92H
SETB P3.4 ;黃燈亮,其他的燈滅
LCALL DELAY2
MOV P1,#00H
CLR P3.4 ;所有的黃燈滅
LCALL DELAY2
AJMP L
;循環亮
LP2: CLR P3.2
CLR P3.3
CLR P3.4
CLR P3.5
MOV A,#01H ;賦初值
MOV R0,#08 ;循環變數,循環7次,控制7個燈
LOOP: MOV P1,A ;點亮第一個燈
LCALL DELAY2 ;延遲
RL A ;A的值加1,循環左移
DJNZ R0,LOOP ;RO的值減1不等於1則執行LOOP標號
SETB P3.2 ;P3.2燈亮
LCALL DELAY2 ;延遲
CLR P3.2 ;P3.2燈滅
SETB P3.3 ;下一個燈P3.3亮
LCALL DELAY2 ;延遲
CLR P3.3 ;P3.3燈滅
SETB P3.4 ;下一個燈P3.3亮
LCALL DELAY2 ;延遲
CLR P3.4 ;P3.4燈滅
SETB P3.5 ;P3.5燈亮
LCALL DELAY2 ;延遲
AJMP L
;延遲1
DELAY1 :
MOV R3,#200
DEL1: MOV R4,#250
DEL2: MOV R5,#50
DEL3: NOP ;空操作
DJNZ R5,DEL3
DJNZ R4,DEL2
DJNZ R3,DEL1 ;延長5秒
RET
;延遲2
DELAY2 :
DEL4: MOV R3,#200
DEL5: MOV R4,#200
DEL6: NOP
DJNZ R4,DEL6
DJNZ R3,DEL5 ;延遲0.08秒
RET
END
⑹ 單片機交通燈程序
採用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
⑺ 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>
#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;
}
}
}
}