当前位置:编程学习 > 汇编语言 >>

基于AT89C51单片机,用汇编语言设计交通灯, 只需要有倒计时就可以了。

答案:基于AT89C51单片机
其他:2  程序源代码

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:&nb|<< << < 1 2 3 4 5 6 7 8 > >> >>| sp;  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         &|<< << < 1 2 3 4 5 6 7 8 > >> >>| nbsp;   ;倒计时初值减一

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 

上一个:单片机 汇编 怎么用指针啊
下一个:汇编 add ax,1; 这个1是16进制的0001还是asc 码的31转换成2进制呢

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,