历史上的今天
返回首页

历史上的今天

今天是:2025年08月11日(星期一)

正在发生

2021年08月11日 | 基于LPC2138控制的双向交通信号灯 (最后3s绿灯闪烁)

2021-08-11 来源:eefocus

/****************************************************************************

* File:Main.C

* 功能:计数器,通过两个按键来控制加减计数器,并输出数码管显示.。

****************************************************************************/

#include  "config.h"

#include  "Math.h"

#define CON 0x00ffffff    //控制P0.0~P0.23作为输出引脚

#define SW1 (1<<30)

#define SW2 0x80000000


/****************************************************************************

* 名称:DelayNS()

* 功能:长软件延时

* 入口参数:dly        延时参数,值越大,延时越久

* 出口参数:无

****************************************************************************/


void  delay(uint32  dly)

   uint32  i;


   for(; dly>0; dly--)

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

}


void clear_All()//将两个方向的信号灯熄灭,数码管清零

{

    IO0CLR = CON;

    //直到开关SW2恢复高电平,再重新开始工作

    while(1)

    {

        if((IO0PIN & SW2) == SW2)//如果P0.31 = 1

        {

            break;

        }

    }

}


void yellow_Light()//夜间模式

{

    PINSEL0 = 0;//P0.0-15为GPIO

    PINSEL1 = 0;//P0.16-31为GPIO

    IO0DIR = CON;

    IO0CLR = CON;

    while(1)

    {

        if((IO0PIN & SW1) == SW1)//如果P0.30 = 1

        {

            break;

        }

        else if((IO0PIN & SW1) == 0)//如果P0.30 = 0

        {

            //开关SW2监测点

            if((IO0PIN & SW2) == 0)//如果P0.31 = 0,关闭信号系统

            {

                clear_All();

            }

            //P0.17, P0.20 高低电平变化

            IO0SET = 0x120000;

            delay(1000);

            IO0CLR = 0x120000;

            delay(1000);

        }

    }

}


int  main()

{

    int temp1;

    int flag;//区分第一个灯是红灯还是绿灯,1代表红灯,2代表绿灯

    int judge;//若另一个信号灯黄灯亮,judge=1,否则为0

    //开关SW1监测点

    if((IO0PIN & SW1) == 0)//如果P0.30 = 0,进入夜间模式

    {

        yellow_Light();

    }

    //开关SW2监测点

    if((IO0PIN & SW2) == 0)//如果P0.31 = 0,关闭信号系统

    {

        clear_All();

        goto Start;

    }

Start:

    temp1 = 15;

    flag = 1;

    judge = 0;

    PINSEL0 = 0;//P0.0-15为GPIO

    PINSEL1 = 0;//P0.16-31为GPIO

    IO0DIR = CON;

    IO0CLR = CON;

    //开始时红灯亮,置P0.16 = 1

    //另一方向绿灯亮,置P0.21 = 1

    IO0SET = 0x210000;

    while(1)

    {    

        IO0CLR = 0xffff;

        IO0SET = 16*(temp1/10) + temp1%10;

        if(flag == 1 && judge == 0)//红灯周期,另一信号为绿灯周期 

        {

            IO0SET = (16*((temp1 - 3)/10) + (temp1 - 3) %10) * pow(16,2);

        }

        else if(flag == 2)//绿灯周期,另一信号为红灯周期

        {

            IO0SET = (16*((temp1 + 3)/10) + (temp1 + 3) %10) * pow(16,2);

        }

        if(temp1 < 3 && flag == 1)//红灯最后3秒

        {

            //另一方向黄灯亮 P0.20 = 1    + 绿灯灭 P0.21 = 0

            judge = 1;

            IO0SET = 0x100000;//另一方向黄灯亮 P0.20 = 1

            IO0CLR = 0x200000;//另一方向绿灯灭 P0.21 = 0

            IO0SET = (16*(temp1/10) +temp1%10) * pow(16,2);//另一方向黄灯倒计时

        }

        temp1--;

        delay(500);

        if(temp1 < 2 && flag == 2)//绿灯 02 01 00s闪烁

        {

            IO0CLR = 0x40000; //绿灯灭,P0.18 = 0

        }

        if(temp1 < 5 && flag == 1 && judge == 0)//另一信号绿灯最后3秒

        {

            IO0CLR = 0x200000;//另一方向绿灯灭,P0.21 = 0

        }

        delay(500);

        if(temp1 < 2 && flag == 2)//绿灯 02 01 00闪烁

        {

            IO0SET = 0x40000;//绿灯亮,P0.18 = 1

        }

        if(temp1 < 5 && flag == 1 && judge == 0)//另一信号绿灯最后3秒

        {

            IO0SET = 0x200000;//另一方向绿灯亮,P0.21 = 1

        }


        //开关SW1监测点

        if((IO0PIN & SW1) == 0)//如果P0.30 = 0,进入夜间模式

        {

            yellow_Light();

            goto Start;//待开关SW1抬起,夜间模式结束,重新进入白天模式

        }

        //开关SW2监测点

        if((IO0PIN & SW2) == 0)//如果P0.31 = 0,关闭信号系统

        {

            clear_All();

            goto Start;

        }

        if(temp1 == -1)

        {

            if(flag == 1)//红灯周期结束

            {

                flag = 2;//标识即将进入绿灯周期

                IO0CLR =0x110000;//红灯灭,P0.16 = 0    另一方向黄灯灭 P0.20 = 0

                IO0SET = 0xC0000;//信号灯变绿灯,P0.18 = 1    另一方向变红灯 P0.19 = 1

                judge = 0;//另一方向黄灯周期结束

                temp1 = 11;//绿灯11s

            }

            else if(flag == 2)//绿灯周期结束

            {

                flag = 1;//标识即将进入红灯周期

                IO0CLR = 0x40000;//绿灯灭,P0.18 = 0


                temp1 =2;//黄灯周期2s

                IO0SET = 0x20000;//黄灯亮,P0.17 = 1

                while(temp1 >= 0)//黄灯周期

                {

                    //开关SW1监测点

                    if((IO0PIN & SW1) == 0)//如果P0.30 = 0,进入夜间模式

                    {

                        yellow_Light();

                        goto Start;//待开关SW1抬起,夜间模式结束,重新进入白天模式

                    }

                    //开关SW2监测点

                    if((IO0PIN & SW2) == 0)//如果P0.31 = 0,关闭信号系统

                    {

                        clear_All();

                        goto Start;

                    }

                    IO0CLR = 0xffff;//清空数码管

                    IO0SET = 16*(temp1/10) + temp1%10;//黄灯周期数码管显示 

                    IO0SET = (16*(temp1/10) + temp1%10) * pow(16,2);//另一信号红灯周期02 01 00数码管显示

                    delay(1000);

                    temp1 --;

                }

                IO0CLR = 0x20000;//黄灯灭,P0.17 = 0


                IO0SET = 0x210000;//信号灯变红灯,P0.16 = 1  另一方向变绿灯 P0.21 = 1

                IO0CLR = 0x80000;//红灯灭 P0.19 = 0

                temp1 = 15;//红灯15s

            }

        }

    }

}

 

 


推荐阅读

史海拾趣

Cantherm公司的发展小趣事

随着环保意识的日益增强,Cantherm公司积极响应国家号召,将环保理念融入产品设计和生产过程中。公司研发出一系列环保型电子产品,采用可降解材料和节能技术,有效降低了产品对环境的影响。这一举措不仅提升了公司的社会形象,还为公司带来了更多的环保项目合作机会。

Curtis Industries公司的发展小趣事

为了进一步扩大市场份额,Curtis Industries公司积极拓展市场布局。公司在全球范围内设立了多个生产基地和研发中心,以便更好地满足不同地区客户的需求。同时,公司还加强了与上下游企业的合作,形成了完整的产业链。这些举措不仅提升了公司的产能和研发实力,还为公司带来了更多的商业机会。

DALLAS公司的发展小趣事

随着全球电子市场的不断扩大和变化,Dallas公司积极实施全球化战略布局。公司在全球范围内设立研发中心和生产基地,以便更好地服务全球客户。同时,Dallas公司还加强与国际知名企业的合作与交流,共同推动半导体技术的创新和应用。这种全球化战略布局不仅增强了Dallas公司的国际竞争力,也为公司的长期发展提供了广阔的空间。

Cristek Interconnects Inc公司的发展小趣事

Cristek Interconnects Inc公司在技术创新和质量管理的双重驱动下,开始积极拓展市场。公司不仅在国内市场取得了显著的成绩,还积极开拓国际市场。通过与国外知名企业的合作,Cristek的产品成功打入国际市场,进一步提升了公司的知名度和影响力。

GE Solid State公司的发展小趣事
由于声音信号的模糊性和主观性,可能无法精确反映曝光量的细微变化。
Base Two (2) Systems公司的发展小趣事

品质是Base Two (2) Systems的生命线。公司始终坚持严格的质量管理体系,从原材料采购到生产制造的每一个环节都进行严格把控。这种对品质的执着追求,使得公司的产品在市场上赢得了客户的广泛信赖。许多客户与公司建立了长期稳定的合作关系,成为公司发展的重要支撑。

问答坊 | AI 解惑

问一下关于放大器的偏置电路

file:///C:/Documents%20and%20Settings/Administrator.4797A7AA28774FE/桌面/未命名.bmp请问这个电路中电感RFC和电容Cbypass值应如何计算,假如放大器的输出频率为5000MHz…

查看全部问答>

[求助]多点温度检测系统

如谁有这方面的材料的   请发给我一下可以么?不一定符合下面的要就的,关于多点温度检测系统的都可以发给me,设计一个多点温度检测系统,系统结构框图如下  : 温度测点1→   →  检测器单元1    ...…

查看全部问答>

如何修改VXWORKS的启动标题

VXWORKS启动时超级终端会打印以下信息: Copyright 1984-1998  Wind River Systems, Inc.             CPU: Motorola ADS - PowerPC 860         VxWorks: 5.4 ...…

查看全部问答>

make问题,如何解决? 困扰很久了,感谢指点

    在嵌入式系统上做Qt串口显示程序 ,make后出现的问题,查了一些资料,有的说是pro里面的HEADERS忘记加就会出现这个问题(具体加什么没说);有的说是出现“undefined reference”表示你缺少*.h        困扰很 ...…

查看全部问答>

vxWorks寄存器读写问题

我现在写不了某些寄存器(就I2C寄存器写不进去,其他都可以) 有遇见这种问题的么? 我是关了MMU的啊~ 情况如下: 我在shell中输入 查看内存0x55000000位置的寄存器。 d 0x55000000 55000000:  0100 0000 0000 0000 0000 0000 00 ...…

查看全部问答>

求购 S3C4510B 的开发板 (二手也可以)

求购 S3C4510B 的开发板 最近找了份4510b的资料,看着不错可惜没有板子练。真是郁闷啊!不知道哪为高手还有收藏! 有的话留个言! 电话:13141280460 qq:406672875…

查看全部问答>

额定电流估算口诀

已知电机功率,如何估算电机的额定电流? 三相二百二电机,千瓦三点五安培。 三相三百八电机,一个千瓦两安培。 三相六百六电机,千瓦一点二安培。 三相三千伏电机,四个千瓦一安培。 三相六千伏电机,八个千瓦一安培。 3KW以下,1个KW,2.5个流…

查看全部问答>

2812的eCAN模块问题

在自测试模式下,想实现从邮箱1发数据给邮箱3,但是运行程序发现TRS寄存器不能置位,信息发不出去,不知道怎么回事。 有没有人遇到过类似情况呢? 程序如下 void InitECan(void) { struct ECAN_REGS ECanaShadow; EALLOW; / ...…

查看全部问答>

[求教]TMS320C5416串口疑问,被卡住很久了!

学习C5416已经很久了,但是进度非常的慢,一个人盲打莽撞。 最近又碰上了个卡了很久的问题:     想用一个串口实现同时输入输出,因为C5416是全双工的。我用5416与TLV2541和TLV5636相接实现信号的输入与输出。     5416一个 ...…

查看全部问答>

The embedded system of the analog design

好书适合数字工程师了解的模拟知识   本书为那些希望掌握基本模拟知识的数字工程师而写,内容包括A/D转换器、D/A转换器、运放、滤波器以及模拟和数字系统集成设计。  本书特别适合那些从事信息家电、工业控制和机电控制系统等模拟/数字 ...…

查看全部问答>