基于51单片机的交通灯_可调时间_夜间+紧急模式

news2024/12/28 12:59:48

51单片机交通灯

  • 1 讲解视频:
  • 2 功能要求
  • 3 仿真图:
  • 4 原理图+PCB
  • 5 实物图
  • 6 程序设计:
  • 7 设计报告
  • 8 资料清单(提供资料清单所有文件):
    • 设计资料下载链接:

51单片机简易交通灯_可调时间_夜间+紧急

仿真+代码+原理图PCB+报告+讲解

仿真图proteus 7.8以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:J030

1 讲解视频:

包含仿真讲解和实物演示

基于51单片机的交通灯proteus实物设计

2 功能要求

基于51单片机的交通灯设计

本设计基于AT89C51/52(与AT89S51/52、STC89C51/52通用,可替换其他51内核)单片机

1.正常模式工作状态:

状态1:东西方向绿灯通行20秒,南北方向禁止通行25秒;

状态2:东西方向黄灯闪烁提醒5秒,南北继续红灯倒计时;

状态3:南北方向绿灯通行30秒,东西红灯禁止通行35秒,分别通过数码管倒计时;

状态4:南北方向黄灯闪烁提醒5秒,东西继续红灯倒计时;

状态5:执行状态1,反复循环。

\2. 紧急模式

南北方向和东西方向红灯常亮禁止通行。数码管显示00。

\3. 夜间模式

南北方向和东西方向黄灯闪烁。

\4. 可以通过按键调东西/南北方向绿灯时间。切换键切换方向,加减键调整时间。

3 仿真图:

正常倒计时

imgimg

夜间黄灯闪烁

4 原理图+PCB

img

img

img

img

5 实物图

img

6 程序设计:

img
代码

#include <reg51.h>				//头文件
#define uchar unsigned char
#define uint  unsigned int		//宏定义

uchar data buf[4];					//秒显示的变量
uchar data sec_dx=20;  			//东西数默认
uchar data sec_nb=30;			//南北默认值
uchar data set_timedx=20;		//设置东西方向的时间
uchar data set_timenb=30;		//设置南北方向的时间
int n;
uchar data countt0,countt1;//定时器0中断次数
//定义6组开关
sbit  k4=P3^7;      //切换方向
sbit  k1=P3^5;		//时间加
sbit  k2=P3^6;		//时间减
sbit  k3=P3^4;		//确认
sbit  k5=P3^1;		//禁止
sbit  k6=P1^5;		//夜间模式
部分代码,不完整,完全代码在压缩包main函数
//https://docs.qq.com/doc/DS3Zab1lNU0d2QVZt

sbit Red_nb=P2^6;		//南北红灯标志
sbit Yellow_nb=P2^5;	//南北黄灯标志
sbit Green_nb=P2^4;     //南北绿灯标志

sbit Red_dx=P2^3;		//东西红灯标志
sbit Yellow_dx=P2^2;	//东西黄灯标志
sbit Green_dx=P2^1;		//东西绿灯标志
		
bit set=0;				//调时方向切换键标志 =1时,南北,=0时,东西
bit dx_nb=0;			//东西南北控制位
bit shansuo=0;			//闪烁标志位
bit yejian=0;			//夜间黄灯闪烁标志位

uchar code table[11]={	//共阴极字型码
	0x3f,  //--0
	0x06,  //--1
	0x5b,  //--2
	0x4f,  //--3
	0x66,  //--4
	0x6d,  //--5
	0x7d,  //--6
	0x07,  //--7
	0x7f,  //--8
	0x6f,  //--9
	0x00   //--NULL
};

//函数的声明部分
void delay(int ms);			//延时子程序
void key();					//按键扫描子程序
void display();				//显示子程序
void logo();   				//开机LOGO
//主程序
void main()
{
	TMOD=0X11;	   				//定时器设置
	TH1=0X3C;		
	TL1=0XB0;
	TH0=0X3C;					//定时器0置初值 0.05S
	TL0=0XB0;
	EA=1;						//开总中断
	ET0=1;						//定时器0中断开启
	ET1=1;					   //定时器1中断开启
	TR0=1;						//启动定时0
	TR1=0;						 	//关闭定时1
    logo();						//开机初始化
	P2=0Xc3;					// 开始默认状态,东西绿灯,南北黄灯   
    sec_nb=sec_dx+5; 			//默认南北通行时间比东西多5秒
	while(1)					  //主循环
	{	 
		key(); 					//调用按键扫描程序
		display(); 				//调用显示程序
	}	
}
//函数的定义部分
void key(void)	//按键扫描子程序
{	 
	if(k1!=1)							//当K1(时间加)按下时
	{
		display();       				//调用显示,用于延时消抖
		if(k1!=1)							//如果确定按下
		{
		  	TR0=0;	       				//关定时器	
			shansuo=0;					//闪烁标志位关
			P2=0x00;					//灭显示
			TR1=0;							//启动定时1
			if(set==0){//设置键按下
				set_timedx++;   		//南北加1S
			}else{
				set_timenb++;    		//东西加1S
			}
			if(set){
				Red_nb=1;		//南北红灯标志
				Yellow_nb=1;	//南北黄灯标志
				Green_nb=1;     //南北绿灯标志
			}else{
				Red_dx=1;		//东西红灯标志
				Yellow_dx=1;	//东西黄灯标志
				Green_dx=1;     //东西绿灯标志
			}
			if(set_timenb==100)
				set_timenb=1;
			if(	set_timedx==100)
				set_timedx=1;   		//加到100置1
			sec_nb=set_timenb ; 		//设置的数值赋给东西南北
			sec_dx=set_timedx;			
		  	do
		 	{ 
				display();				 //调用显示,用于延时
			}
			while(k1!=1);			 //等待按键释放
		}
	}

	if(k2!=1)							//当K2(时间减)按键按下时
	{		
		display();       				//调用显示,用于延时消抖  
		if(k2!=1)						//如果确定按下
		{	
		 	TR0=0;         				//关定时器0	
			shansuo=0;					//闪烁标志位关
			P2=0x00;					//灭显示
			TR1=0;						//关定时器1	
			if(set==0){//设置键按下
				set_timedx--;   		//南北减1S
			}else{
				set_timenb--;    		//东西减1S
			}
			if(set){
				Red_nb=1;		//南北红灯标志
				Yellow_nb=1;	//南北黄灯标志
				Green_nb=1;     //南北绿灯标志
			}else{
				Red_dx=1;		//东西红灯标志
				Yellow_dx=1;	//东西黄灯标志
				Green_dx=1;     //东西绿灯标志
			}
			if(set_timenb==0)
				set_timenb=99;	
			if(	set_timedx==0 )
				set_timedx=99;   		//减到1重置99
			sec_nb=set_timenb ;	 		//设置的数值赋给东西南北
			sec_dx=set_timedx;
		  	do	
		    { 
				display();       		//调用显示,用于延时
			}
			while(k2!=1);			   //等待按键释放
		}
	}

	if(k3!=1)							//当K3(确认)键按下时
	{	
		display();       				//调用显示,用于延时消抖
		if(k3!=1)						//如果确定按下
		{
			TR0=1;  						//启动定时器0
			sec_nb=set_timenb;				//从中断回复,仍显示设置过的数值
			sec_dx=set_timedx;				//显示设置过的时间
			TR1=0;							//关定时器1	
			if(set==0)						//时间倒时到0时
			{ 
				P2=0X00;					 //灭显示
				Green_dx=1;						//东西绿灯亮
				Red_nb=1;					//南北红灯亮
				sec_nb=sec_dx+5; 			//回到初值
			}
			else 
			{ 
				P2=0x00;					//南北绿灯,东西红灯
				Green_nb=1;
				Red_dx=1;
				sec_dx=sec_nb+5; 
			}
		}
	}
	 
	if(k4!=1)							//当K4(切换)键按下
    {
		display();       				//调用显示,用于延时消抖
		if(k4!=1)						//如果确定按下
		{ 
			P2=0X00;					 //灭显示
		 	TR0=0;						//关定时器0	
			set=!set;					//取反set标志位,以切换调节方向
			TR1=0;						//关定时器1
			dx_nb=set;
			if(set){
				Red_nb=1;		//南北红灯标志
				Yellow_nb=1;	//南北黄灯标志
				Green_nb=1;     //南北绿灯标志
			}else{
				Red_dx=1;		//东西红灯标志
				Yellow_dx=1;	//东西黄灯标志
				Green_dx=1;     //东西绿灯标志
			}
			do
			{
				display(); 			   //调用显示,用于延时
			}				
			while(k4!=1);			  //等待按键释放
		}
	}	

	if(k5!=1)							//当K5(禁止)键按下时
	{
	   	display();       				//调用显示,用于延时消抖
	   	if(k5!=1)						//如果确定按下
	   	{ 	
	    	TR0=0;						//关定时器
			P2=0x00;					//灭显示
			Red_dx=1;
			Red_nb=1;					//全部置红灯
			TR1=0;
			sec_dx=00;					//四个方向的时间都为00
			sec_nb=00;
			do
			{
				display(); 				//调用显示,用于延时
			}	
			while(k5!=1);			//等待按键释放	
	   	}
	}
	if(k6!=1)							//当K6(夜间模式)按下 
	{
	   	display();       				//调用显示,用于延时消抖 
	   	if(k6!=1)						//如果确定按下
	   	{ 	
	    	TR0=0;						//关定时器
			P2=0x00;
			TR1=1;
			sec_dx=00;					//四个方向的时间都为00
			sec_nb=00;
			do
			{
				display(); 			  //调用显示,用于延时
			}	
			while(k6!=1);			//等待按键释放	
	   	}
	}
}
void display(void) //显示子程序
{		
	buf[1]=sec_nb/10; 		//第1位 东西秒十位
	buf[2]=sec_nb%10; 		//第2位 东西秒个位
	buf[3]=sec_dx/10; 		//第3位 南北秒十位
	buf[0]=sec_dx%10; 		//第4位 南北秒个位		
	P1=0xff;          		// 初始灯为灭的
	P0=0x00;				 灭显示
	P1=0xfe;           		//片选LED1
	P0=table[buf[1]];		//送东西时间十位的数码管编码			
	delay(1);				//延时
	P1=0xff;				//关显示
	P0=0x00;				//灭显示
						   
	P1=0xfd;             	//片选LED2
	P0=table[buf[2]];		 //送东西时间个位的数码管编码
	delay(1);				 //延时
	P1=0xff;				//关显示
	P0=0x00;				//关显示
	P1=0Xfb;		  		//片选LED3
	P0=table[buf[3]];		//送南北时间十位的数码管编码
	delay(1);				//延时
	P1=0xff;				 //关显示
	P0=0x00;				 //关显示
	P1=0Xf7;				 //片选LED4	
	P0=table[buf[0]];		//送南北时间个位的数码管编码
	delay(1);				//延时
}

void time0(void) interrupt 1 using 1  	//定时中断子程序
{
	TH0=0X3C;							//重赋初值
	TL0=0XB0;							//12m晶振50ms//重赋初值
	TR0=1;								//重新启动定时器
	countt0++;							//软件计数加1
	if(countt0==10)						//加到10也就是半秒
	{
		if((sec_nb<=5)&&(dx_nb==0)&&(shansuo==1))  		//东西黄灯闪		
        {
			Green_dx=0;
			Yellow_dx=0;
		}		   				
	    if((sec_dx<=5)&&(dx_nb==1)&&(shansuo==1))  		//南北黄灯闪		
        {  
			Green_nb=0;
			Yellow_nb=0;
		}	
	}
		
	if(countt0==20)	                  	// 定时器中断次数=20时(即1秒时)
	{	countt0=0;						//清零计数器
		sec_dx--;						//东西时间减1
		sec_nb--;						//南北时间减1

		if((sec_nb<=5)&&(dx_nb==0)&&(shansuo==1))  		//东西黄灯闪		
        {
			Green_dx=0;
			Yellow_dx=1;
		}		   				
	    if((sec_dx<=5)&&(dx_nb==1)&&(shansuo==1))  		//南北黄灯闪		
        {  
			Green_nb=0;
			Yellow_nb=1;
		}		 						
		if(sec_dx==0&&sec_nb==5) 		//当东西倒计时到0时,重置5秒,用于黄灯闪烁时间   
		{
			sec_dx=5;
			shansuo=1;
		}
		if(sec_nb==0&&sec_dx==5)		//当南北倒计时到0时,重置5秒,用于黄灯闪烁时间   
		{
			sec_nb=5;
			shansuo=1;
		}
		if(dx_nb==0&&sec_nb==0)			//当黄灯闪烁时间倒计时到0时,
		{
			P2=0x00;					//重置东西南背方向的红绿灯
			Green_nb=1;
			Red_dx=1;
			dx_nb=!dx_nb;
			shansuo=0;
			sec_nb=set_timenb;			//重赋南北方向的起始值
			sec_dx=set_timenb+5;		//重赋东西方向的起始值
		}		
		if(dx_nb==1&&sec_dx==0)			//当黄灯闪烁时间到
		{
			P2=0X00;					//重置东西南北的红绿灯状态
			Green_dx=1;					 //东西绿灯亮
			Red_nb=1;					 //南北红灯亮
			dx_nb=!dx_nb;				 //取反
			shansuo=0;					//闪烁
			sec_dx=set_timedx;			//重赋东西方向的起始值
			sec_nb=set_timedx+5;		//重赋南北方向的起始值
		}
	}	
}

系统硬件框图

img

7 设计报告

13017字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试、结论等

img

8 资料清单(提供资料清单所有文件):

0、常见使用问题及解决方法–必读!!!!
10、讲解视频
1、仿真图
2、程序源码
3、功能要求
4、原理图和PCB
5、开题报告
6、元器件清单
7、设计报告
8、软硬件流程框图
9、实物图片和说明
Altium Designer 安装破解
KEIL+proteus 单片机仿真设计教程
KEIL安装破解
Proteus元器件查找
Proteus安装
Proteus简易使用教程
单片机学习资料
相关数据手册
答辩技巧
设计报告常用描述
鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

img

设计资料下载链接:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1277433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三、Linux高级命令

目录 1、重定向命令 1.1 重定向 > 1.2 重定向 >> 该章节的所有操作都在/export/data/shell目录进行&#xff0c;请提前创建该目录。 mkdir -p /export/data/ 1、重定向命令 1.1 重定向 > Linux 允许将命令执行结果重定向到一个文件&#xff0c;本应显示在…

「Verilog学习笔记」自动贩售机1

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 自动贩售机中可能存在的几种金额&#xff1a;0&#xff0c;0.5&#xff0c;1&#xff0c;1.5&#xff0c;2&#xff0c;2.5&#xff0c;3。然后直接将其作为状态机的几种状…

HTTP 基本概念(计算机网络)

一、HTTP 是什么&#xff1f; HTTP(HyperText Transfer Protocol) &#xff1a;超文本传输协议。 HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。 「HTTP 是用于从互联网服务器传输超文本到本地浏览器的协议…

接口测试工具:Jmeter详解

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本 目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – C…

仿真的整体框架和类图设计

之前的写的模拟代码没有模块&#xff0c;没有对象&#xff0c;写的逻辑结构也很混乱。我花了些时间进行整理&#xff0c;首先所有的类如下图 在管理类中有统一的管理类的接口 &#xff0c;提供所有管理类的虚拟初始化和关闭方法 然后事件的管理类 我希望在这个类中管理所有的脉…

匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参

文章目录 &#x1f680;前言&#x1f680;结构体✈️结构体类型的声明✈️结构体变量的创建与初始化✈️结构体类型的特殊声明✈️结构体的自引用✈️结构体的内存对齐&#x1f681;修改默认对齐数 ✈️结构体传参 &#x1f680;前言 在C语言中有着各种数据类型&#xff0c;这…

服务注册发现 配置中心 springcloud alibaba nacos

文章目录 0100 系统环境0200 nacos安装0201 下载0202 安装 0300 工程说明0301 结构说明0302 运行效果 0400 代码说明0401 服务提供者&#xff08;Provider Service&#xff09;0402 服务消费者&#xff08;Consumer Service&#xff09;服务提供者SDK&#xff08;Provider Serv…

应用商店优化之利用季节性提高应用曝光

在应用商店中利用季节性优化&#xff0c;是提高应用和游戏的曝光度以及应用商店转化率的最有效策略之一。 1、季节性的影响。 用户消费来自许多不同渠道的新闻和信息&#xff0c;这会影响他们做出决策的方式。比如在节日期间&#xff0c;当用户寻找购物类型的应用时&#xff0…

springboot数据格式验证——自定义日期格式验证及list验证

我们在工作中经常需要对日期格式进行定义&#xff0c;如果客户端传来的日期字符串不符合要求&#xff0c;那么根本无法保存&#xff0c;但是已有的注解并没有日期格式的验证&#xff0c;那我们就自己实现一个 一、自定义日期格式验证的注解DateFormat import javax.validatio…

Linux--初识和基本的指令(3)

目录 1.前言 1.指令 1.1 cat指令 1.2 echo指令 1.3 more 指令 1.4 less指令 1.5 什么时候使用less和more 1.6 head指令 1.7 tail指令 1.8 wc指令 1.9 与时间相关的指令 1.9.1 date指令 1.9.2 cal指令 1.10 16.find指令&#xff1a;&#xff08;灰常重要&#x…

熬夜会秃头——beta冲刺Day7

这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标记录beta冲刺Day7团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 一、团队成员会议总结 1、成员工作…

蓝桥杯算法心得——小郑躲太阳(思维推导)

大家好&#xff0c;我是晴天学长&#xff0c;一道与平时的题型截然不同的题型&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .小郑躲太阳 问题描述 小郑一觉醒来发现起晚啦!现在需要从家里飞速前往公司…

服装行业中小企业零售数字化转型的工作目标和主要实施路径|徐礼昭

目标1&#xff1a;实现“人、货、场”的在线化和经营数字化 实施路径&#xff1a;中小企业可以选择商派的微信小程序商城系统&#xff0c;结合导购助手小程序&#xff0c;实现业务在线化&#xff0c;导购在线化&#xff0c;通过微信公众号、企微社群和视频号&#xff0c;开展私…

synchronized和volatile的区别是什么?

synchronized和volatile是Java中的两个关键词&#xff0c;分别用于实现线程同步和线程间的可见性。 synchronized用于实现线程之间的互斥同步&#xff0c;即同一时刻只能有一个线程访问被synchronized修饰的代码块或方法&#xff0c;其他线程需要等待。synchronized确保了线程…

在Android上搭建一个NDK项目

首先New Project&#xff0c;选择Native C&#xff0c;点击Next。 填入项目名称和包名&#xff0c;点击Next。 这里我们选择Cmake默认的C版本。 创建好的项目目录&#xff0c;里面比我们正常的Android项目多了一个cpp目录 打开MainActivity。里面定义了一个jni方法stringFromJN…

SOCKET、TCP、HTTP之间的区别与联系

SOCKET、TCP、HTTP之间的区别与联系 一、 Socket 1、什么是socket2、为什么需要socket3、建立socket连接 二、HTTP(基于TCP) 1、HTTP的概念2、HTTP连接的特点 连接请求&#xff1a;一次连接连接请求&#xff1a;短连接(socket是长连接) 三、TCP/IP协议簇 四、HTTP、Socket…

Linux中shell的运行原理

在Linux中&#xff0c;每次输入命令时&#xff0c;前面都会出现一串字母&#xff0c;我们称之为命令行提示符 实际上&#xff0c;命令行提示符是一种外壳程序 外壳程序的概念&#xff1a; 前面我们提到过&#xff0c;在Linux中&#xff0c;一切皆文件&#xff0c;所谓的命令就…

linux设置权限_setfacl_getfacl

3.2 设置权限ACL&#xff08;access control list&#xff09; 假设&#xff1a;/data所有者与所属组均为root&#xff0c;在不改变所有者的前提下&#xff0c;要求用户tom对该目录有完全访问权限&#xff08;rwx&#xff09;。只能考虑&#xff1a; 方法一&#xff1a;给/dat…

Spring AOP记录接口访问日志

Spring AOP记录接口访问日志 介绍应用范围组成通知&#xff08;Advice&#xff09;连接点&#xff08;JoinPoint&#xff09;切点&#xff08;Pointcut&#xff09;切面&#xff08;Aspect&#xff09;引入&#xff08;Introduction&#xff09;织入&#xff08;Weaving&#x…

003、应用程序框架-UIAbility

之——UIAbility 目录 之——UIAbility 杂谈 正文 1.UIAbility 2.基本使用 2.1 创建Ability工程 2.2 添加基础功能 2.3 新建页面 2.4 页面间的跳转 3.生命周期 总结 杂谈 UIAbility&#xff0c;其中的页面创建、页面间的跳转、数据传递、生命周期。 正文 1.UIAbil…