用51单片机设计一十字交通灯系统东西路口和南北路口同时用一位数码管显示倒计时,初始态红灯全亮,运行时红灯亮9秒,绿灯亮6秒,黄灯闪烁3秒。当有外部中断信号产生,所有路口黄灯闪烁5秒后,恢复中断前的状态。这个怎么设计?
就在这个网站搜吧,一大把的例子
不知道你这个问题是否已经解决, 如果还没有解决的话:解决方案:
硬件设计: 需要一个51单片机进行控制,其中需要使用数码管进行倒计时显示,同时需要连接红绿黄三色LED灯,需要使用外部中断信号进行控制。
软件设计: (1)进行初始化:设置管脚方向、三色LED初始状态(红灯亮)、数码管倒计时显示初始值(90秒)、中断输入管脚配置。 (2)控制流程: a. 东西路口:
闪烁结束后,恢复到中断之前的状态。
代码实现:
//初始化,设置端口以及中断
void Init()
{
// 端口初始化
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
// 申请内存空间
unsigned char *timer = (unsigned char *) malloc (sizeof(unsigned char));
unsigned char *led_time = (unsigned char *) malloc (sizeof(unsigned char));
unsigned char *led_state = (unsigned char *) malloc (sizeof(unsigned char));
//设置中断
IE = 0x82;
EA = 1;
// 初始化倒计时时间和LED灯状态
*timer = 90;
*led_time = 0;
*led_state = 0x01; //红灯亮
}
void main()
{
Init();
while( 1 )
{
// 东西方向
LED_ew(*led_time, *led_state);
// 南北方向
LED_ns(*led_time, *led_state);
//下一秒倒计时
if(!--*timer){
*timer = 90;
*led_time = 0;
}
delay_ms( 1000 );
}
}
//东西方向控制
void LED_ew(unsigned char led_time,unsigned char led_state){
if (led_state == 0x01){ // 红灯亮
if(--led_time <= 0){ // 红灯9秒
led_time = 6;
led_state = 0x02; // 绿灯亮
}
} else if (led_state == 0x02){ // 绿灯亮
if(--led_time <= 0){ // 绿灯6秒
led_time = 3;
led_state = 0x04; // 黄灯闪烁
}
} else if (led_state == 0x04){ // 黄灯闪烁
led_time--;
if (led_time == 0){
led_time = 3;
if (led_state == 0x04)
led_state = 0x00; //灯灭
else
led_state = 0x04; //黄灯闪烁
}
}
//输出灯的状态
write_led_state_to_port(led_state);
}
//南北方向控制
void LED_ns(unsigned char led_time,unsigned char led_state){
if (led_state == 0x01){ // 红灯亮
if(--led_time <= 0){ // 红灯9秒
led_time = 6;
led_state = 0x02; // 绿灯亮
}
} else if (led_state == 0x02){ // 绿灯亮
if(--led_time <= 0){ // 绿灯6秒
led_time = 3;
led_state = 0x04; // 黄灯闪烁
}
} else if (led_state == 0x04){ // 黄灯闪烁
led_time--;
if (led_time == 0){
led_time = 3;
if (led_state == 0x04)
led_state = 0x00; //灯灭
else
led_state = 0x04; //黄灯闪烁
}
}
//输出灯的状态
write_led_state_to_port(led_state);
}
//再设置一个异步中断
void ExternalInterrupt() __interrupt 0
{
// 再次申请内存空间
unsigned char *led_time = (unsigned char *) malloc (sizeof(unsigned char));
unsigned char *led_state = (unsigned char *) malloc (sizeof(unsigned char));
unsigned char time = 5;
//恢复正常状态
*led_time = 0;
*led_state = 0x01;
while(time--){
write_led_state_to_port(0x04); //黄灯闪烁
delay_ms(500);
write_led_state_to_port(0x00); //灯灭
delay_ms(500);
}
}
//GPIO输出
void write_led_state_to_port(unsigned char led_state)
{
unsigned char led_io = led_state << 4; //LED灯接12, 13, 14
P1 = led_io;
}