導航:首頁 > 操作系統 > 52單片機紅綠燈匯編程序

52單片機紅綠燈匯編程序

發布時間:2023-01-23 14:55:38

單片機交通燈程序

採用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

② c語言單片機模擬紅綠燈程序 請各位高手幫忙

uchar i,a,b,c,d,e,f;
sbit a=P1^0,b=P1^1,c=P1^2,d=P1^3,e=P1^4,f=P1^5;
你的錯誤是:a,b,c,d,e,f重復定義;sbit 要單獨一行。可以修改如下:
sbit aa=P1^0;
sbit bb=P1^1;
sbit cc=P1^2;
sbit dd=P1^3;
sbit ee=P1^4;
sbit ff=P1^5;
你的延時函數這樣取可以,沒有問題。

③ 單片機的紅綠燈控製程序如何寫啊

//--------------------------------------------------
//名稱:LED模擬交通燈
//作者:彭偉《單片機C語言程序設計實訓100例-基於8051+PROTEUS模擬》
//--------------------------------------------------
//說明:東西向綠燈亮若干秒後,黃燈閃爍,閃爍5次後亮紅燈
// 紅燈亮後,南北向由紅燈變為綠燈,若干秒後南北向黃燈閃爍
// 閃爍5次後亮紅燈,東西向綠燈亮,如此重復
//---------------------------------------------------
#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)
{
uchar i;
while(x--)for(i=0;i<120;i++)
}
//---------------------------------------------------
//交通燈切換子程序
//---------------------------------------------------
void Traffic_light()
{
switch(Operation_type)
{
case 1://東西向綠燈南北向紅燈亮
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
DelayMS(2000);
Operation_type=2;
break;
case 2://東西向黃燈閃爍,綠燈關閉
DelayMS(300);
GREEN_A=1;
YELLOW_A=~YELLOW_A;
//閃爍5次
if (++Flash_count!=10) return;
Flash_count=0;
Operation_type=3;
break;
case 3://南北向綠燈東西向紅燈亮
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
DelayMS(2000);
Operation_type=4;
break;
case 4://南北向黃燈閃爍,綠燈關閉
DelayMS(300);
GREEN_B=1;
YELLOW_B=~YELLOW_B;
//閃爍5次
if (++Flash_count!=10) return;
Flash_count=0;
Operation_type=1;
}
}
void main()
{
while(1) Traffic_light();

}

④ 求一個用匯編語言編寫單片機簡易交通燈程序。求高手幫下忙謝謝了。

;------------------------------------
;程序實現功能
;西南北路口直行與轉彎交替通行,數碼管顯示直行通行倒計時,紅綠黃燈顯示包括人行道在內的道路交通狀態。
;某一方向道路擁擠時,可以人工控制調節東西南北方向通行時間。
;緊急情況時,各路口交通燈顯示紅燈,數碼管保持數據不變。

;工作寄存器及存儲單元分配
;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
END

⑤ 單片機交通燈的匯編程

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
你看看行不行 如果不行你自己再稍微改一下吧 反正大概就這些了
希望對你能有所幫助。

⑥ 單片機 用匯編語言編寫交通紅綠燈 只要求紅燈30秒,黃燈5秒,綠燈30秒,黃燈5秒,其他不限

看你的程序上沒有很大的問題,但是你的延時都使用相同子程序,延時時間相同。你可以把延時30秒的子程序和延時5秒的程序分開來寫,分別調用。另單片機的引腳一般為吸入電流,建議你將單片機的引腳輸出改為0有效就可以直接接負載,電源控制按鍵判斷也作出相應的修改。

⑦ 單片機交通燈匯編語言程序,只需紅黃綠燈順序亮就行了

#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();

}

⑧ 急求單片機紅綠燈的匯編語言程序設計

去買一本書吧!單片機原理與應用,你可能還不雜個會吧,這個你得慢慢來,只要你把那本書學會了差不多你能看會了,你可能還很年輕吧,要慢慢來,別人給你說沒的意思的,年輕嘛慢慢來,我也是這樣來的,我看過你這個還是簡單的,我是搞儀表的,你看看我的程序吧!!! 十分之一
文件名:*******.ASM
;* 型號 : M603-VA
;* 產品名稱:4位三相電流/電壓表
;* PCB硬體:M603-3P-VA-01(01)/M603-3P-VA-03(01)
;* 實現功能:(1)可測三相三線電壓/電流
;(2)對輸入電流/電壓值做任意刻度顯示
;* 版本號: 第1.0版
;* 起草日期:2006.3.30 最後修改日期: 2006.8.16
;* 修改日誌:
;* V1.1 解決測量漂移問題
;* 完善1:LiuQK-2007.1.1
;* 1、增加RS485通訊功能
;* 2、增加變送功能
;* 3、增加上下限報警
;//////////////////////////////////////////////////////////////
ORG 0000
AJMP MAIN

ORG 0003H;INT0中斷入口地址停電保存
;ljmp irq_int0
NOP
NOP
LJMP Err;程序飛跑,轉到處理程序,重新啟動.
ORG 000BH;T0中斷入口, 用於顯示定時
LJMP IRQ_t0
NOP
NOP
LJMP Err;程序飛跑,轉到處理程序,重新啟動.
ORG 0013H;INT1中斷口地址
LJMP IRQ_int1
NOP
NOP
LJMP Err;程序飛跑,轉到處理程序,重新啟動.
ORG 001BH;T1中斷入口 用於A/D轉換
ljmp irq_t1
NOP
NOP
LJMP Err;程序飛跑,轉到處理程序,重新啟動.
ORG 23H
LJMP IRQ_UART;用於RS-485通訊
NOP
NOP
LJMP Err
org 002bh ;D/A
ljmp irq_t2
nop
nop
LJMP Err

;////////////////////////////////////////////////
;主程序從MAIN開始 執行
;////////////////////////////////////////////////
;////////////////////////////////////////////////
;STC單片機附加功能宏定義
P4 DATA 0e8h;P4口地址
WDT_CONTR DATA 0E1H;看門狗控制地址
AUXR DATA 8EH ;只寫寄存器,只能用MOV AUXR,#DATA 命令. 用於控制擴展RAM和使能ALE.
AUXR1 DATA 0A2H;本寄存器用於數據指針選擇://=0 選擇DPTR0 , =1 選擇DPTR1 //
XICON DATA 0C0H;特殊功能寄存器申明
;89C52定時器T2
;T2CON DATA 0C8H
;TH2 DATA 0CDH
;TL2 DATA 0CCH
;RCAP2H DATA 0CBH
;RCAP2L DATA 0CAH
;RL2 BIT 0C8H.0
;CT2 BIT 0C8H.1
;TR2 BIT 0C8H.2
;EXEN2 BIT 0C8H.3
;TCLK BIT 0C8H.4
;RCLK BIT 0C8H.5
;EXF2 BIT 0C8H.6
;TF2 BIT 0C8H.7
;ET2 BIT 0A8H.5
;PT2 BIT 0B8H.5
ORG 35h

MAIN: mov r0,#0Ffh
FILL: clr a
MOV @R0,A
DJNZ R0,FILL;(填充)初始化RAM內的數據全部為00H。
mov psw,#0
MOV SP,#80H;堆棧指針
MOV AUXR,#00
MOV CHECK_CODE,#0AAH
ACALL DATA_CHECK;數據校驗
; setb 21h.0;置儀表起動標志
;EA中斷允許,ET1中斷允許,ET0中斷允許
SETb ea ;EA中斷允許

setb IT1;INT1中斷方式是負邊沿觸發方式
setb it0;INT0中斷方式是負邊沿觸發方式

mov pcon,#00h;
SETB PT0

CLR PX0
CLR PT1
CLR PX1
;SETB PX1
setb et0;T0中斷允許
setb ET2
JNB 25H.2,IE_1
LCALL R_LOAD;載入波特率
mov t2con,#34h
setb p1.0;將485置為接收狀態
mov scon,#0D0h;初始化並啟動串口
SETB ES;開中斷
SETB PS;串口中斷優先
CLR PS
sjmp ie_OK

ie_1: JNB 25H.1,IE_OK
mov RCAP2H,#0ffh
mov RCAP2L,#0ffh
mov t2con,#04h
SETB PT2

IE_OK: SETB 20H.0 ;儀表啟動標志
mov 2fh,#0;
lcall ie_ch;啟動通道
;clr p1.2
;clr p1.3

;/////////////////////////////////////////////////
;/顯示程序/
main2: ;啟動看門狗以及定時時間為4S
MOV WDT_CONTR,#34H
setb et0
setb tr0
main20: JB 20H.7,MAIN3;查看A/D是否運行
lCALL IE_SET ;啟動測量初始化
SETB 20H.7 ;測量啟動標記
main3: ;A.數據校驗
ACALL DATA_CHECK;數據校驗
;B.測量頻率計算
ACALL CY_HZ;計算
;C.顯示比例值計算
acall dis_scale
;D:計算平均值
acall Hz_av
;E:上下限報警
ACALL ALARM_OUTPUT
;F:RS485通訊/變送輸出
LCALL COMMUNICATION

;g:按鍵處理
LCALL SETKEY
LCALL SHIFTKEY
LCALL DOWKEY
LCALL ATKEY

;h:BCD碼轉換
ACALL bcdCode;bcd碼轉換

AJMP MAIN2;重新回到MAIN2

;//////////////////////////////////////
;A/D轉換采樣啟動程序
IE_SET: MOV 1eH,#4;INT1不中斷等待次數
MOV 1fH,#0;T0定時循環次數
MOV 1cH,#0;采樣脈沖個數緩沖器
MOV 1dH,#0
MOV TMOD,#00010001B;T1,T0為16位定時器.
;再次初始化T1;int1
setb ea;再次啟動中斷
setb et1
clr tr1
mov tl1,#0
mov th1,#0
setb tr1
CLR IE1; 清除int1中斷標志
SETB EX1;開啟INT1中斷
RET

;********************
;測量通道設置
ie_ch: push dpl
push dph

ie_ch1: mov a,2fh
ie_ch2: rl a;左移
cjne a,#7,ie_ch20;A/D轉換共5次循環
ie_ch20: jc ie_ch21
clr a
ie_ch21: mov dptr,#ie_ch3
jmp @a+dptr
nop
nop
;通道循環表
ie_ch3: sjmp ie_offset ;零點偏移測量;0
sjmp ie_pa;A相過程值1
sjmp ie_pb;B相過程值2
sjmp ie_pc;C相過程值3
nop
nop

;4051 地址引腳排列 (9) (10 ) (11) 為地址 A2(c) A1(b) A0(a).
;CPU控制引腳: (Gnd) (p1.6) (p1.7)
;地址對應關系:000-- 0 0 0------PC通道(13PIN)
;001---0 0 1-----PB通道(14PIN)
;002---0 1 0-----PA通道(15PIN)
;003---0 1 1-----offset通道(12PIN)
;004---0-----GND
;005---0-----GND
;006---0-----GND
;007---0-----GND

;PA測量
ie_pa: nop
;功能檢查
setb p1.6
clr p1.7
ie_ch_com: pop dph
pop dpl
ret
nop

;PB測量
ie_pb: setb p1.7
clr p1.6
sjmp ie_ch_com
;PC測量
ie_pc: CLR p1.7
clr p1.6
sjmp ie_ch_com

;零點偏移OFFSET測量0通道,硬體連接4051 的13引腳
ie_offset: SETB p1.7
SETB p1.6
sjmp ie_ch_com
nop
nop

;**************************
;頻率計算
NOSWAP:
RET
nop
CY_HZ: JNB 3EH,NOSWAP;無采樣結束標志
CLR 20H.7;清除測量掛起標記
CLR 3EH;清除測量結束標記

;T0中斷次數浮點數轉換

cy_hz_1: CLR 3CH
MOV R2,#0
MOV R3,1fh
MOV R1,#08H
LCALL INTF;浮點數存儲08H 09H 0AH

;T0中斷次數計算成時間周期;每中斷1次時間為65536uS
MOV 0BH,#17;65536
MOV 0CH,#80H
MOV 0DH,#00H
MOV R0,#0BH
LCALL FMUL;
mov r1,#08h
LCALL FSTR;存儲08H 09H 0AH
;T0剩餘時間浮點數轉換
MOV R3,1Bh
MOV R2,1Ah
MOV R1,#0BH
LCALL INTF;T0內檢測到的時間轉換浮點數存入0BH
;計算超出定時60mS以外的時間周期
MOV R0,#08H
CLR 3AH
LCALL FABP;T0+08H內時間和
LCALL FSTR;存儲0BH,0CH 0DH
;計數總時間周期
MOV 08H,#18;65.535*2mS
MOV 09H,#80H
MOV 0AH,#0h
CLR 3AH
LCALL FABP;定時時間+T0+30H得到檢測總時間
LCALL FSTR;存儲0BH 0CH 0DH

;---------------------------------------
;在定時周期內采樣到的脈沖個數轉換成浮點數
MOV R2,1ch;測量周期個數轉換浮點數
MOV R3,1dH
mov r1,#08h
Lcall intf;數據存放在08H 09H AH
;計算頻率值
MOV R0,#08H
MOV R1,#0bH
LCALL Fdiv;頻率
LCALL FSTR;存儲0b 0c 0d
mov 08h,#20
mov 09h,#0f4h
mov 0ah,#24h
Lcall fmul
; Lcall fstr

mov a,2fh
jnz time_1
;(零點測量)
; mov 10h,0bh
; mov 11h,0ch
; mov 12h,0dh
MOV R1,#10H
; lcall fstr
sjmp TIME_4
nop
nop
time_1: ; mov r0,#0bh
; mov r1,#10h
; setb 3ah
; Lcall fabp
mov a,2fh
cjne a,#1,time_2
;第二次采樣值存放到30H 31H 32H 地址(PA過程值測量)
; mov 36h,0bh
; mov 37h,0ch
; mov 38h,0dh

mov r1,#30h
; Lcall fstr
sjmp time_4
; nop
; nop

time_2: cjne a,#2,time_3
;第3次采樣值存放33H 34H 35H (PB過程值測量)
; mov 33h,0bh
; mov 34h,0ch
; mov 35h,0dh
mov r1,#33H
; Lcall fstr
Sjmp time_4
;第4次采樣值存放36H 37H 38H (PC過程值測量)
time_3: MOV R1,#36H
setb 20h.6;置A/D轉換結束標志,用於過程值計算
INC 0EH;A/D轉換計數器,用於延遲報警/數據刷新
; mov 30h,0bh
; mov 31h,0ch
; mov 32h,0dh
TIME_4: LCALL FSTR

;通道切換
TIME_COM: INC 2FH
mov a,2fh
cjne a,#4,time_COM0
time_COM0: jc time_COM1
mov 2fh,#0
time_COM1: acall ie_ch
ret

⑨ 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

⑩ 求單片機STC89C52控制的紅綠燈C程序 謝謝大蝦!

這么簡單都不會!

閱讀全文

與52單片機紅綠燈匯編程序相關的資料

熱點內容
java方法和函數 瀏覽:418
程序員衣服穿反 瀏覽:957
java多類繼承 瀏覽:157
怎麼用多玩我的世界連接伺服器地址 瀏覽:481
為什麼華為手機比安卓流暢 瀏覽:175
javamap多線程 瀏覽:226
卡西歐app怎麼改時間 瀏覽:841
jquery壓縮圖片 瀏覽:970
用紙筒做解壓東西 瀏覽:236
神奇寶貝伺服器如何tp 瀏覽:242
雲伺服器支持退貨嗎 瀏覽:277
貸款等額本息演算法 瀏覽:188
根伺服器地址配置 瀏覽:499
單片機是軟體還是硬體 瀏覽:624
vivo手機怎麼看編譯編號 瀏覽:320
塑鋼扣條演算法 瀏覽:301
linux應用程序安裝 瀏覽:414
linux怎麼查找命令 瀏覽:431
安卓12原生和非原生是什麼意思 瀏覽:277
四川廣電怎麼安裝app 瀏覽:6