急求KEIL C51 红绿灯程序!(用C语言!)

供稿:hz-xin.com     日期:2024-05-22
用Keilc软件设计一个交通灯程序C程序

东西和南北的时间不同步,楼主没有说得很清楚
你把时间流程说清楚我可以把代码写出来

//以下代码经过Keil C51软件调试通过
#include "reg51.h" //头文件包含

//宏定义
#define uint unsigned int
#define uchar unsigned char

#define ON 0 //0的时候灯亮
#define OFF 1 //1的时候灯亮

//管脚定义
//南北道 黄灯亮3秒 红灯亮 30秒 黄灯3秒 绿灯38秒
//东西道 黄灯亮3秒 绿灯亮 28秒 黄灯3秒 红灯40秒
sbit PortDX_Yellow = P1^0; //东西方向黄灯
sbit PortDX_Red = P1^1; //东西方向红灯
sbit PortDX_Green = P1^2; //东西方向绿灯
sbit PortNB_Yellow = P1^3; //南北方向黄灯
sbit PortNB_Red = P1^4; //南北方向红灯
sbit PortNB_Green = P1^5; //南北方向绿灯


void delay(uint ms) // 毫秒级延时(AT89C52 @ 11.0592MHz)
{
uint ti;
while(ms--)
{
for(ti=0;ti<112;ti++){}//112
}
}

/*==================== 主函数 ====================*/
void main(void)
{
delay(400); //开机延时400ms
while(1)
{
PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮3秒
PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮3秒
delay(3000);
PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北红灯亮28秒
PortDX_Yellow = OFF;PortDX_Red = OFF;PortDX_Green = ON ;//东西绿灯亮28秒
delay(28000);
PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北红灯亮2秒
PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮2秒
delay(2000);
PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮1秒
PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮1秒
delay(1000);
PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮2秒
PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//东西红灯亮2秒
delay(2000);
PortNB_Yellow = OFF;PortNB_Red = OFF;PortNB_Green = ON ;//南北绿灯亮38秒
PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//东西红灯亮38秒
delay(3800);
}
}

你的这个工程量比较大,而且要硬件配合,我只能给你一部分代码。下面是延时和数码管显示的部分程序,可供你参考。
void Delay_100us() //100us延时
{
unsigned char i;
for(i=0;i



//12M晶振

//共阴数码管

#include <reg51.h>

sbit red=P1^0;

sbit green=P1^1;

sbit yellow=P1^2;

bit flag=1;

unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char code wei[ ]={0xfd,0xfe};

unsigned char time=35;

void main()

{

    void show_time();

    void show_light();

    EA=1;

    ET0=1;

    TMOD=0x01;

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    TR0=1;

    red=0;

    while(1)

    {

        show_time();

        show_light();

    }

}

void show_time()

{

    void delay();

    unsigned char num=time,i;

    for(i=0;i<2;++i)

    {

        P2=wei[i];

        P0=duan[num%10];

        delay();

        P0=0x00;

        num/=10;

    }

}

void delay()

{

    int i;

    for(i=1000;i;i--);

}

void show_light()

{

    if(flag)

    {

        if(!time)

        {

            flag=0;

            red=1;

            green=0;

            time=35;

        }

    }

    else

    {

        if(time>0&&time<4)

        {

            green=1;

            yellow=0;

        }       

        if(!time)

        {

            yellow=1;

            red=0;

            flag=1;

            time=35;

        }

    }

}

void dec_sec() interrupt 1

{

    static count=0;

    TH0=(65536-50000)/256;

    TL0=(65536-50000)%256;

    if(++count==20)

    {

        count=0;

        time--;

    }

}