下图为Proteus的仿真图,有红、绿、黄三灯,带外部中断。
//交通灯,以下为Keil中的代码:
#include
#include
#define UD 1 //定义两个方向,南北 和 东西
#define LR 0
unsigned char STOP="0";
unsigned char num[40]={ 1,1,1,1,
1,1,1,0,
1,1,0,1,
1,1,0,0,
1,0,1,1,
1,0,1,0,
1,0,0,1,
1,0,0,0,
0,1,1,1,
0,1,1,0,}; //数字0~9 共阴
void delay10ms(void) //延时10ms
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void StopInt() interrupt 0 //外部中断INT0
{
STOP = 1;
}
void main()
{
unsigned char i,j,k;
unsigned char direction="UD";
TCON = 0x01; // INT0 下沿中断
IE = 0x81; // EA =1, EX0=1
while(1)
{
for(i=20;i>0;i--) //倒计时
{
if(STOP) goto INT0;
switch(direction)
{
case UD: //如果是南北方向
{
if (i>3)
{
P1_0=0; //南北方向 红灯 1开 0关
P1_1=0; //南北方向 黄灯
P1_2=1; //南北方向 绿灯
P1_3=1; //东西方向 红灯
P1_4=0; //东西方向 黄灯
P1_5=0; //东西方向 绿灯
}
else //3秒内黄灯亮
{
P1_0=0;
P1_1=1;
P1_2=0;
P1_3=1;
P1_4=0;
P1_5=0;
}
break;
}
case LR: //如果是东西方向
{
if (i>3)
{
P1_0=1;
P1_1=0;
P1_2=0;
P1_3=0;
P1_4=0;
P1_5=1;
}
else
{
P1_0=1;
P1_1=0;
P1_2=0;
P1_3=0;
P1_4=1;
P1_5=0;
}
break;
}
}
P0_0=num[(i%10)*4+0]; //两位数码的数字显示 南北方向
P0_1=num[(i%10)*4+1];
P0_2=num[(i%10)*4+2];
P0_3=num[(i%10)*4+3];
P0_4=num[(i/10)*4+0];
P0_5=num[(i/10)*4+1];
P0_6=num[(i/10)*4+2];
P0_7=num[(i/10)*4+3];
P2_0=num[(i%10)*4+0]; //东西方向
P2_1=num[(i%10)*4+1];
P2_2=num[(i%10)*4+2];
P2_3=num[(i%10)*4+3];
P2_4=num[(i/10)*4+0];
P2_5=num[(i/10)*4+1];
P2_6=num[(i/10)*4+2];
P2_7=num[(i/10)*4+3];
for(j=0;j<100;j++) delay10ms(); //软件延时1秒
INT0:
if(STOP)
{
P1_0=1;
P1_1=0;
P1_2=0;
P1_3=1;
P1_4=0;
P1_5=0;
for(j=10;j>0;j--)
{
P0_0=num[(j%10)*4+0];
P0_1=num[(j%10)*4+1];
P0_2=num[(j%10)*4+2];
P0_3=num[(j%10)*4+3];
P0_4=num[(j/10)*4+0];
P0_5=num[(j/10)*4+1];
P0_6=num[(j/10)*4+2];
P0_7=num[(j/10)*4+3];
P2_0=num[(j%10)*4+0];
P2_1=num[(j%10)*4+1];
P2_2=num[(j%10)*4+2];
P2_3=num[(j%10)*4+3];
P2_4=num[(j/10)*4+0];
P2_5=num[(j/10)*4+1];
P2_6=num[(j/10)*4+2];
P2_7=num[(j/10)*4+3];
for(k=0;k<100;k++) delay10ms();
}
STOP="0";
}
}
direction=(direction+1)%2; //方向交换
}
}
用户174856 2009-3-9 16:49
用户74185 2008-3-24 19:11