AT89C51单片机交通灯仿真图+代码

article/2025/9/18 0:01:09

接上篇万年历,这篇博客也是记录我的实训内容,我们实训有万年历和交通灯。好了不说闲话,上正文。
不知道为何突然发现说原创审核不过,完全手写的,也不知道为何,哭

:在评论有附本人交通灯的图噢,不过我还是建议各位先自己画。噢还要注意图里芯片,双击.hex的路径,可能链接是带本人的,大家要自己编译换成自己的.hex文件路径
在这里插入图片描述

交通灯

  • 一、实验内容
  • 二、电路仿真图
  • 三、代码
  • 四、效果图
    • 1.状态1
    • 2.状态2
    • 3.按键
  • 五、最后

一、实验内容

模拟简单交通灯工作情况:
1、当单片机开始工作后,东西和南北各方向分别采用2个数码管显示倒计时间(倒计时时间可自行设定,这里我设的总共50s)。
状态1(前25s):初始状态为东西方向为绿灯、南北方向为红灯,红灯时间为25秒,绿灯时间20s-t(t是指蓝灯的时间,是自己设置的,比如我蓝灯如果设置的是10s那么绿灯的时间就是10s),绿灯之后为ts蓝灯结束后为5s的黄灯,总共25s时间,之后变为状态2。
南北:红25s
东西:绿20-ts——蓝ts——黄5s
状态2(后25s):南北方向为绿灯、东西方向为红灯,红灯时间为25s,绿灯还是20s-t,上文讲的同样,绿灯结束变蓝灯ts,蓝灯结束后为黄灯5s,总计25s,之后又重返状态1,以此循环
东西:红25s
南北:绿20-ts——蓝ts——黄5s
2、设置三个紧急按键,特殊情况时按下紧急按键人为设置亮灯时间,分别为南北禁行东西通行、东西禁行南北通行、全部禁行。

二、电路仿真图

这里用的是isis画,代码用keil4编译
在这里插入图片描述
https://download.csdn.net/download/kushe123/19286087?spm=1001.2014.3001.5503,本人仿真图连接,记得换仿真图AT89C51芯片中的.hex文件。
在这里插入图片描述
图中所用的器件(这里用的都是共阳LED,CA)

三、代码

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar shuzi[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //共阳无小数点
//P0控制LED灯是否亮
sbit ew_red=P0^0;        //东西红灯,低电平亮
sbit ew_yellow=P0^1;   
sbit ew_green=P0^2;
sbit sn_red=P0^3;
sbit sn_yellow=P0^4;
sbit sn_green=P0^5;
sbit ew_led=P0^6;
sbit sn_led=P0^7;
//p2口控制段码
sbit P2_0=P0^0;  
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7; 
//控制数码管位码
sbit P1_0=P1^0; //p1_0,p1_1控制东西灯位码
sbit P1_1=P1^1;
sbit P1_2=P1^2; //p1_2,p1_3控制南北灯位码
sbit P1_3=P1^3;
sbit P1_4=P1^4;	//p1_4,p1_5控制左转数码管位码
sbit P1_5=P1^5;
//按键
sbit left_add=P3^0;
sbit left_reduce=P3^1;
sbit P3_2=P3^2; //东西通行按键
sbit P3_3=P3^3; //南北通行按键
sbit P3_4=P3^4; //全部禁止按键
sbit sn_reduce=P3^5;  
sbit ew_reduce=P3^6;
//定义变量
int left;
int leftadd=0;
int leftreduce=0;
int ewadd=0;
int ewreduce=0;
int snadd=0;
int snreduce=0;
int s=0,n=0;void time(void) interrupt 1 //中断,产生1s
{TH0=(65536-50000)/256;		//0.05s=50msTL0=(65536-50000)%256;n++;if(n==20){n=0;s++;}if(s==50)s=0;
}
void sn_letf()	  //东西红灯南北(绿灯,左转灯)
{sn_led=0;ew_led=1;ew_red=0;ew_yellow=1;ew_green=1;sn_red=1;sn_yellow=1;sn_green=1;
}
void ew_letf()	  //东西(绿灯,左转灯)南北红灯
{sn_led=1;ew_led=0;ew_red=1;ew_yellow=1;ew_green=1;  //低电平亮sn_red=0;sn_yellow=1;sn_green=1;
}
void ew_allow()		   //东西绿灯南北红灯
{sn_led=1;ew_led=1;ew_red=1;ew_yellow=1;ew_green=0;  //低电平亮sn_red=0;sn_yellow=1;sn_green=1;
}
void ew_wait()		   //东西黄灯南北红灯
{sn_led=1;ew_led=1;ew_red=1;ew_yellow=0;ew_green=1;sn_red=0;sn_yellow=1;sn_green=1;
}
void sn_allow()		   //东西红灯南北绿灯
{sn_led=1;ew_led=1;ew_red=0;ew_yellow=1;ew_green=1;sn_red=1;sn_yellow=1;sn_green=0;
}
void sn_wait()			//东西红灯南北黄灯
{sn_led=1;ew_led=1;ew_red=0;  //低电平亮ew_yellow=1;ew_green=1;sn_red=1;sn_yellow=0;sn_green=1;
}void delay()
{	 int i;int j;for(i=0;i<100;i++)for(j=0;j<10;j++);
}
void chushi()			 //P1初始化
{P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=0;P1_5=0;
}void jinzhi()			 //按下禁止按钮后四个方向都禁止(都为红灯) 且时间显示为99
{chushi();P2=shuzi[9]; //段码P1_0=1;P1_2=1; P1_4=1;delay();chushi();P1_1=1;  P1_3=1;P1_5=1;ew_red=0;ew_yellow=1;ew_green=1;sn_red=0;sn_yellow=1;sn_green=1;sn_led=1;ew_led=1;delay();
}
void display_led()		  //led灯显示
{if(s<=20-left)ew_allow();  //东西绿灯南北红灯else if(s<=20)   ew_letf();		   //东西(绿灯,左转灯)南北红灯else if(s<=25)   //5sew_wait();		   //东西黄灯南北红灯else if(s<=45-left)sn_allow();	 //东西红灯南北绿灯else if(s<=45)	 //5ssn_letf();		   //东西红灯南北(绿灯,左转灯)else if(s<=50) sn_wait();elsejinzhi();}
void display_shuzi1()	   //绿灯以及黄灯的倒计时显示
{if(s<=20){chushi();P2=shuzi[(20-s)/10];  //每100t=5s  十位(0-2)P1_1=0;P1_0=1;delay();chushi();P2=shuzi[(20-s)%10]; //个位(0-9) 2次P1_1=1; //个位P1_0=0; //十位delay();}else if(s<=25){chushi();P2=shuzi[(25-s)/10];P1_1=0;P1_0=1;delay();chushi();P2=shuzi[(25-s)%10];P1_1=1;P1_0=0;delay();}else if(s<=45){chushi();P2=shuzi[(45-s)/10];P1_3=0;P1_2=1;delay();chushi();P2=shuzi[(45-s)%10];P1_3=1;P1_2=0;delay();}else if(s<=50){chushi();P2=shuzi[(50-s)/10];P1_3=0;P1_2=1;delay();chushi();P2=shuzi[(50-s)%10];P1_3=1;P1_2=0;delay();}elsejinzhi();}
void display_shuzi2()		//红灯的倒计时显示
{ if(s<=25){chushi();P2=shuzi[(25-s)/10];P1_3=0;	  //个位P1_2=1;	 //南北数码管十位delay();chushi();P2=shuzi[(25-s)%10];P1_3=1;P1_2=0;delay();}	   else if(s<=50){chushi();P2=shuzi[(50-s)/10];P1_1=0;P1_0=1;delay();chushi();P2=shuzi[(50-s)%10];P1_1=1;P1_0=0;delay();}elsejinzhi();}
void display_shuzi3()
{if(s<=50){chushi();P2=shuzi[left/10];P1_4=1;P1_5=0;delay();chushi();P2=shuzi[left%10];P1_4=0;P1_5=1;delay();}if(s==51)jinzhi();
}
void panduan()			       	//按键的判断
{if(P3_2==0)		    	//按下时切换到东西绿灯刚亮起的时间段s=1;if(P3_3==0)				//按下时切换到南北绿灯刚亮起的时间段s=26;if(P3_4==0)				//按下时切换到循环之外的时间段 实现全部禁止(恢复通行需要按下南北通行或东西通行)s=51;if(left_add==0)				leftadd=1;if(left_add==1&&leftadd==1)	//按下并弹起增加南北通行时间5s(东西通行时无效){left++;leftadd=0;}if(sn_reduce==0)snreduce=1;if(sn_reduce==1&&snreduce==1)	//按下并弹起减少南北红灯时间3s(东西通行时无效){if(s>=0&&s<20)s=s+3;if(s>=20&&s<25)s=25;snreduce=0;}if(left_reduce==0)leftreduce=1;if(left_reduce==1&&leftreduce==1)	   //按下并弹起增加东西通行时间5s(南北通行时无效){left--;leftreduce=0;}	if(ew_reduce==0)ewreduce=1;if(ew_reduce==1&&ewreduce==1)	  //按下并弹起减少东西通行时间5s(南北通行时无效){if(s>=25&&s<45)s=s+3;if(s>=45&&s<50)s=50;ewreduce=0;}		  }void main()
{TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;left=10;	  //定义左转时间初值while(1){		  display_led();	 display_shuzi1();display_shuzi2();display_shuzi3();panduan();}
}     

四、效果图

1.状态1

东西:绿灯(20-ts)——蓝灯ts(10s)——黄灯5s
南北:红灯(25s)
在这里插入图片描述
南北:红灯
东西:蓝灯
在这里插入图片描述
南北:红灯
东西:黄灯
在这里插入图片描述

2.状态2

南北:绿灯(20-ts)——蓝灯ts(10s)——黄灯5s
东西:红灯(25s)
后续图就不发了,因为跟状态一类似的在这里插入图片描述

3.按键

在这里插入图片描述
1.东西通行
就是切换到东西绿灯南北红灯的状态,会读秒,但单击按钮旁边的红色键可以一直保持这个状态
在这里插入图片描述
2.南北通行
切换到南北绿灯,东西红灯的状态,与东西通行同理
3.全部禁止
全部红灯不通行,不读秒
在这里插入图片描述
4. 左转时间加
即加蓝灯的时间,按一下+1s,下次循环绿灯就少了1s(20-t)
5.左转时间减
与4同理
6.南北红灯时间减
这个只有在南北是红灯状态下有用,按下南北红灯时间减3s,因为要保持南北东西状态一致(每边都是50s,要统一),所以按下后东西的时间也会减3s
7.东西红灯时间减
与6同理

五、最后

希望能对你有用!!

当然还有最重要的事,麻烦各位大佬给个三连,毕竟码字不容易。
如果三连不行就点个赞吧(卑微)。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/6s7LPjyq.shtml

相关文章

基于AT89C51单片机的电子万年历PROTEUS仿真设计

目录 前 言 1 第一章 工作原理 2 1.1设计目标 2 1.1.1基本功能 2 第二章 硬件设计与原理 3 2.1 总设计框图 3 2.2 硬件设计分析 3 2.2.1 电源的设计 3 2.2.2 单片机最小系统 4 2.2.3 显示系统 10 2.2.4 LCD1602的指令说明及时序 12 2.2.5 LCD1602的RAM地址映射及标准字库表 14 …

基于at89c51单片机的交通灯控制设计

** 单片机自主学习项目*设计分析 —模拟LED交通灯 ** 一、开发背景与需求 1 开发背景 交通事业蓬勃发展&#xff0c;交通流量年年增长&#xff0c;道路交通繁忙&#xff0c;经常有严重堵车现象&#xff0c;特别是在交叉口&#xff0c;为了在叉口的各条干道实现合理的科学分…

以梦为马之89c51单片机驱动lcd

路有千万条&#xff0c;我要选择那条最难的走&#xff0c;这才是我该走的路 控制LCD实际上就是控制两个牛屎芯片 观察lcd1602&#xff0c;它有16个引脚&#xff0c;其含义如下图所示 查看数据手册看到如下时序图 再看说明书看到时序图介绍&#xff1a; 芯片手册混合写的&a…

AT89C51单片机的C语言代码和仿真模拟学习

单片机定时器学习 一、代码图片与仿真模拟图 #include <reg51.h>/*定义KEY*/ sbit KEY1 P1^0; sbit KEY2 P1^1;void Delay100ms() //12.000MHz延时100ms {unsigned char i, j;i 195;j 138;do{while (--j);} while (--i); }//判断KEY值并执行程序 void Judgefunctio…

AT89C51单片机制作简易密码锁

51单片机课程设计—制作密码锁 文章目录 51单片机课程设计---制作密码锁1.设计要求2.设计流程图3.重要代码解释4.仿真电路设计5.完整代码设计6.仿真结果图7.工程源码及protues仿真下载 1.设计要求 1.1能设定一组4位的数字开启密码&#xff08;设定密码功能&#xff09; 1.2用L…

AT89C51单片机万年历仿真图+代码

首先申明&#xff0c;这篇博客是用作记录本人实训内容的&#xff0c;代码我个人一字一字码的&#xff0c;就上网查了下数字温度传感器DS18B20的处理方法&#xff0c;基本都是个人完成的。 在这里吐槽下&#xff0c;本人辛辛苦苦码的代码&#xff0c;最后实训分数还没那些抄的人…

基于AT89C51单片机的电子万年历系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87708258 源码获取 主要内容&#xff1a; 电子万年历系统以实时时钟芯片DS1302和AT89C52单片机为主要研究对象&#xff0c;着重进行51单片机控制系统的设计研究和如…

c51单片机时钟c语言程序设计,AT89C51单片机为核心的时钟电路的程序设计

当前位置:电工之家 > 电工知识 > 单片机 > 正文 AT89C51单片机为核心的时钟电路的程序设计 时间:2018-06-05 08:38 来源:电工之家 AT89C51单片机为核心的时钟电路的程序设计 1.主程序设计及系统主流程图 设计中采用定时器T0中断完成,其余状态循环调用显示子程序。系…

AT89C51单片机

目录 一、AT89S51单片机的I/O端口二、AT89S51单片机的中断系统  1、中断处理过程  2、AT89S51单片机的中断源&#xff08;2&#xff09;AT89S51单片机的中断控制&#xff08;3&#xff09;AT89S51单片机的中断优先级&#xff08;4&#xff09;AT89S51单片机中断系统的结构&…

89c51c语言程序,AT89C51单片机流水灯c语言程序及详解

许多朋友不知道怎么用C语言编程实现AT89C51单片机流水灯&#xff0c;这里给大家讲解一下。 首先将单片机的头函数导入。 #include"reg51.h" 定义单片机P1口的8个管脚&#xff0c;使其分别代表流水灯的8个led。 sbit p0P1^0; sbit p1P1^1; sbit p2P1^2; sbit p3P1^3; …

keil ISIS AT89C51单片机

突然想起大学时候学习的知识&#xff0c;最近空余时间较多&#xff0c;想回顾一下&#xff0c;然后发现连最简单的编辑器的名字都快忘记了&#xff0c;于是赶紧抓紧时间复习一遍&#xff0c;在此记录一下这个过程遇到的问题。 首先是对于keil的安装&#xff0c;我是直接从网上…

AT89C51单片机性能介绍

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器&#xff08;FPEROM—Falsh Programmable and Erasable Read Only Memory&#xff09;的低电压&#xff0c;高性能CMOS8位微处理器&#xff0c;俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造&#xff0c;与工业标…

微机基础与89C51单片机部分知识

1&#xff0c;微机基础知识 微机: 具有完整运算及控制能力的计算机。包括微处理器&#xff0c;储存器&#xff0c;接口适配器&#xff0c;输入输出设备。 微处理器&#xff1a; 控制器&#xff1a;由程序计数器&#xff0c;指令寄存器&#xff0c;指令译码器&#xff0c;时序发…

基于AT89C51单片机的计算器设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87772564 源码获取 主要内容: 本设计是基于51系列的单片机进行的设计,可以完成计算器的键盘输入,进行加、减、3位无符号数字的简单运算,并在LED上相应的显示结果。设计过…

基于 AT89C51 单片机的数字时钟设计

目录 1.设计目的、作用 2.设计要求 3.设计的具体实现 3.1 设计原理 3.2 硬件系统设计 3.2.1 AT89C51 单片机原理 3.2.2 晶振电路设计 3.2.3 复位电路设计 3.2.4 LED 数码管显示 3.3 系统实现 3.3.1 系统仿真与调试 3.3.2 演示结果 4.总结 附录 附录 1 附录 2 1.…

89C51单片机之寄存器

文章目录 片内RAM中的寄存器内容介绍 低128字节片内RAM4组工作寄存器 高128字节片内RAM&#xff08;SFR区&#xff09;部分特殊功能寄存器累加器 ACC寄存器 B程序状态寄存器 PSW栈指针 SP数据指针 DPTRI/O端口 P0~P3 中断系统中的特殊寄存器定时器控制寄存器 TCON 之中断定时器…

【89c51汇编语言】51单片机结构及其原理

单片机结构及其原理 51单片机的内部结构单片机CPU控制器控制器&#xff1a;程序计数器&#xff1a;PC 控制器&#xff1a;数据指针寄存器&#xff1a;DPTR运算器累加器APSW程序状态字CY&#xff08;PSW.7&#xff09;进位标志AC&#xff08;PSW.6&#xff09;辅助进位标志RS1和…

89c51单片机

89c51是一款很大众化的入门级单片机&#xff0c;ATMEL、NXP、STC、和SST等公司生产的与80c51兼容低功耗、高性能8位89c51/s51单片机具有比80c31更丰富的外设资源。 89c51/s51单片机芯片内包括&#xff1a; ①一个8位的80c51微处理器&#xff08;CPU&#xff09; ②片内256字…

关于会话(session),你应该了解这些

一、什么是会话 会话Session代表的是客户端与服务器的一次交互过程&#xff0c;这个过程可以是连续也可以是时断时续的。在Servlet中&#xff08;jsp&#xff09;&#xff0c;一旦用户与服务端交互&#xff0c;服务器tomcat就会为用户创建一个session&#xff0c;同时前端会有…

ZooKeeper客户端源码(一)——向服务端建立连接+会话建立+心跳保持长连接

首发CSDN&#xff1a;徐同学呀&#xff0c;原创不易&#xff0c;转载请注明源链接。我是徐同学&#xff0c;用心输出高质量文章&#xff0c;希望对你有所帮助。 一、从ZooKeeper实例初始化开始 ZooKeeper 提供了原生的客户端库&#xff0c;虽然不好用&#xff0c;但是能够更好…