这是我上个月做的单片机交通灯设计,用了一个星期的时间,
附件里面包含交通灯的单片机源代码,
和proteus(proteus)仿真工程文件以及设计的文档都是自己原创的,
请大家多多指教
最终呈现的结果是:通行时间30s,间隔时间 3s,在间隔时间里黄灯闪烁3次每0.5s闪烁一次
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:- ;8255的地址
- PA EQU 08H
- PB EQU 0AH
- PC EQU 0CH
- CONW EQU 0EH
- ;8253的地址
- AD82530 EQU 10H
- AD82531 EQU 12H
- AD82532 EQU 14H
- AD8253CONW EQU 16H
- ;============================
- STACK SEGMENT STACK
- DB 200 DUP(0)
- STACK ENDS
- ;============================
- DATA SEGMENT
- ;延时
- ONE DB 6 ;灯组1延时
- TWO_1 DB 1 ;灯组2亮延时
- TWO_2 DB 1 ;灯组2灭延时
- THREE DB 6 ;灯组3延时
- FOUR_1 DB 1 ;灯组4亮延时
- FOUR_2 DB 1 ;灯组4灭延时
- ;闪烁次数
- C2 DB 2 ;闪烁3次
- C4 DB 2
- ;灯组定义
- TF1 BYTE 081h ;第一组灯
- TF2 BYTE 082h ;第二组灯亮(黄灯亮)
- TF3 BYTE 080h ;第二组灯灭(黄灯灭)
- TF4 BYTE 024h ;第三组灯
- TF5 BYTE 044h ;第四组灯亮(黄灯亮)
- TF6 BYTE 004h ;第四组灯灭(黄灯灭)
- DATA ENDS
- ;=============================
- CODE SEGMENT
- ASSUME CS:CODE, DS:DATA
- START:
- PUSH DS
- MOV AX, DATA
- MOV DS, AX
- ;=================
- ;设置中断向量8253
- CLI
- MOV AX, 0
- MOV ES, AX
- MOV SI, 08H
- MOV AX, OFFSET TIME_INT
- MOV ES:[SI], AX
- MOV AX, CS
- MOV ES:[SI+2], AX
- ;=================
- ;初始化8255A
- MOV AL, 80H
- OUT CONW, AL
- ;初始化8253
- MOV AL, 36H
- OUT AD8253CONW, AL
- MOV AX, 32500 ;计数初值,0.5s
- OUT AD82530, AL
- MOV AL, AH
- OUT AD82530, AL
- ;===============
- W:
- JMP W ;循环等待中断
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;第一组灯判断
- DENG1: MOV AL, ONE
- CMP AL, 0 ;中断判断
- JNE DENG1ON ;跳转第一组灯
- JE DENG2 ;跳转第二组灯判断
- DENG1ON:
- DEC ONE ;定时减1
- MOV DX,PC
- MOV AL,TF1 ;第一组灯亮
- OUT DX,AL
- RET
- ;第二组灯判断
- DENG2:
- ;第二组灯亮判断
- DENG2_1:
- MOV AL, TWO_1
- CMP AL, 0 ;中断判断
- JNE DENG2ON ;跳转第二组灯亮
- JE DENG2_2 ;跳转第二组灯灭判断
-
- DENG2ON:
- DEC TWO_1 ;定时减1
- MOV DX,PC
- MOV AL,TF2 ;第二组灯亮
- OUT DX,AL
- RET
-
- ;第二组灯暗判断
- DENG2_2:
- MOV AL, TWO_2
- CMP AL, 0 ;中断判断
- JNE DENG2OFF ;跳转第二组灯灭
- CMP C2,0 ;判断闪烁次数
- JE DENG3 ;跳转第三组灯判断
-
- DENG2OFF:
- DEC TWO_2
- MOV DX,PC
- MOV AL,TF3 ;第二组灯灭
- OUT DX,AL
- CMP C2,0 ;闪烁次数未到
- JNE RE_DENG2 ;重置第二组灯
- RET
- ;第二组灯重置
- RE_DENG2:
- DEC C2
- MOV AL,1
- MOV TWO_1,AL
- MOV TWO_2,AL
- RET
- ;第三组灯判断
- DENG3: MOV AL, THREE
- CMP AL, 0 ;中断判断
- JNE DENG3ON ;跳转第三组灯
- JE DENG4 ;跳转第四组灯
- DENG3ON:
- DEC THREE
- MOV DX,PC
- MOV AL,TF4 ;第三组灯亮
- OUT DX,AL
- RET
- ;第四组灯判断
- DENG4:
- DENG4_1:
- MOV AL, FOUR_1
- CMP AL, 0 ;中断判断
- JNE DENG4ON ;跳转第四组灯亮
- JE DENG4_2 ;跳转第四组灯灭判断
-
- DENG4ON:
- DEC FOUR_1
- MOV DX,PC
- MOV AL,TF5 ;第四组灯亮
- OUT DX,AL
- RET
-
- DENG4_2:
- MOV AL, FOUR_2
- CMP AL, 0 ;中断判断
- JNE DENG4OFF ;跳转第四组灯灭
- CMP C4,0 ;判断闪烁次数
- JE RE_ALL ;重置所有灯组
-
- DENG4OFF:
- DEC FOUR_2
- MOV DX,PC
- MOV AL,TF6 ;第四组灯灭
- OUT DX,AL
- CMP C4,0 ;闪烁次数未到
- JNE RE_DENG4 ;重置第四组灯
- RET
- ;重置第四组灯
- RE_DENG4:
- DEC C4
- MOV AL,1
- MOV FOUR_1,AL
- MOV FOUR_2,AL
- RET
- ;重置所有灯组
- RE_ALL:
- MOV AL,6
- MOV ONE,AL
- MOV THREE,AL
- MOV AL,2
- MOV C2,AL
- MOV C4,AL
- MOV AL,1
- MOV TWO_1,AL
- MOV TWO_2,AL
- MOV FOUR_1,AL
- MOV FOUR_2,AL
- RET
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- TIME_INT: ;定时器中断处理函数
- CALL DENG1
- IRET
- CODE ENDS
- END START
复制代码 仿真工程:
交通灯控制系统.rar
(26.93 KB, 下载次数: 0)
|