历史上的今天
今天是: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
}
}
}
}
史海拾趣
|
file:///C:/Documents%20and%20Settings/Administrator.4797A7AA28774FE/桌面/未命名.bmp请问这个电路中电感RFC和电容Cbypass值应如何计算,假如放大器的输出频率为5000MHz… 查看全部问答> |
|
如谁有这方面的材料的 请发给我一下可以么?不一定符合下面的要就的,关于多点温度检测系统的都可以发给me,设计一个多点温度检测系统,系统结构框图如下 : 温度测点1→ → 检测器单元1   ...… 查看全部问答> |
|
VXWORKS启动时超级终端会打印以下信息: Copyright 1984-1998 Wind River Systems, Inc. CPU: Motorola ADS - PowerPC 860 VxWorks: 5.4 ...… 查看全部问答> |
|
在嵌入式系统上做Qt串口显示程序 ,make后出现的问题,查了一些资料,有的说是pro里面的HEADERS忘记加就会出现这个问题(具体加什么没说);有的说是出现“undefined reference”表示你缺少*.h 困扰很 ...… 查看全部问答> |
|
我现在写不了某些寄存器(就I2C寄存器写不进去,其他都可以) 有遇见这种问题的么? 我是关了MMU的啊~ 情况如下: 我在shell中输入 查看内存0x55000000位置的寄存器。 d 0x55000000 55000000: 0100 0000 0000 0000 0000 0000 00 ...… 查看全部问答> |
|
求购 S3C4510B 的开发板 最近找了份4510b的资料,看着不错可惜没有板子练。真是郁闷啊!不知道哪为高手还有收藏! 有的话留个言! 电话:13141280460 qq:406672875… 查看全部问答> |
|
在自测试模式下,想实现从邮箱1发数据给邮箱3,但是运行程序发现TRS寄存器不能置位,信息发不出去,不知道怎么回事。 有没有人遇到过类似情况呢? 程序如下 void InitECan(void) { struct ECAN_REGS ECanaShadow; EALLOW; / ...… 查看全部问答> |
|
学习C5416已经很久了,但是进度非常的慢,一个人盲打莽撞。 最近又碰上了个卡了很久的问题: 想用一个串口实现同时输入输出,因为C5416是全双工的。我用5416与TLV2541和TLV5636相接实现信号的输入与输出。 5416一个 ...… 查看全部问答> |
|
The embedded system of the analog design 好书适合数字工程师了解的模拟知识 本书为那些希望掌握基本模拟知识的数字工程师而写,内容包括A/D转换器、D/A转换器、运放、滤波器以及模拟和数字系统集成设计。 本书特别适合那些从事信息家电、工业控制和机电控制系统等模拟/数字 ...… 查看全部问答> |






