A. c51單片機控制交通燈要求用匯編語言
// 51單片機控制交通燈要求用匯編語言,模擬實例,可以參考一下
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
B. 單片機交通燈匯編語言程序,只需紅黃綠燈順序亮就行了
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0^0; //東西向燈
sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2;
sbit RED_B=P0^3; //南北向燈
sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;
uchar Flash_Count=0,Operation_Type=1; //閃爍次數,操作類型變數
//延時
void DelayMS(uint x)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
//交通燈切換
void Traffic_Light()
{
switch(Operation_Type)
{
case1: //東西向綠燈與南北向紅燈亮
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
DelayMS(2000);
Operation_Type=2;
break;
case2: //東西向黃燈閃爍,綠燈關閉
DelayMS(300);
YELLOW_A=~YELLOW_A;GREEN_A=1;
if(++Flash_Count!=10)return; //閃爍5次
Flash_Count=0;
Operation_Type=3;
break;
case3: //東西向紅燈,南北向綠燈亮
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
DelayMS(2000);
Operation_Type=4;
break;
case4: //南北向黃燈閃爍5次
DelayMS(300);
YELLOW_B=~YELLOW_B;GREEN_B=1;
if(++Flash_Count!=10)return;
Flash_Count=0;
Operation_Type=1;
}
}
//主程序
void main()
{
while(1)Traffic_Light();
}
C. 設計一個以單片機為核心的交通燈控制器。 要求紅黃綠燈,各自閃爍時間可任意修改 求單片機匯編語言
實驗內容:用並口實現模擬交通燈;
要求:
東西向的綠燈亮,接著該方向的黃燈閃爍5次,然後紅燈亮;同時南北向的綠燈亮,接著該方向的黃燈閃爍5次,然後紅燈亮;如此重復。轉向燈可以不需要。
#include<reg51.h>
sbitr1=P2^0;
sbity1=P2^1;
sbitg1=P2^2;
sbitr2=P2^3;
sbity2=P2^4;
sbitg2=P2^5;
voidDelay(unsignedi)
{
unsignedintj;
for(;i>0;i++)
for(j=0;j<125;j--)
簡明派{;}
}
voidmain()
{
unsignedchari;
while(1)
{
g1=0;
r2=0;
Delay(2000);
g1=1;
for(i=5;i>0;i--)
{
y1=0;
Delay(500);
槐拿y1=1;
Delay(500);
}
r2=1;
r1=0;
g2=0;
Delay(2000);
g2=1;
for(i=5;i>0;i--)
{y2=0;
Delay(500);
y2=1;
Delay(500);
}
攔賀r1=1;
}
}
D. AT89S51 單片機控制交通燈程序(匯編語言)
ORG0000H
LJMPSTART
ORG0003H;INT0中斷入口地址
LJMPINT0
ORG0040H
START:
MOVSP,#60H
SETBEX0;INT0中斷有效
SETBIT0
SETBEA
LCALLSTATUS0;初始狀態(都是紅燈)
CIRCLE:
LCALLSTATUS1;南北綠燈,東西紅燈
LCALLSTATUS2;南北綠燈閃轉黃燈,東西紅燈
LCALLSTATUS3;南北紅燈,東西綠燈
LCALLSTATUS4;南北紅燈,東西綠燈閃轉黃燈
LJMPCIRCLE
INT0:
PUSHPSW;保護現場
PUSH2
PUSHACC
MOVDPTR,#8300H
MOVA,#0FH;南北,東西都亮紅燈
MOVX@DPTR,A
MOVR2,#100;延時10秒
LCALLDELAY
POPACC;恢復現場
MOVX@DPTR,A
POP2
POPPSW
RETI
STATUS0:;南北紅燈,東西紅燈
MOVDPTR,#8300H
MOVA,#0FH
MOVX@DPTR,A
MOVR2,#10;延時1秒
LCALLDELAY
RET
STATUS1:;南北綠燈,東西紅燈
MOVDPTR,#8300H
MOVA,#96H;南北綠燈,東西紅燈
MOVX@DPTR,A
MOVR2,#200;延時20秒
LCALLDELAY
RET
STATUS2:;南北綠燈閃轉黃燈,東西紅燈
MOVDPTR,#8300H
MOVR3,#03H;綠燈閃3次
FLASH:
MOVA,#9FH
MOVX@DPTR,A
MOVR2,#03H
LCALLDELAY
MOVA,#96H
MOVX@DPTR,A
MOVR2,#03H
LCALLDELAY
DJNZR3,FLASH
MOVA,#06H;南北黃燈,東西紅燈
MOVX@DPTR,A
MOVR2,#10;延時1秒
LCALLDELAY
RET
STATUS3:;南北紅燈,東西綠燈
MOVDPTR,#8300H
MOVA,#69H
MOVX@DPTR,A
MOVR2,#200;延時20秒
LCALLDELAY
RET
STATUS4:;南北紅燈,東西綠燈閃轉黃燈
MOVDPTR,#8300H
MOVR3,#03H;綠燈閃3次
FLASH1:
MOVA,#6FH
MOVX@DPTR,A
MOVR2,#03H
LCALLDELAY
MOVA,#69H
MOVX@DPTR,A
MOVR2,#03H
LCALLDELAY
DJNZR3,FLASH1
MOVA,#09H;南北紅燈,東西黃燈
MOVX@DPTR,A
MOVR2,#10;延時1秒
LCALLDELAY
NOP
RET
DELAY:;延時子程序
PUSH2
PUSH1
PUSH0
DELAY1:
MOV1,#00H
DELAY2:
MOV0,#0B2H
DJNZ0,$
DJNZ1,DELAY2;延時100mS
DJNZ2,DELAY1
POP0
POP1
POP2
RET
這是我們的實驗,程序肯定沒問題。至於ULN2803,只是一個增大電流,電壓的晶元,因為51單片機本身的電流太小。你改一下就好。至於其他不明白的地方,可以交流。QQ375778861