要求:
用STC89C52单片机扩展一片可编程并行I/O口82C55,用8255做输出口,控制十二个发光二极管亮灭,模拟交通灯的管理。
初始状态:红灯全亮,黄、绿灯灭。
第一状态:1,3路口的绿灯全亮,2、4路口红灯亮。
第二状态:1,3路口绿灯灭,黄灯开始闪烁。
第三状态:1,3路口红灯亮,2,4路口绿灯亮。
第四状态:2,4路口绿灯熄灭,而黄灯闪烁。
C语言:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define XBYTE ((uchar volatile xdata *) 0)
#define COM8255 0XFF7F
#define PORTC8255 0XFF7E
void time(unsigned int _time)
{
uchar ucCounter,i;
//for(ucCounter=0;ucCounter<_time;ucCounter++);
for(ucCounter=0;ucCounter<110;ucCounter++)
for(i=0;i<_time;i++);
}
void main()
{
while(1)
{
uint i;
XBYTE[COM8255]=0X80;
XBYTE[PORTC8255]=0Xc6;
time(200);
XBYTE[PORTC8255]=0Xc5;
time(200);
for(i=0;i<8;i++)
{
XBYTE[PORTC8255]=0XC3;
time(200);
XBYTE[PORTC8255]=0XC7;
time(200);
}
XBYTE[PORTC8255]=0Xa6;
time(200);
time(200);
for(i=0;i<8;i++)
{
XBYTE[PORTC8255]=0X66;
time(200);
XBYTE[PORTC8255]=0XE6;
time(200);
}
}
}
汇编语言:
ORG 0000H
PORTC8255 EQU 0FF7EH ;8255C
CTRL8255 EQU 0FF7FH ;8255
NUMB EQU 08H
MAIN: MOV A,#80H ;A,B,C口方式0输出
MOV DPTR,#CTRL8255
MOVX @DPTR,A
MOV A,#0C6H ;红灯全亮,绿灯黄灯全灭
MOV DPTR,#PORTC8255
MOVX @DPTR,A
LCALL DL11
START: MOV A,#0C5H ;1,3路口绿灯全亮,2,4路口红灯亮
MOVX @DPTR,A
LCALL DL11
LCALL DL11
MOV R2,#NUMB
LOOP1: MOV A,#0C3H ;1,3路口黄灯亮
MOVX @DPTR,A
LCALL DL12
MOV A,#0C7H ;1,3路口黄灯灭
MOVX @DPTR,A
LCALL DL12
DJNZ R2,LOOP1
MOV A,#0A6H ;1,3路口红灯亮,2,4路口绿灯亮
MOVX @DPTR,A
LCALL DL11
LCALL DL11
YELLO24:MOV R2,#NUMB
LOOP2: ANL A,#66H ;2,4路口黄灯亮
MOVX @DPTR,A
LCALL DL12
MOV A,#0E6H ;2,4路口黄灯灭
MOVX @DPTR,A
LCALL DL12
DJNZ R2,LOOP2
LJMP START
;
DL11:
MOV R5,#5H
DL2: MOV R7,#0FFH
DL3: MOV R6,#0FFH
DL4: DJNZ R6,DL4
DJNZ R7,DL3
DJNZ R5,DL2
RET
DL12:
MOV R7,#0C0H
DL5: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R7,DL5
RET
END
仿真效果图: