课程设计的要求: ① 南北方向的红灯亮16秒;同时东西方向的绿灯亮12秒;东西方向和南北方向的数码管(各两位)分别显示倒计时,下同。 ② 12秒之后,东西方向的绿灯灭,黄灯(红灯和绿灯一起闪烁为黄灯)闪烁3秒。3秒之后,东西方向黄灯灭,红灯亮。同时南北方向的绿灯亮。 ③ 12秒之后,南北方向的绿灯灭,黄灯闪烁3秒。3秒之后,南北方向黄灯灭,红灯亮。同时东西方向的绿灯亮。 ④ 重复上述过程。 设备: PC机一台,TD—PITE实验室装置一套 设计原理 设计通过8255可编程并行接口实现了对南北、东西两个方向交通信号灯状态的转换控制;通过软件定时的方法实现了对两个方向车辆通行时间的计时控制和黄灯的闪烁控制;通过键盘与数码管显示两个双位数字计时。 ① 8255结构 8255的内部结构及引脚如图1所示,8255工作方式控制字和C口按位置位/复位控制字格式如图2所示
时间: 2023-02-22 16:58:35 浏览: 100
这是一个课程设计的题目,要求实现一个交通信号灯的控制系统。南北方向的红灯亮16秒,东西方向的绿灯亮12秒,东西方向和南北方向的数码管分别显示倒计时。在某个时刻后,东西方向的绿灯会熄灭,并闪烁黄灯3秒,接着熄灭黄灯,亮起红灯。南北方向的绿灯同时亮起。在另一个时刻后,南北方向的绿灯同样会熄灭,并闪烁黄灯3秒,接着熄灭黄灯,亮起红灯。东西方向的绿灯同时亮起。这个过程不断重复。
设备包括一台PC机和一套TD-PITE实验室装置。通过8255可编程并行接口实现对交通信号灯状态的转换控制;通过软件定时的方法实现对两个方向车辆通行时间的计时控制和黄灯的闪烁控制;通过键盘与数码管显示两个双位数字计时。8255的内部结构和工作方式如图1和图2所示。
相关问题
用C51实现十字路口交通灯状态1:东西方向绿灯亮4s,南北方向红灯亮4s; 状态2:东西方向绿灯闪烁2s,南北方向红灯亮2s; 状态3:东西方向黄灯亮2s,南北方向红灯亮2s; 状态4:南北方向绿灯亮4s,东西方向红灯亮4s;并在四个方向添加数码管显示倒计时时间
以下是用C51实现十字路口交通灯状态的代码:
```
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
sbit led5=P1^4;
sbit led6=P1^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管0~9的显示码表
void delay(uint i) //延时函数
{
while(i--);
}
void display(uint num, uint time) //数码管显示函数
{
uint i,j,k;
for(i=0;i<time;i++) //循环time次
{
for(j=0;j<100;j++) //循环100次,延时约1ms
{
for(k=0;k<8;k++) //循环8次,显示8位数码管
{
switch(k)
{
case(0):dula=1;P0=table[num/1000];dula=0;break; //千位
case(1):dula=1;P0=table[num%1000/100];dula=0;break; //百位
case(2):dula=1;P0=table[num%100/10];dula=0;break; //十位
case(3):dula=1;P0=table[num%10];dula=0;break; //个位
case(4):wela=1;P0=0xfe;wela=0;break; //第一位数码管,即倒计时秒数
case(5):wela=1;P0=0xfd;wela=0;break; //第二位数码管,即倒计时秒数
case(6):wela=1;P0=0xfb;wela=0;break; //第三位数码管,即倒计时秒数
case(7):wela=1;P0=0xf7;wela=0;break; //第四位数码管,即倒计时秒数
}
}
}
}
}
void main()
{
while(1)
{
//状态1:东西方向绿灯亮4s,南北方向红灯亮4s
led1=1;led2=1;led3=0;led4=0;led5=0;led6=0;
display(4000, 40); //数码管显示4000,即倒计时4s
//状态2:东西方向绿灯闪烁2s,南北方向红灯亮2s
led1=1;led2=1;led3=0;led4=0;led5=0;led6=0;
for(uint i=0;i<4;i++) //循环4次,每次延时500ms
{
led1=~led1;led2=~led2; //绿灯闪烁
display(2000, 20); //数码管显示2000,即倒计时2s
}
//状态3:东西方向黄灯亮2s,南北方向红灯亮2s
led1=0;led2=0;led3=1;led4=0;led5=0;led6=1;
display(2000, 20); //数码管显示2000,即倒计时2s
//状态4:南北方向绿灯亮4s,东西方向红灯亮4s
led1=0;led2=0;led3=1;led4=1;led5=1;led6=1;
display(4000, 40); //数码管显示4000,即倒计时4s
}
}
```
此代码使用P1口控制LED灯的亮灭,使用P2口控制数码管的显示。在数码管显示函数中,循环time次,每次循环中循环8次,分别显示8位数码管的数字和倒计时秒数。在主函数中,按照交通灯状态循环执行,每个状态中使用LED灯和数码管显示对应的状态和倒计时时间。
制作交通灯代码:南北方向绿灯30s,黄灯3s,东西方向绿灯15s,黄灯3s,利用数码管倒计时,红黄绿灯用LED显示
以下是一个简单的交通灯控制程序,使用Arduino IDE编写,需要连接4个LED和一个数码管。其中,南北方向的绿灯使用LED1,东西方向的绿灯使用LED2,黄灯和红灯分别使用LED3和LED4,数码管显示倒计时。
```c
// 定义引脚
const int LED1 = 2;
const int LED2 = 3;
const int LED3 = 4;
const int LED4 = 5;
const int DIGIT1 = 6;
const int DIGIT2 = 7;
// 定义状态
const int STATE_NS_GREEN = 0;
const int STATE_NS_YELLOW = 1;
const int STATE_EW_GREEN = 2;
const int STATE_EW_YELLOW = 3;
// 定义时间参数
const int NS_GREEN_TIME = 30;
const int NS_YELLOW_TIME = 3;
const int EW_GREEN_TIME = 15;
const int EW_YELLOW_TIME = 3;
// 定义计时器
int timer = 0;
// 定义当前状态
int state = STATE_NS_GREEN;
void setup() {
// 初始化引脚
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(DIGIT1, OUTPUT);
pinMode(DIGIT2, OUTPUT);
}
void loop() {
// 状态机控制交通灯
switch (state) {
case STATE_NS_GREEN:
digitalWrite(LED1, HIGH);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, HIGH);
displayTime(NS_GREEN_TIME);
if (timer >= NS_GREEN_TIME) {
state = STATE_NS_YELLOW;
timer = 0;
}
break;
case STATE_NS_YELLOW:
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
displayTime(NS_YELLOW_TIME);
if (timer >= NS_YELLOW_TIME) {
state = STATE_EW_GREEN;
timer = 0;
}
break;
case STATE_EW_GREEN:
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, LOW);
displayTime(EW_GREEN_TIME);
if (timer >= EW_GREEN_TIME) {
state = STATE_EW_YELLOW;
timer = 0;
}
break;
case STATE_EW_YELLOW:
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
displayTime(EW_YELLOW_TIME);
if (timer >= EW_YELLOW_TIME) {
state = STATE_NS_GREEN;
timer = 0;
}
break;
}
// 计时器加1
timer++;
// 等待1秒
delay(1000);
}
// 数码管显示倒计时
void displayTime(int seconds) {
int minute = seconds / 60;
int second = seconds % 60;
digitalWrite(DIGIT1, HIGH);
digitalWrite(DIGIT2, LOW);
displayDigit(minute);
delay(1000);
digitalWrite(DIGIT1, LOW);
digitalWrite(DIGIT2, HIGH);
displayDigit(second);
delay(1000);
}
// 数码管显示数字
void displayDigit(int digit) {
switch (digit) {
case 0:
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
break;
case 1:
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
break;
case 2:
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
break;
case 3:
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
break;
case 4:
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
break;
case 5:
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
break;
case 6:
digitalWrite(8, LOW);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
break;
case 7:
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
break;
case 8:
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
break;
case 9:
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, HIGH);
break;
}
}
```
需要注意的是,此程序仅为示例,实际使用时需要根据实际需要进行修改和调整。例如,需要根据实际情况设置引脚和时间参数,以及添加必要的安全措施,如红灯闪烁等。