热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

51单片机十字路口交通灯课程设计

原理图六车道十字路口交通控制原理图,图中有四个不同颜色的箭头,代表四个不同的状态。需要使用51单片机实现交通灯及人行道灯。开发工具Protues7Keil4设计图设计图分析使用元

原理图

在这里插入图片描述

六车道十字路口交通控制原理图,图中有四个不同颜色的箭头,代表四个不同的状态。需要使用51单片机实现交通灯及人行道灯。


开发工具



  • Protues7

  • Keil4


设计图

在这里插入图片描述


设计图分析


使用元件







































名称数量
AT89C511
RESPACK-81
74HC5738
NOT8
AND_34
TRAFFIC LIGHTS20
7SEG-MPX4-CC4

设计思想



  1. 每个路口有三个红绿灯模块,分别代表左转,直行,右转,高电平时亮灯,低电平熄灭

  2. 对于的红绿灯模块下的数码管显示倒计时,当对应的红绿灯要变灯时显示倒计时提醒驾驶员注意

  3. 单片机引脚直接控制红绿灯和数码管,人行道灯采用逻辑门控制,当面前的路口都是红灯时才为绿灯

  4. 全部路口的时间是一样的,到时间就切换到下一个状态


代码

#include
#define uchar unsigned char
#define RR 0x24 //一红一红
#define RG 0x0c //一红一绿
#define GR 0x21 //一绿一红
#define GG 0x09 //一绿一绿
#define LOCK(num) A##num = 1; A##num = 0 //LOCK(8)意为 A8 = 1; A8 = 1; 锁存器一开一关
#define START 127
#define GAP 30
sbit A8 = P1^0;
sbit A9 = P1^1;
sbit A10 = P1^2;
sbit A11 = P1^3;
sbit A12 = P1^4;
sbit A13 = P1^5;
sbit A14 = P1^6;
sbit A15 = P1^7;
uchar mtable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};
char sec = START, cnt = 0;
void delay(unsigned int ms);
void status1();
void status2();
void status3();
void status4();
void inittimer();
void main(){
inittimer(); //打开定时器
while(1){
status1();
status2();
status3();
status4();
}
}
void inittimer() {
TMOD = 0X01;
TL0 = 0xb0;
TH0 = 0x3c;
ET0 = 1; EA = 1;
TR0 = 1;
}
void status1(){
while( START-GAP while( START-GAP+2 <= sec && sec <= START-GAP/2 ){
P0 = mtable[sec-(START-GAP+1)];
P3 = ~(0x31); LOCK(14);
P3 = ~(0x07); LOCK(15);
delay(100);
P3 = 0xff; LOCK(14); LOCK(15);
}
//点灯顺序为西路口开始逆时针选装
P2 = RR; LOCK(8);
P2 = RG; LOCK(9);
P2 = RR; LOCK(10);
P2 = ( sec <= START-GAP+2 ) ? 0x22 : GR; LOCK(11);
P2 = RR; LOCK(12);
P2 = ( sec <= START-GAP+2 ) ? 0x12 : GG; LOCK(13);
}
}
void status2(){
while( START-2*GAP while( START-2*GAP+2 <= sec && sec <= (START-GAP)-GAP/2 ){
P0 = mtable[sec-(START-2*GAP+1)];
P3 = ~(0x08); LOCK(14);
P3 = ~(0x3e); LOCK(15);
delay(100);
P3 = 0xff; LOCK(14); LOCK(15);
}
P2 = GR; LOCK(8);
P2 = ( sec <= START-2*GAP+2 ) ? 0x14 : RG; LOCK(9);
P2 = RR; LOCK(10);
P2 = ( sec <= START-2*GAP+2 ) ? 0x14 : RG; LOCK(11);
P2 = ( sec <= START-2*GAP+2 ) ? 0x22 : GR; LOCK(12);
P2 = RR; LOCK(13);
}
}
void status3(){
while( START-3*GAP while( START-3*GAP+2 <= sec && sec <= (START-2*GAP)-GAP/2 ){
P0 = mtable[sec-(START-3*GAP+1)];
P3 = ~(0x07); LOCK(14);
P3 = ~(0x31); LOCK(15);
delay(100);
P3 = 0xff; LOCK(14); LOCK(15);
}
P2 = ( sec <= START-3*GAP+2 ) ? 0x22 : GR; LOCK(8);
P2 = RR; LOCK(9);
P2 = ( sec <= START-3*GAP+2 ) ? 0x12 : GG; LOCK(10);
P2 = RR; LOCK(11);
P2 = RG; LOCK(12);
P2 = RR; LOCK(13);
}
}
void status4(){
while( START-4*GAP while( START-4*GAP+2 <= sec && sec <= (START-3*GAP)-GAP/2 ){
P0 = mtable[sec-(START-4*GAP+1)];
P3 = ~(0x3e); LOCK(14);
P3 = ~(0x08); LOCK(15);
delay(100);
P3 = 0xff; LOCK(14); LOCK(15);
}
P2 = ( sec <= START-4*GAP+2 ) ? 0x14 : RG; LOCK(8);
P2 = ( sec <= START-4*GAP+2 ) ? 0x22 : GR; LOCK(9);
P2 = RR; LOCK(10);
P2 = GR; LOCK(11);
P2 = ( sec <= START-4*GAP+2 ) ? 0x14 : RG; LOCK(12);
P2 = RR; LOCK(13);
}
}
void delay(unsigned int ms) {
unsigned int i,j;
for(i=0;i for(j=0;j<150;j++);
}
void time_ler() interrupt 1 {
TL0=0xb0; TH0=0x3c;
cnt++;
if( cnt == 20 ){
cnt = 0;
sec--;
if( sec == START-4*GAP ){ //倒计时结束重置sec 回到status1
sec = START;
}
}
}

资源

DSN文件

https://share.weiyun.com/ggUgDg9T



推荐阅读
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 文件描述符、文件句柄与打开文件之间的关联解析
    本文详细探讨了文件描述符、文件句柄和打开文件之间的关系,通过具体示例解释了它们在操作系统中的作用及其相互影响。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了重温Linux内核:互斥和同步相关的知识,希望对你有一定的参考价值。文章目录 ... [详细]
  • A题这题贼水,直接暴力就可以了。用个bool数组记录一下,如果某一天,当前剩下的最大的出现了的话,就输出一段。1#include<stdio.h>2intn;3boolvi ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
author-avatar
书友73277355
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有