设计目标
1、设计一交通灯控制,控制东西方向的红、黄、绿灯和南北方向的红、黄、绿灯。
2、可手动控制和自动控制,设置两个输入控制开关。
手动/自动开关,通过P11的按键输入控制
3、手动:设置开关P11,两种情况:红灯管制(各方向)红灯,和各个方向都是黄灯闪烁(周期2S)
4、自动:东西绿灯亮5S,南北红灯亮5S;东西黄灯亮3S,南北红灯亮3S;东西红灯亮5S,南北绿灯亮5S;东西红灯亮3S,南北黄灯亮3S:然后重复刚才过程,不断循环。
硬件设计

东西向:红灯:P2_0 绿灯:P2_1 黄灯:P2_2
南北向:红灯:P2_5 绿灯:P2_6 黄灯:P2_7
按键: P1_0 P1_1
代码实现
软件延时
c
void Delay20ms(void) //@11.0592MHz,用于按键消抖
{
unsigned char data i, j;
i = 216;
j = 37;
do
{
while (--j);
} while (--i);
}
按键部分
c
void key_read()
{
if(P1_0 == 0)
{
Delay20ms();
if(P1_0 == 0)
{
mode++;
time = 0;
sec = 0;
}
while(!P1_0);
}
if(P1_1 == 0)
{
Delay20ms();
if(P1_1 == 0)
{
flag++;
time = 0;
sec = 0;
}
while(!P1_1);
}
}
定时器计时部分
c
void Timer0_Init(void) //定时器初始化,10ms
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xF0; //设置定时初始值
TH0 = 0xD8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1; //使能总中断
}
void Timer0_Isr(void) interrupt 1
{
TL0 = 0xF0; //设置定时初始值
TH0 = 0xD8; //设置定时初始值
}
总代码
c
#include <REGX52.H>
#include "intrins.h"
/宏定义/
sbit WE_RED = P2^0;//WE相关的为东西向
sbit WE_GREEN = P2^1;
sbit WE_YELLOW = P2^2;
sbit NS_RED = P2^5;//NS相关的为南北向
sbit NS_GREEN = P2^6;
sbit NS_YELLOW = P2^7;
/变量定义区/
unsigned char temp = 0;
unsigned char mode = 0;//手动/自动模式切换标志位
unsigned char flag = 0;//手动模式中两个模式切换标志位
unsigned int time,sec;
//函数声明区//
void Timer0_Init(void);
void Delay20ms(void);
void key_read();
void main()
{
Timer0_Init();
while(1)
{
key_read();
if(mode == 1)
{
if(flag == 0)
{
WE_RED = 0;
NS_RED = 0;
WE_GREEN = 1;
WE_YELLOW = 1;
NS_GREEN = 1;
NS_YELLOW = 1;
}
}
if(mode == 2)mode = 0;
if(flag == 2)flag = 0;
}
}
void Timer0_Init(void) //10毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xF0; //设置定时初始值
TH0 = 0xD8; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
void Timer0_Isr(void) interrupt 1
{
TL0 = 0xF0; //设置定时初始值
TH0 = 0xD8; //设置定时初始值
time++;
if(time == 100){sec++;time = 0;}
if(mode == 0)
{
if(sec<=5&&sec>0)
{
WE_RED = 0;
NS_RED = 1;
WE_GREEN = 1;
WE_YELLOW = 1;
NS_GREEN = 1;
NS_YELLOW = 1;
}
if(sec <= 10 && sec >5)
{
WE_RED = 1;
NS_RED = 0;
}
if(sec <= 13 && sec > 10)
{
NS_RED = 1;
WE_YELLOW = 0;
}
if(sec <= 16 && sec > 13)
{
WE_YELLOW = 1;
NS_RED = 0;
}
if(sec <= 21 && sec > 16)
{
NS_RED = 1;
WE_RED = 0;
}
if(sec <= 26 && sec > 21)
{
WE_RED = 1;
NS_RED = 0;
}
if(sec <= 29 && sec > 26)
{
NS_RED = 1;
WE_RED = 0;
}
if(sec <= 32 && sec > 29)
{
WE_RED = 1;
NS_YELLOW = 0;
}
if(sec > 32)
{
NS_YELLOW = 1;
sec = 0;
}
}
if(mode == 1&&flag == 1)
{
if(sec<=2)
{
NS_YELLOW = 0;
WE_YELLOW = 0;
NS_GREEN = 1;
WE_GREEN = 1;
WE_RED = 1;
NS_RED = 1;
}
if(sec>2 && sec <= 4)
{
NS_YELLOW = 1;
WE_YELLOW = 1;
}
if(sec>4)sec = 0;
}
}
void key_read()
{
if(P1_0 == 0)
{
Delay20ms();
if(P1_0 == 0)
{
mode++;
time = 0;
sec = 0;
}
while(!P1_0);
}
if(P1_1 == 0)
{
Delay20ms();
if(P1_1 == 0)
{
flag++;
time = 0;
sec = 0;
}
while(!P1_1);
}
}
void Delay20ms(void) //@11.0592MHz
{
unsigned char data i, j;
i = 216;
j = 37;
do
{
while (--j);
} while (--i);
}
代码目前在硬件上面没有问题,由于社区上传视频较为麻烦,Proteus仿真已上传(也可以私信获取),大家可以将代码烧入仿真里面进行相关实验,也可以自己搭建硬件电路进行测试,后面会给大家更新相关的硬件电路以及其他小项目