51单片机——交通指示灯控制器设计

设计目标

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仿真已上传(也可以私信获取),大家可以将代码烧入仿真里面进行相关实验,也可以自己搭建硬件电路进行测试,后面会给大家更新相关的硬件电路以及其他小项目

相关推荐
LCG元几秒前
STM32L4 STOP2 模式下 LPUART 串口唤醒:三种唤醒方式实测对比与避坑指南
stm32·单片机·嵌入式硬件
luj_17683 分钟前
毒素驱动的生物自毁机制探析
服务器·c语言·开发语言·经验分享·算法
意法半导体STM328 分钟前
【官方原创】STM32CubeMX2 1.1.0新版本发布
stm32·单片机·嵌入式硬件·mcu
周洲083012 分钟前
【无标题】STM32 串口 Printf 重定向|标准库 + HAL库 两套极简通用代码(无需MicroLIB)
stm32·单片机·嵌入式硬件
深圳市恒锐丰科技杨生27 分钟前
EG27324 2.8‑20V 双通道低侧栅极驱动芯片|带 SD 逐周关断外置 MOS 驱动方案
嵌入式硬件·硬件工程
Brilliantwxx1 小时前
【STM32】初步了解GPIO 从引脚到工作模式的完整拆解
单片机·嵌入式硬件
AOI小白新手上路1 天前
江科协51单片机 17-2 红外遥控电机调速实验调试总结
单片机·嵌入式硬件·51单片机
oshan20121 天前
零基础STM32入门教程--10-PWM 呼吸灯
stm32·单片机·嵌入式硬件
记帖1 天前
STM32C5A3R开发(7)----ADC电压采集
嵌入式硬件·adc·dac·stm32cubeide·stm32c5·stm32cubemx2·stm32c5a3rgt6
自小吃多2 天前
器件移动、旋转、镜像、对齐、等间距操作笔记
笔记·嵌入式硬件