1、设计一个包括2个按键(K1、K2)、1个红色LED指示灯(RLED)、1个黄色LED指示灯(YLED)、1个绿色LED(GLED)指示灯的模拟交通灯控制单片机电路,上述元件均要求接在P0口上,且单片机的晶振频率为12MHz,请完成下述内容:
(1)绘制电路原理图;
(2)单片机初始化时,三个指示灯同时闪烁2下,然后熄灭,请写出相应初始化程序;
(3)利用定时器T0完成定时50毫秒的功能,请写出相应的定时器初始化函数和中断服务函数;
(4)K1按下后,模拟开始,循环以下列方式亮灯:先红灯亮15秒,后绿灯亮30秒,在绿灯亮的最后3秒内,以闪烁方式显示,然后黄灯以闪烁方式亮3秒。请写出相应的按键函数;
(5)K2按下后,模拟结束,三个指示灯同时闪烁3下,然后全亮,请写出相应的按键函数。
附:主函数程序供参考
#include<>
sbit K1 P0^0;
sbit K2 P0^1;
sbit RLED P0^2;
sbit YLED P0^3;
sbit GLED P0^4;
main()
{
Init();//单片机初始化
Init_Timer0();//定时器初始化
while(1)
{
if(K1= =0)
M_Start();//模拟开始
if(K2= =0)
M_End();//模拟结束
}
}
晚上随手写,也未调试,权当看看
程序有不严谨地方还得调试修改
#include <REGX51.H>
#define STATUS_1S 1
#define STATUS_2S 2
#define STATUS_3S 3
#define STATUS_4S 4
#define STATUS_5S 5
#define STATUS_15S 15
#define STATUS_28S 28
#define STATUS_29S 29
#define STATUS_30S 30
unsigned char flag,status,status_temp=1,status_temp_;
sbit K1 = P0^0;
sbit K2 = P0^1;
sbit RLED = P0^2;
sbit YLED = P0^3;
sbit GLED = P0^4;
void Init(void)
{
ET0=1;
TR0=1;
RLED=0; //亮
YLED=0;
GLED=0;
while(status_temp)
{
switch (status)
{
case STATUS_1S: //1S
{
RLED=1; //灭,闪一次
YLED=1;
GLED=1;
} break;
case STATUS_2S: //1S
{
RLED=0; //亮,闪一次
YLED=0;
GLED=0;
} break;
case STATUS_3S: //1S
{
RLED=1; //灭
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
void Init_Timer0(void)
{
TMOD=0x01;
// ET0=1;
// TR0=1;
EA=1;
TH0=0X3C;
TL0=0XB0; // 未计算,偷楼上的
}
void M_Start(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //红亮
while(status_temp)
{
switch (status)
{
case STATUS_1S:
{
if(status_temp_==1)
{
YLED=0;
}
} break;
case STATUS_2S:
{
if(status_temp_==1)
{
YLED=1;
}
} break;
case STATUS_3S:
{
if(status_temp_==1)
{
YLED=0;
status_temp_=0;
}
} break;
case STATUS_15S: //15S灭,绿亮
{
RLED=1;
GLED=0;
} break;
case STATUS_28S:
{
GLED=1;
} break;
case STATUS_29S:
{
GLED=0;
} break;
case STATUS_30S:
{
GLED=1;
status=0;
status_temp_=1;
} break;
}
}
ET0=0;
TR0=0;
status=0;
status_temp=1;
YLED=1;
}
void M_End(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //亮 1次
YLED=0;
GLED=0;
while(status_temp)
{
switch (status)
{
case STATUS_1S: //1S
{
RLED=1; //灭一次
YLED=1;
GLED=1;
} break;
case STATUS_2S: //1S
{
RLED=0; //亮二次
YLED=0;
GLED=0;
} break;
case STATUS_3S: //1S
{
RLED=1; ////灭二次
YLED=1;
GLED=1;
} break;
case STATUS_4S: //1S
{
RLED=0; ////亮三次
YLED=0;
GLED=0;
} break;
case STATUS_5S: //1S
{
RLED=1; ////灭三次
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
main()
{
Init();//单片机初始化
Init_Timer0();//定时器初始化
while(1)
{
if(K1==0)
M_Start();//模拟开始
if(K2==0)
M_End();//模拟结束
}
}
void interrupt_time0() interrupt 1 //核对头文件,一致就好
{
TH0=0X3C;
TL0=0XB0;
flag++;
if(flag==20)
{
status++;
flag=0;
}
}