单片机控制十字路口交通灯

更新时间:2023-06-10 04:08:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

设计题目:十字路口交通灯控制2

一、 要求

1、通过LED控制四个路口的红黄绿灯的变化。 2、绿灯表示通行,红灯表示停止,黄灯表示等待。

3、每次绿灯变红灯时黄灯先亮五秒,此时另外干道上的红灯不变。 4、每次变化时绿灯闪烁五次。 二、 分析

课程设计采用实验室的单片机作为主控来实现十字路口交通灯的变化规律,十字路口的红绿灯交替变化,用双色发光二级管来模拟交通灯变化,使用定时器/计数器0作为定时器,从P1和P3口输出。

三、 设计

1、硬件设计(包括设计方案及说明、完整的硬件连接图等)

(1)因为本实验是交通灯控制实验,所以要先了解交通灯的变化规律。假设一个十字路口为东西和南北方向,初始状态是状态0(各个路口都是红灯);首先是状态1(东路口通车,其他路口红灯);过一段时间装入状态2(东路口绿灯闪几次转黄灯亮,延时几秒,其他路口仍然红灯);再转入状态3(南路口绿灯亮,其他路口红灯亮);过一段时间转入状态4(南路口绿灯闪几次转黄灯亮,延时几秒,其他路口仍然红灯);再转入状态5(西路口绿灯亮,其他路口红灯亮);过一段时间转入状态6(西路口绿灯闪几次转黄灯亮,延时几秒,其他路口仍然红灯);再转入状态7(北路口绿灯亮,其他路口红灯亮);过一段时间转入状态8(北路口绿灯闪几次转黄灯亮,延时几秒,其他路口仍然红灯);最后循环至状态1。

(2)各用一组红黄绿色LED分别表示东南西北方向。 (3)由定时器来产生通车延时时间,时间间隔为5s。 (4)用软件延时方法产生“闪”延时时间。

说明:用CPU的P1口和P3口输出控制信号,控制12个LED灯(红、黄、绿),模拟交通灯的管理。各个输出口对应的IO

P1.0·····LED00

P1.1·····LED01 P1.2·····LED02 P1.3·····LED03 P1.4·····LED04 P1.5·····LED05 P1.6·····LED06 P1.7·····LED07 P3.2·····LED08 P3.3·····LED09 P3.4·····LED10 P3.5·····LED11

2、软件编程(包括流程图、完整的汇编源程序及其注释) 程序流程图如图1所示:

程序如下:

#include<reg52.h>

sfr light_address_1=0x90; sfr light_address_2=0xB0;

sbit red_e=P1^0; sbit yellow_e=P1^1; sbit green_e=P1^2;

sbit red_s=P1^3; sbit yellow_s=P1^4; sbit green_s=P1^5;

sbit red_w=P1^6; sbit yellow_w=P1^7; sbit green_w=P3^2;

sbit red_n=P3^3; sbit yellow_n=P3^4; sbit green_n=P3^5;

bit light_up=0; bit light_down=1;

unsigned char light_down_all=0xff; unsigned char count=0;

void delay_MS(unsigned char data0); void Init_timer0(void); void light_state1(); void light_state2(); void light_state3(); void light_state4(); void light_state5(); void light_state6(); void light_state7(); void light_state8();

void main() {

Init_timer0(); while(1)

{light_address_1=light_down_all; light_address_2=light_down_all; light_state1();

light_address_1=light_down_all;

light_address_2=light_down_all; light_state2();

light_address_1=light_down_all; light_address_2=light_down_all; light_state3();

light_address_1=light_down_all; light_address_2=light_down_all; light_state4();

light_address_1=light_down_all; light_address_2=light_down_all; light_state5();

light_address_1=light_down_all; light_address_2=light_down_all; light_state6();

light_address_1=light_down_all; light_address_2=light_down_all; light_state7();

light_address_1=light_down_all; light_address_2=light_down_all; light_state8(); } }

void light_state1() //东路

口绿灯亮,其他路口红灯亮

{ red_s=light_up; red_w=light_up; red_n=light_up; green_e=light_up; count=0;

while(count<100) { } }

void light_state2() //东路

口绿灯闪几次转黄灯亮,延时几秒,其他路口红灯任然亮

{

unsigned char j; red_s=light_up; red_w=light_up; red_n=light_up; for(j=0;j<5;j++) {

green_e=light_up; delay_MS(500);

green_e=light_down; delay_MS(500); }

yellow_e=light_up; count=0;

while(count<20) { } }

void light_state3() //南路

口绿灯亮,其他路口红灯亮

{

green_s=light_up; red_e=light_up; red_w=light_up; red_n=light_up; count=0;

while(count<100) { } }

void light_state4() //南

路口绿灯闪几次转黄灯亮,延时几秒,其他路口红灯亮

{

unsigned char j; red_e=light_up; red_w=light_up; red_n=light_up; for(j=0;j<5;j++) {

green_s=light_up; delay_MS(500);

green_s=light_down; delay_MS(500); }

yellow_s=light_up; count=0;

while(count<20) { } }

void light_state5() //西

路口绿灯亮,其他路口红灯亮 {

red_e=light_up; red_s=light_up; red_n=light_up; green_w=light_up; count=0;

while(count<100) { } }

void light_state6() //{

unsigned char j; red_e=light_up; red_s=light_up; red_n=light_up; for(j=0;j<5;j++) {

green_w=light_up; delay_MS(500);

green_w=light_down; delay_MS(500); }

yellow_w=light_up; count=0;

while(count<20) { } } void light_state7() //{

red_e=light_up; red_s=light_up; red_w=light_up; green_n=light_up; count=0;

while(count<100) { } }

void light_state8() //

西

路口绿灯闪几次转黄灯亮,其他路口红灯北路口绿灯亮,其他路

口红灯亮北路口绿灯闪几次转

{

unsigned char j; red_e=light_up; red_s=light_up; red_w=light_up; for(j=0;j<5;j++) {

green_n=light_up; delay_MS(500);

green_n=light_down; delay_MS(500); }

yellow_n=light_up; count=0;

while(count<20) { } }

void delay_MS(unsigned char data0) {

unsigned char i,j; for(i=0;i<data0;i++) for(j=0;j<120;j++); }

void Init_timer0(void) {

TMOD=0x01; TH0=0x3c; TL0=0xb0; EA=1; ET0=1; TR0=1; }

void Timer0_int() interrupt 1 {

count++; TH0=0x3c; TL0=0xb0; }

黄灯亮,其他路口红灯亮

3、调试说明

在实验室将程序输入电脑进行编译,连接好试验箱上的P1口和P3口与各个LED灯的连线后,将程序通过STC下载软件下载到单片机中,然后上电运行,观察各个LED灯的变化,通过调试,能够达到实验要求,各个LED灯交替闪烁变化,实现交通灯的控制。 下图是用keil软件编译的情况:

下图是STC下载软件:

4、设计结果及错误分析

在软硬件都调试完毕之后,在把所烧写的程序烧入单片机之后,我们开始进行性能的测试,在按下电源按钮后,能够进入交通灯模拟状态,该设计呢鞥够改变红绿灯亮的时间,使交通运行时间更具优化,也更具人性化,在保证交通畅通的情况下减少等待时间。

写好程序后进行了程序的调试和分析,经过调试,只是少了路口左转的功能,具有直行和左转一体的功能,也有黄灯闪烁等待的过程。通过多次的调试分析和论证,最终将程序完整化,完善化。

四、 总结

本系统的硬件控制电路图简单,用汇编语言编程时,位操作指令用的较多,但遇到了很多困难,最后还是采用C语言编写。本软、硬件系统在单片机开发装置上调试运行取得较好的效果,对灵活有效地利用交通灯控制行车安全,车辆分流有一定的实际意义。

从本交通信号灯自动控制系统的设计与实验中可以看出,涉及到数据输出程序的设计方法;模拟交通灯控制的方法;信号灯的使用.在此基础上我们可对其进行改进,加入中断的要求,从而涉及外部中断技术的基本使用方法和编程方

法.8051内部定时/计数器的使用和编程方法;而且还可以在外部中断中增加用继电器的开合模拟急救车通过的声音等要求.

在整个设计与制作过程中,从一开始拿到题目,经过查阅有关方面的书籍,到分析与设计,以P1和P3口作为输出来控制LED灯的亮灭和闪烁,用C语言和Keil软件来编写程序,来实现对硬件电路的控制。对于程序的调试,通过多次调试,得到完整正确的程序。继而,将程序烧录到单片机芯片中,LED显示正常达到本次设计的目的。完成了适当的硬件电路的设计和软件的编程与调试、控制。

本文来源:https://www.bwwdw.com/article/nbt1.html

Top