用C51实现十字路口交通灯状态1:东西方向绿灯亮4s,南北方向红灯亮4s; 状态2:东西方向绿灯闪烁2s,南北方向红灯亮2s; 状态3:东西方向黄灯亮2s,南北方向红灯亮2s; 状态4:南北方向绿灯亮4s,东西方向红灯亮4s;并在四个方向添加数码管显示倒计时时间
时间: 2023-10-29 18:07:51 浏览: 226
以下是用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灯和数码管显示对应的状态和倒计时时间。
阅读全文