用单片机AT89C51芯片进行12个发光二极管模拟十字路口交通灯控制。每个路口设置一个红灯(red)绿灯(GREEN)、黄灯(YELLOW)三个发光二极管。通过改变单片机P1口的输出编码就可以控制交通灯的输出状态;外中断0和外中断1接开关(BUTTON)模拟异常发生。
异常情况分两种:
东西发生异常时,东西通行,南北禁止,东西方向绿灯闪,南北方向红灯闪60秒;
南北发生异常时,南北通行,东西禁止,南北方向绿灯闪,东西方向红灯闪60秒
主程序中实现交通灯正常运行过程,两种异常用外部中断0和外部中断1 管理,外接开关模拟异常发生,在中断服务程序中实现异常处理,在主程序中开放外中断0和外中断1,设置为边沿触发方式。时间单位采用500ms信号,由定时/计数器0定时50ms,循环10次发生,定时/计数器0采用查询方式,主程序中设定定时/计数器0的工作方式:方式1。
代码如下:
#include "at89x51.h"
void delay500ms(unsigned char k);
void main(void)
{
SP=0x60; //初始化
TMOD=0x01;
IE=0x85;
TCON=0x05;
while(1)
{
P1=0x21; //状态1,东西方向绿灯,南北方向红灯20s
delay500ms(40);
P1=0x41; //状态2,东西方向黄灯,南北方向红灯3s
delay500ms(6);
P1=0x12; //状态3,南北方向绿灯,东西方向红灯20s
delay500ms(40);
P1=0x14; //状态4,南北方向黄灯,东西方向红灯3s
delay500ms(6);
}
}
//东西方向异常,东西方向绿灯闪,南北方向红灯闪60s
void int_0(void) interrupt 0
{
unsigned char i1,i2;
i1=P1;
for(i2=0;i2<60;i2++)
{
P1=0x21;
delay500ms(1);
P1=0x00;
delay500ms(1);
}
P1=i1;
}
//南北方向异常,南北方向绿灯闪,东西方向红灯闪60s
void int_1(void) interrupt 2
{
unsigned char j1,j2;
j1=P1;
for(j2=0;j2<60;j2++)
{
P1=0x12;
delay500ms(1);
P1=0x00;
delay500ms(1);
}
P1=j1;
}
//延时函数
void delay500ms(unsigned char m)
{
unsigned char k1,k2;
TH0=0x3c;TL0=0xB0;
TR0=1;
for(k1=0;k1<m;k1++)
{
for(k2=0;k2<10;k2++)
{
while(!TF0);
TF0=0;
TH0=0x3c;TL0=0xB0;
}
}
}