C51交通控制系统的设计与实现
实验要求:
本题目拟设计一个工作在十字路口的交通信号灯控制系统,设东西方向为主干道A,南北方向为辅助干道B。要求:(1)用发光二极管模拟交通灯信号;(2)灵活控制主、辅干道交通指示灯的显示时间;(3)设计交通灯控制系统硬件电路;(4)运用C51语言完成对控制系统的软件编程。
一、需求分析
1.1 实验背景
随着科技的快速发展,时间的流逝,单片机技术的应用产品已经走进了千家万户。计算器给人们日常生活中的计算带来了许多方便。随着微电子技术的高速发展,单片机已经在国民经济的个人领域得到了广泛的应用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理等各种测控领域的应用中独占鳌头、单片机开发技术已成为电子信息、电气、通信、自动化等专业技术人员必须掌握的技术。
单片机单芯片的微小体积和低的成本,可广泛地嵌入到如玩具、家用电器、机器人、仪器仪表、汽车电子系统、工业控制单元、办公自动化设备、金融电子系统、舰船、个人信息终端及通讯产品中,成为现代电子系统中最重要的智能化工具,于是基于单片机的计算器也顺应而生。基于单片机的计算器用按键来模拟数字、运算符的输入,从而得出结果送给显示设备显示出来,方便人们的生活。
1.2 问题描述
设计一个工作在十字路口的交通信号灯控制系统,设东西方向为主干道A,南北方向为辅助干道B。用Proteus软件进行仿真,实现此次功能。
1.3 基本要求
1. 完成的形式
(1) 熟悉设计题目内容、查找相关资料。
(2) 确定系统的总体设计方案。
(3) 编写语言代码,并调试。
(4) 用Proteus模拟实现交通灯控制
二、 概要设计
2.1 设计方案
2.1.1交通灯四种通行模式及行车方向指示
- 按照简单的交通路口规则,有四种模式
南北绿灯亮 东西红灯亮;
南北黄灯闪 东西红灯亮;
南北红灯亮 东西绿灯亮;
南北红灯亮 东西黄灯闪;
2.2 程序流程图
程序流程图
2.3 模块功能
2.3.1 信号灯显示模块由于南北方向的信号灯始终是同一种状态,所以南北信号灯为一组,只需将对应的信号灯并联即可,东西方向同理。
2.3.2 倒计时显示模块
选取8个7段数码管分别模拟显示四个方向的倒计时,数码管采用共阴极接法。
为了提高P0、P2端口的电流输出能力,保证数码管亮度,保护端口引脚,在P0端口与数码管之间增加了74LS245芯片。
2.3.3 复位模块
此系统可以通过复位按键实现从新工作,电路图如图所示
三、详细设计
3.1 实验原理
3.1.1 外部中断原理
本系统主要使用了外部中断,中断信号有引脚INTO和INT1输入,低电平有效,CPU每个时钟周期都会检测INTO和INT1上的信号,AT89C51允许外部中断以电平方式或负边沿方式两种中断方式输入中断请求信号,可由用户通过设置TCON中ITO和IT1位的状态来实现。以ITO为例,ITO=0,为电平触发方式,ITO=1,为负边沿触发方式,本设计采用电平方式,IEO为其中断标志位,有中断信号则置位,中断服务子程序响应后,IEO自动清零。IE中的EA为允许中断的总控制位,为1开启,EXO为外部中断允许控制位,为1开启。
在优先级的允许下,一旦有外部中断信号产生,单片机CPU首先保护断点,PC值进栈,然后执行相应的中断服务子程序,执行完后,用RETI指令返回,此时CPU会从堆栈中取保存的断点地址,送回PC,程序再正常执行。
3.1.2 软件延时原理
MCS-51的工作频率为12MHZ,机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12∗(1/12MHZ)=1us。我们可以知道具体每条指令的周期数这样我们就可以通过指令的执行条数来确定1秒的时间,但同时由于单片机的运行速很快其他的指令执行时间可以忽略不计。
3.1.3 数码管显示原理
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
3.2 设计思路
(1)利用仿真软件绘制仿真实例
1.用 traffic light 和一个led灯表示红、黄、绿的信号灯。
2.用p0口控制交通灯,用P1口控制数码管的段选,P2口控制数码管的位选。
3.p3.6和p3.7接收中断信号并返回给INT0接口处理。
(2)利用keil软件按要求编写程序实现相应功能。
3.3 主要程序编写
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned intsbit SN_LED2=P2^3; //SN_LED2控制位
sbit SN_LED1=P2^2; //SN_LED1控制位
sbit EW_LED2=P2^1; //EW_LED2控制位
sbit EW_LED1=P2^0; //EW_LED1控制位sbit EW_Yellow=P1^6; //EW黄灯
sbit EW_Red=P1^7; //EW红灯
sbit EW_Green=P1^5; //EW绿灯
sbit SN_Yellow=P1^2; //SN黄灯
sbit SN_Red=P1^3; //SN红灯
sbit SN_Green=P1^1; //SN绿灯bit Restore_flag=0; //恢复正常标志位
bit Flag_EW_Yellow; //EW黄灯标志位
bit Flag_SN_Yellow; //SN黄灯标志位
char Time_SN; //南北方向倒计时单元
char Time_EW; //东西方向倒计时单元
uchar SN=15,EW=20; //程序初始化赋值
uchar SN1=15,EW1=10; //用于存放修改值的变量
uchar code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~~~~9段选码
uchar code S[9]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84,0x88};//交通信号灯控制代码/**********************延时子程序************************/
void delay_ms(uint x) //延时ms
{uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);
}
/*****************显示函数**************************/
void Display(void)
{char h,l;h=Time_SN/10;l=Time_SN%10;P0=table[l];SN_LED2=1;delay_ms(1);SN_LED2=0;P0=table[h];SN_LED1=1;delay_ms(1);SN_LED1=0; //南北方向数码管显示h=Time_EW/10;l=Time_EW%10;P0=table[l];EW_LED2=1;delay_ms(1);EW_LED2=0;P0=table[h];EW_LED1=1;delay_ms(1);EW_LED1=0; //东西方向数码管显示
} /**********************T0中断服务程序*******************/
void timer0() interrupt 1
{static uchar count; //count为静态变量初值为0TL0 = 0xB0; //重赋定时初值50msTH0 = 0x3C; //重赋定时初值50mscount++; //计数if(count==10) //加快闪烁速度{if(Flag_EW_Yellow==1) //测试东西黄灯标志位{EW_Yellow=~EW_Yellow;}//东西黄灯闪烁if(Flag_SN_Yellow==1) //测试南北黄灯标志位{SN_Yellow=~SN_Yellow;}//南北黄灯闪烁}if(count==20) //20*50=1000ms=1S {Time_SN--; //南北方向倒计时Time_EW--; //东西方向倒计时if(Flag_EW_Yellow==1) //测试东西黄灯标志位{EW_Yellow=~EW_Yellow;} //东西黄灯闪烁if(Flag_SN_Yellow==1) //测试南北黄灯标志位{SN_Yellow=~SN_Yellow;} //南北黄灯闪烁count=0;}
}/*********************主程序开始**********************/
void main(void)
{
/*********************中断初始化**********************/IT0=1; //设置外部中断0触发方式(下降沿触发)EX0=1; //打开外部中断0的IE寄存器中断EA=1; //CPU开中断总允许ET0=1; //开定时中断TMOD=0x01; //定时器工作于方式1TL0 = 0xB0; //设置定时初值50msTH0 = 0x3C; //设置定时初值50msTF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时
while(1) {if(Restore_flag)break; /*******S1状态(南北直行状态)**********/Time_SN=SN; //南北数码管赋值10s Time_EW=EW; //东西数码管赋值15swhile(Time_EW>=6) //东西方向倒计时前10s循环体{ Flag_EW_Yellow=0; //南北关黄灯显示信号 P1=S[4]; //南北通行,东西红灯Display(); //调用显示函数if(Restore_flag)break;}/*******S2状态(南北直行黄灯闪烁状态)**********/P1=0x00; //所有路口红绿灯短时熄灭if(Time_EW==5) //当东西倒计时为5s时Time_SN=5; //南北重新从5s开始倒计时while(Time_EW>=1) //东西方向倒计时最后5s循环体{Flag_SN_Yellow=1; //南北开黄灯信号位EW_Red=1; //南北黄灯开始闪烁,东西红灯亮 Display(); //调用显示函数if(Restore_flag)break; }/***********赋值(南北通行变东西通行)**********/SN=SN1; //南北10s-->15sEW=EW1; //东西15s-->10s /*******S3状态(东西直行状态)**********/ Time_SN=SN; //南北数码管赋值15sTime_EW=EW; //东西数码管赋值10swhile(Time_SN>=6) //南北方向倒计时前10s循环体{ Flag_SN_Yellow=0; //南北关黄灯显示信号P1=S[0]; //东西通行,南北红灯Display(); //调用显示函数if(Restore_flag)break; }/*******S4状态(东西直行黄灯闪烁状态)**********/P1=0X00; //所有路口红绿灯短时熄灭if(Time_SN==5) //当南北倒计时为5s时Time_EW=5; //东西重新从5s开始倒计时while(Time_SN>=1) //南北方向倒计时最后5s循环体{Flag_EW_Yellow=1; //东西开黄灯信号位SN_Red=1; //东西黄灯开始闪烁,南北红灯亮Display(); //调用显示函数if(Restore_flag)break; }/***********赋值(东西通行变南北通行)**********/SN=EW1; //南北15s-->10sEW=SN1; //东西10s-->15s } }
-
四、测试与分析
4.1 仿真结果
首先焊接各个电路板,焊接完每个电路板以后,对电路板对的每个模块分别进行测试,以确保在整个系统焊接完能正常的工作。单独测试后,将2个电路板连接起来,进行最后的结果测试。
实验结果与预期相符:
相关文章:

C51交通控制系统的设计与实现
实验要求: 本题目拟设计一个工作在十字路口的交通信号灯控制系统,设东西方向为主干道A,南北方向为辅助干道B。要求:(1)用发光二极管模拟交通灯信号;(2)灵活控制主、辅干…...
深度学习的超参数
1. 引言 1.1 什么是超参数? 在机器学习和深度学习中,超参数(Hyperparameter) 是在模型训练前由开发者设置的参数,这些参数决定了模型的训练过程和模型的结构。例如: 神经网络的层数和每层神经元的数量。…...
网络安全面试题及经验分享
本文内容是i春秋论坛面向专业爱好者征集的关于2023年面试题目和答案解析,题目是真实的面试经历分享,具有很高的参考价值。 shiro反序列化漏洞的原理 Shiro反序列化漏洞的原理是攻击者通过精心构造恶意序列化数据,使得在反序列化过程中能够执…...

【Golang 面试题】每日 3 题(三十一)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...

微服务架构:挑战与机遇并存
微服务架构在提升系统灵活性、可扩展性和容错性的同时,也引入了一系列挑战。微服务带来的挑战主要有以下几点: 1. 系统复杂性增加:想象一下,你原本有一个大厨房(单体应用),里面有几个大厨&…...
Vue语音播报功能
使用Web Speech API的SpeechSynthesis接口来实现文本转语音 Web Speech API可能不在所有浏览器中都能完美支持 特别是旧浏览器 在生产环境中,你可能需要添加功能检测和后备方案。<template><div><textarea v-model"text" placeholder&quo…...

【Java设计模式-4】策略模式,消灭if/else迷宫的利器
各位Java编程小伙伴们!今天咱们要一起探索一个超级厉害的Java设计模式——策略模式,它就像是一把神奇的魔法剑,专门用来斩断那些让我们代码变得乱糟糟的if/else语句迷宫! 一、if/else的烦恼 在编程的奇妙世界里,我们…...

citrix netscaler13.1 重写负载均衡响应头(基础版)
在 Citrix NetScaler 13.1 中,Rewrite Actions 用于对负载均衡响应进行修改,包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成,帮助你根据需求调整请求内容。以下是三种常见的操作: 1. Replace (替换响应头)…...
【AI学习】地平线首席架构师苏箐关于自动驾驶的演讲
在地平线智驾科技畅想日上,地平线副总裁兼首席架构师苏箐(前华为智驾负责人)做了即兴演讲,以下是其演讲的主要内容: 对自动驾驶行业的看法 自动驾驶的难度与挑战:苏箐表示自动驾驶非常难,他做自…...
QILSTE H11-D212HRTCG/5M高亮红绿双色LED灯珠 发光二极管LED
型号:H11-D212HRTCG/5M,一款由QILSTE(HongKong)Technology Co., Ltd精心打造的高亮度红绿双色LED产品,其尺寸仅为2.01.251.1 mm,却蕴含着强大的光电特性。这款产品采用透明平面胶体封装,不仅外观…...

2️⃣java基础进阶——多线程、并发与线程池的基本使用
一、概念介绍 什么是线程,什么是进程,两者有什么关系? 进程是操作系统资源分配的独立单位;而线程是操作系统能够进行调度和分派的最小单位;线程包含于进程之中,是进程中的实际运作单位。 例如:…...
RAG多路召回
什么是多路召回? 多路召回(Multi-Route Retrieval) 是指在信息检索系统中,为了提升检索的全面性和准确性,通过多条不同的检索路径或不同的检索策略来获取信息的技术。多路召回的核心思想是,单一的检索路径…...

复杂 C++ 项目堆栈保留以及 eBPF 性能分析
在构建和维护复杂的 C 项目时,性能优化和内存管理是至关重要的。当我们面对性能瓶颈或内存泄露时,可以使用eBPF(Extended Berkeley Packet Filter)和 BCC(BPF Compiler Collection)工具来分析。如我们在Red…...

网安——计算机网络基础
一、计算机网络概述 1、Internet网相关概念及发展 网络(Network)有若干结点(Node)和连接这些结点的链路(link)所组成,在网络中的结点可以是计算机、集线器、交换机或路由器等多个网络还可以通…...
ZCC1923替代BOS1921Piezo Haptic Driver with Digital Front End
FEATURES • High-Voltage Low Power Piezo Driver o Drive 100nF at 190VPP and 250Hz with 490mW o Drives Capacitive Loads up to 1000nF o Energy Recovery o Differential Output o Small Solution Footprint, QFN & WLCSP • Low Quiescent Current: SHUTDOWN; …...

Kutools for Excel 简体中文版 - 官方正版授权
Kutools for Excel 是一款超棒的 Excel 插件,就像给你的 Excel 加了个超能助手。它有 300 多种实用功能,现在还有 AI 帮忙,能把复杂的任务变简单,重复的事儿也能自动搞定,不管是新手还是老手都能用得顺手。有了它&…...
PostgreSQL和MySQL有什么区别?
一、数据存储与管理方面 数据类型支持 PostgreSQL: 提供了非常丰富的数据类型。除了基本的整数、浮点数、字符、日期等类型外,对复杂数据类型的支持很出色。例如,它原生支持数组(Array)类型,可以方便地存储…...

比较之舞,优雅演绎排序算法的智美篇章
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、冒泡排序:数据海…...

C语言数据结构与算法(排序)详细版
大家好,欢迎来到“干货”小仓库!! 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!无人扶我青云志,我自踏雪至山巅!!&am…...

JAVA:利用 RabbitMQ 死信队列实现支付超时场景的技术指南
1、简述 在支付系统中,订单支付的超时自动撤销是一个非常常见的业务场景。通常用户未在规定时间内完成支付,系统会自动取消订单,释放相应的资源。本文将通过利用 RabbitMQ 的 死信队列(Dead Letter Queue, DLQ)来实现…...
前端面经 协商缓存和强缓存
HHTTPTTP缓存 协商缓存和强缓存 核心区别是否向服务器发起请求验证资源过期 强缓存 浏览器直接读取本地缓存,不发请求 HTTP响应头 Cache-Control:max-age3600资源有效期 Expires优先级低 如果有效浏览器返回200(浏览器换伪造的200) 应用静态资源 协商缓存 OK如果 1强缓…...

华为OD机试真题—— 最少数量线段覆盖/多线段数据压缩(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《最少数量线段覆盖/多线段数…...

Nginx--手写脚本压缩和切分日志(也适用于docker)
原文网址:Nginx--手写脚本压缩和切分日志(也适用于docker)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍nginx如何手写脚本压缩和切分日志。 1.创建切分日志的脚本 创建脚本文件:/work/tmp/nginx-log_sh(后边要用run-…...

从翻译后修饰角度解析人工合成途径与底盘细胞的适配性-文献精读136
Compatibility between synthetic pathway and chassis cells from the viewpoint of post-translational modifications 从翻译后修饰角度解析人工合成途径与底盘细胞的适配性 摘要 揭示工程化设计的人工合成途径与底盘细胞整体代谢网络的交互作用及适配性机制是合成生物学研…...
【C++】C++面向对象设计的核心思想之一: 接口抽象、解耦和可扩展性
1. 什么是虚函数? 虚函数(virtual)是C里实现“多态”的关键机制。 在基类中声明虚函数,在子类中可以**覆盖(override)**它们。通过基类指针/引用操作时,自动调用实际对象(子类&…...

小黑大语言模型通过设计demo进行应用探索:langchain中chain的简单理解demo
chain简介 LangChain 中的 Chain 模块在开发大型语言模型(LLM)驱动的应用程序中起着至关重要的作用。Chain是串联LLM能力与实际业务的关键桥梁,通过将多个工具和模块按逻辑串联起来,实现复杂任务的多步骤流程编排。 案例 通过…...
力扣刷题(第四十三天)
灵感来源 - 保持更新,努力学习 - python脚本学习 解题思路 1. 逐位检查法:通过右移操作逐位检查每一位是否为1,统计计数 2. 位运算优化法:利用 n & (n-1) 操作消除最低位的1,减少循环次数 3. 内置函数法&…...

MySQL强化关键_017_索引
目 录 一、概述 二、索引 1.主键索引 2.唯一索引 3.查看索引 4.添加索引 (1)建表时添加 (2)建表后添加 5.删除索引 三、树 1.二叉树 2.红黑树 3.B树 4.B树 (1)为什么 MySQL 选择B树作为索引…...

3DMAX+Photoshop教程:将树木和人物添加到户外建筑场景中的方法
在本教程中,我将向您展示如何制作室外场景。我不会详细解释每一个细节,而是想快速概述一下我的方法。 在本教程中,我使用了一个相对简单的3D模型,并向您展示了在一些高质量纹理的帮助下可以做什么。此外,我将向您展示…...
微信小程序返回上一页监听
本文实现的是微信小程序在返回上一页时获取通知并自定义业务。 最简单的实现: 使用 wx.enableAlertBeforeUnload() 优点:快速接入 缺点:手势不能识别、无法自定义弹窗内容(仅询问) 方法二: page-conta…...