0000H
LJMP
MAIN
ORG
000BH
中断程序入口地址
LJMP
TIME_0
ORG
0040H
MAIN:
MOV
IE,#82H
MOV
TCON
,
#10H
MOV
TH0,
#3CH
MOV
TL0,#0AFH
定时器T0初始帆模老化
MOV
R1,#20
定时累积
RED:
MOV
R2,#30
R2为时间设定
LOOP1:
MOV
A,R2
JZ
GREEN
R2为0时转到GREEN处,改态升变亮灯状态
CALL
SHOW
调用显示子程码培序,显示30s
MOV
P3,#0
SETB
P3.0
LJMP
LOOP1
GREEN:
MOV
R2,#20
LOOP2:
MOV
A,R2
JZ
YELLOW
R2为0时转到YELLOW
处,改变亮灯状态
CALL
SHOW
调用显示子程序,显示20s
MOV
P3,#0
SETB
P3.1
LJMP
LOOP2
YELLOW:
MOV
R2,
#3
3s时间设定
MOV
R0,
#6
MOV
P3,
#00H
SETB
P3.2
闪烁位
LOOP3:
MOV
A,
R2
JZ
RED
MOV
A,
R0
JZ
SHAN
dec
R0
CALL
SHOW
LJMP
LOOP3
SHAN:
MOV
R0,
#6
CPL
P3.2
LJMP
LOOP3
SHOW:
MOV
A,R2
MOV
B,#10
DIV
AB
二进制转十进制
MOV
DPTR
,#TABL
MOVC
A,@A+DPTR
查表
MOV
P1,#0FFH
MOV
P1,A
MOV
P2,#00H
SETB
P2.1
CALL
DELY
MOV
A,B
MOV
DPTR,
#TABL
MOVC
A,
@A+DPTR
MOV
P1,
#0FFH
MOV
P1,
A
MOV
P2,
#00H
SETB
P2.2
CALL
DELY
RET
DELY:
延时子程序
D3:
MOV
R6,
#100
D2:
MOV
R7,
#10
D1:
DJNZ
R7,
D1
DJNZ
R6,
D2
RET
TIME_0:
PUSH
ACC
保护现场
PUSH
PSW
MOV
TH0,
#3CH
MOV
TL0,
#0AFH
定时器T0初始化,定时50ms
DJNZ
R1,
OUT_T0
计时1s后做如下工作
MOV
R1,
#20
DEC
R2
OUT_T0:
POP
PSW
POP
ACC
RETI
TABL:DB
0C0H,
0F9H,
0A4H,
0B0H,
99H,
92H,
82H,
0F8H,
80H,
90H
END
这个是我以前单片机课程设计上我做的程序,希望对你有一定帮助。要求:根据TD-PIT-B实验箱现有的实验电路,设计电路并编写程序使六个灯按照交通灯变化规律亮、灭或者闪烁。十字路口交通灯的变化规律要求:
(7) 南北路口的黄灯闪烁3次,同时东西路口的红灯继续亮。
(8) 南北路口的红灯,东西路口的绿灯同时亮30秒。
(9) 南北路口的红灯继续亮,同时东西路口的黄灯闪烁3次。
(10) 转(11)重复。
(
当时我们采用的只是二极管p7~p0
东西交通灯我采用的是P7P6P5分别代表红黄绿灯
南北交通灯我采用的是P2P1P0分别代表红黄绿灯,中间的P3P4我空起没用)
LED方面的自己去摸索哈!
实验代码如下:
M8255COUNTB EQU 0D061H
M8255COUNTC EQU 0D062H
M8255MODEEQU 0D063H
M8254COUNT0 EQU 0D040H
M8254MODEEQU 0D043H
CODE SEGMENT
ASSUME CS:CODE
START:MOV DX,M8255MODE 初始化8255
MOV AL,81H工作方式是B口输出,方式0
OUT DX,AL
MOV DX,M8255COUNTB
MOV AL,00H初始状态,灯全亮
OUT DX,AL
CALL DELAY
CALL L00 第一个状态,即南北绿灯亮,东西红灯亮
CALL L01 第二个谨败状态,即南北黄灯闪,东西红灯亮
CALL L02 第三个状态,即南北红灯亮,东西绿灯亮
CALL L03 第四个状态,即南北红灯亮,东西黄灯闪
CALL L04 返回状态一
MOV AX,4C00H 结束返回DOS
INT 21H
L00 PROC NEAR
MOV DX,M8255COUNTB
MOV AL,10000001B 第一个状态,即南北绿灯亮,东西红灯亮
OUT DX,AL
CALL DELAY
CALL GGG 延时30S
RET 返回
L00 ENDP
L01 PROC NEAR 第二个状态,即南祥改颤北黄灯闪,东西红灯亮
PUSH CX
MOV CX,3
STA1:MOV DX,M8255COUNTB
MOV AL,10000010B 南北黄灯亮,东西红灯亮
OUT DX,AL
CALL DELAY
CALL YYY延时1S
MOV DX,M8255COUNTB
MOV AL,10000000B南北黄灯灭,东西红灯亮
OUT DX,AL
CALL DELAY
CALL YYY
LOOP STA1
POP CX
RET
L01 ENDP
L02 PROC NEAR 第三个状态
MOV DX,M8255COUNTB
MOV AL,00100100B 即南北红灯亮,东西绿灯亮
OUT DX,AL
CALL DELAY
CALL GGG延时30S
RET
L02 ENDP
L03 PROC NEAR 第四个状态,即南北红灯亮,东西黄灯闪
PUSH CX
MOV CX,3
STA3:MOV DX,M8255COUNTB
MOV AL,01000100B 南北红灯亮,东西黄灯亮
OUT DX,AL
CALL DELAY
CALL YYY
MOV DX,M8255COUNTB
MOV AL,00000100B 南北红灯亮,东西黄灯灭
OUT DX,AL
CALL DELAY
CALL YYY
LOOP STA3循环STA3
POP CX
RET
L03 ENDP
L04 PROC NEAR 回状态一
MOV DX,M8255COUNTB
MOV AL,10000001B 南北绿灯亮,东西红灯亮
OUT DX,AL
CALL DELAY
RET
L04 ENDP
DELAY PROC NEAR
PUSH CX
MOV CX,0FFH
L3:LOOP L3
POP CX
RET
DELAY ENDP
YYY PROC NEAR
MOV DX,M8254MODE
MOV AL,15H 采用0号计数器,写入低8位,高8位置0
OUT DX,AL
MOV DX,M8254COUNT0
MOV AL,10H
OUT DX,AL
L2: CALL BREAK
MOV DX,M8255COUNTC
INAL,DX
TEST AL,02H测试PC1位
JNZ L2
RET
YYY ENDP
GGG PROC NEAR
MOV DX,M8254MODE
MOV AL,25H写入高8位,低8位置0
OUT DX,AL
MOV DX,M8254COUNT0
MOV AL,03H 计数时间30s
OUT DX,AL
L1: CALL BREAK
MOV DX,M8255COUNTC
IN AL,DX
TEST AL,02H 测试PC1位
JNZ L1
RET
GGG ENDP
BREAK PROC NEAR 防止进入死循环
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN
RETURN: RET
BREAK ENDP
CODE ENDS
END START
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)