基于51单片机的交通灯控制设计
思路:
红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。
东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。
三、硬件电路设计
此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。
四、软件程序(C语言)
以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。
//*****************************//
//程序名:十字路口交通灯控制
//编写人:黄庭剑
//初写时间:2009年1月2日
//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.
//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器
//完成时间:2009年1月6日
//*****************************//
#include
#include
#include
sfr p0 = 0x80;
sfr p1 = 0x90;
sfr p2 = 0xA0;
sfr p3 = 0xb0; //这部分内容其实在“#include”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。
sbit sw = p0^0;
sbit OE =P0^6;
sbit LE =P0^7; //74LS373锁存器控制端定义
char display[]={ 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 }; //p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;
//函数声明 begin
void delay1(int count);
void delay_long(int number1,int number2);
void people_car_drive();
//函数声明end
//***********************//延时子程序
void delay1(int count)
{ int i;
for(i=count;i>0;i--)
{ ;}
}
void delay_long(int number1,int number2)
{
int a,b;
for(a=number1;a>0;a--)
{
for(b=number2;b>0;b--)
{ _nop_(); }
}
}
//**********************//延时子程序
void people_car_drive()
{
int p_1=2,i,j=9,p_2=6; //****************//行人通行时,延时20秒
p2=0x09; //南北红灯亮
p3=0x24; //东西绿灯亮
while(p_1-->0)
{ LE=1;
OE=0;
if(p_1==0){OE=1;} //当十位数减到0时,只显示个位数
p1=display[p_1];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_1==0&&j==3)break; //减到3时退出循环,让其黄灯闪烁显示
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
//*******************************************************************************//
p2=0x12; //南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
//*****************以下是车辆通行时延时60秒//
p2=0x24; //南北绿灯亮
p3=0x09; //东西红灯亮
while(p_2-->0)
{ LE=1;
OE=0;
if(p_2==0){OE=1;} //当十位数减到0时,只显示个位数
p1=display[p_2];
delay1(1000);
LE=0;
j=9;
for(i=10;i>0;i--)
{
if(p_2==0&&j==3)break; //减到2时退出循环
p1=display[j--];
delay_long(16000,2);
if(sw==1)return;
}
}
p2=0x12; //南北黄灯闪烁三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1); //南北黄灯闪烁三秒完毕
}
void main() //主函数入口处
{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00; //初始化各端口
{ while(1)
{
if(sw==0)
{ people_car_drive();}
else
{
p2=0x00;
p3=0x00; //关闭所有交通灯
}
}
}
}
详情访问:http://hi.baidu.com/hjiannew/
不知道你远程控制系统是机器自动完成还是人工。如果要自动检测车流量,你需要一个红外线或者超声波传感器,接在中断口上,在路口前方x米的地方计数,然后用有线或者无线的方式传送给主控器,主控器根据两方四个计数器的计数来比较,按百分比分配时间。
然后控制相应的灯亮。
灯用发光二极管做,三色的四组,共阴,io口输出高电平亮。
还是比较简单的,毕业设计自己做吧,原理是这样。如果有人帮你做了,你还是不会。以后出来找工作,靠的还是本事哦。
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0^0; //东西向灯
sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2;
sbit RED_B=P0^3; //南北向灯
sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;
uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量
《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例
5
上海师范大学信息与机电工程学院—倪继锋
//延时
void DelayMS(uint x)
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
//交通灯切换
void Traffic_Light()
{
switch(Operation_Type)
{
case 1: //东西向绿灯与南北向红灯亮
RED_A=1;YELLOW_A=1;GREEN_A=0;
RED_B=0;YELLOW_B=1;GREEN_B=1;
DelayMS(2000);
Operation_Type=2;
break;
case 2: //东西向黄灯闪烁,绿灯关闭
DelayMS(300);
YELLOW_A=~YELLOW_A;GREEN_A=1;
if(++Flash_Count!=10) return; //闪烁5 次
Flash_Count=0;
Operation_Type=3;
break;
case 3: //东西向红灯,南北向绿灯亮
RED_A=0;YELLOW_A=1;GREEN_A=1;
RED_B=1;YELLOW_B=1;GREEN_B=0;
DelayMS(2000);
Operation_Type=4;
break;
case 4: //南北向黄灯闪烁5 次
DelayMS(300);
YELLOW_B=~YELLOW_B;GREEN_B=1;
if(++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=1;
}
}
//主程序
void main()
{
while(1) Traffic_Light();
}
这个设计完了 可以在proteus下仿真的啊
可以交流
基于51单片机的交通灯控制系统设计
第一章 硬件设计与原理 以AT89C51单片机为核心,构建交通灯控制系统。系统包含数码管显示、复位、时钟、发光二级管和按键电路。设计分为六个模块:复位电路、晶振电路、单片机、数码管显示、发光二级管和按键电路。硬件设计主要涉及电源、单片机最小系统、显示系统、发光二极管电路与按键电路。电源使用直流5伏,...
基于51单片机的模拟交通灯控制系统
(1)51单片机实现十字路口交通灯控制系统,行人与车流分流。(2)主干道与支干道交替通行,放行时间15秒和10秒可调。(3)绿灯转红前,黄灯闪烁3秒,另一干道保持红灯。(4)按键控制交通管制。(5)提供系统结构图、软硬件流程图。系统概述 东西主干道与南北支干道各由一组三色灯控制。四个状态...
基于51单片机的交通灯控制设计
sbit RED_A=P0^0; \/\/东西向灯 sbit YELLOW_A=P0^1;sbit GREEN_A=P0^2;sbit RED_B=P0^3; \/\/南北向灯 sbit YELLOW_B=P0^4;sbit GREEN_B=P0^5;uchar Flash_Count=0,Operation_Type=1; \/\/闪烁次数,操作类型变量 《单片机C语言程序设计实训100例---基于8051和PROTEUS仿真》案例 5 上海...
基于51单片机控制交通灯的电路图与C语言程序
\/\/程序名:十字路口交通灯控制 \/\/编写人:黄庭剑 \/\/初写时间:2009年1月2日 \/\/程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.\/\/CPU说明:AT89C51型单片机; 24MHZ晶体振荡器 \/\/完成时间:2009年1月6日 \/\/***\/\/ include<stdio.h> include<reg...
c51单片机c语言交通灯的程序
使用C语言为C51单片机编写交通灯控制程序是完全可行的,通过合理地设置定时器、I\/O端口以及逻辑控制,可以实现交通灯的定时切换和状态显示。接下来,我将详细解释如何为C51单片机使用C语言编写交通灯控制程序。首先,我们需要了解C51单片机的基本结构和资源,包括其I\/O端口、定时器\/计数器等。通常,交通灯...
单片机控制十字路口交通灯程序设计
首先是60个单位时间,南北方向为红灯,东西方向为绿灯;接着是10个单位时间,南北方向为红灯,东西方向为黄灯;随后是60个单位时间,南北方向为绿灯,东西方向为红灯;最后是10个单位时间,南北方向为黄灯,东西方向为红灯。采用P1端口的6个引脚来控制交通灯,高电平代表灯亮,低电平代表灯灭。以下是相关...
求用C语言编写的交通灯程序,C51单片机控制,无左转右转
include "reg51.h" \/\/头文件包含 \/\/宏定义 define uint unsigned int define uchar unsigned char define ON 0 \/\/0的时候灯亮 define OFF 1 \/\/1的时候灯亮 \/\/管脚定义 \/\/南北道 黄灯亮3秒 红灯亮 30秒 黄灯3秒 绿灯38秒 \/\/东西道 黄灯亮3秒 绿灯亮 28秒 黄灯3秒 红灯40秒 sbit ...
c51单片机c语言交通灯的程序
程序如下: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 b;\/\/定时器中断次数 sbit k1=P1^...
急求:51单片机 交通灯控制
MOV TMOD,#51H ;设置T1为计数方式,T0为定时方式,且都工作于模式1 MOV TH1,#00H ;T1计数器清零 MOV TL1,#00H SETB TR1 ;启动T1计时器 SETB EX1 ;允许INT1中断 SETB IT1 ;选择边沿触发方式 MOV DPTR ,#0003H MOV A, #80H ;给8255赋初值,8255工作于方式0 MOVX @DPT...
我在做一个单片机交通灯程序(c51),要求是控制一个十字路口的两组红...
给你一个思路:假设是单纯的红绿灯,无黄灯的话,设红灯30秒,绿灯30秒。需要两个状态量,方向Dir(1:东西,0:南北),东西灯颜色LightcolorEW,南北灯颜色LightcolorNS。此刻,东西方向亮红灯,则Dir=1,LightcolorEW=red,LightcolorNS=green。对相应端口赋值即可。只需要东西方向与南北方向相反。...