交通灯控制器课程设计报告

河南科技大学

课程名称 __单片机原理课程设计_

题目名称 _  交通灯控制器设计   

学生学院 ___  信息工程学院_____

专业班级 __自动化114      __

学    号                        

学生姓名 __          _ ___  ___

指导教师 __           _ _______

2014  年 6 月 5 日


课程设计任务书

(指导教师填写)

课程设计名称  单片机原理     学生姓名        专业班级  自动化114    

设计题目                        交通灯控制器设计                        

一、课程设计目的

1.   培养学生文献检索的能力,如何利用Internet检索需要的文献资料。

2.   培养学生综合分析问题、发现问题和解决问题的能力。

3.   培养学生综合运用知识的能力和工程设计的能力。

4.   培养学生理论联系实际的能力。

5.   提高学生课程设计报告撰写水平。

二、设计内容、技术条件和要求

1设计内容

    交通灯控制器设计主要功能是用单片机控制LED灯模拟指示。模拟东西南北方向的十字路口交通灯信号控制情况。以89C51单片机为核心芯片,采用中断方式实现控制。

(1)数码管选用2位共阴极显示的数码管,共4个;

(2)东西通行时间为80s,南北通行时间为60s,缓冲时间为3s;

2 设计要求

?   设计单片机最小系统(包括复位按钮、晶振电路等);

?   绘制实现本设计内容的硬件电路(原理图),系统的组成框图。

?   相应的控制状态表;

?   编写本课程设计内容的软件设计(包含程序流程图和对程序注释)。

?   硬件实验部分可选用实验箱测试或Proteus仿真软件实现。

3 总体设计思想(供参考)

?   利用定时器T0产生每10ms一次的中断,每100次中断为1s;

?   对两个方向分别显示红、绿、黄灯的剩余时间即可;

?   用MAX7219芯片实现共阴极显示驱动;

?   A方向的红灯时间=方向的绿灯时间+黄灯缓冲时间。

4  设计参考

    交通灯控制器设计有电源电路、单片机主控电路、显示电路、信号灯电路等组成,如图1所示:

5 知识点准备:

?   +5V电源原理及设计;

?   MAX7219工作原理;

?   单片机复位电路工作原理及设计(元件选择的依据);

?   单片机晶振电路工作原理及设计(元件选择的依据);

?   数码管显示特性、驱动设计及应用;

?   LM1602液晶显示屏特性、驱动设计及应用;

?   89C51单片机引脚资源、引脚分配等;

?   单片机汇编语言及程序设计(中断、延时子程序的设计)。

图1  交通灯控制器设计框图

三  时间进度安排

按教学计划规定,单片机原理课程设计总学时为1周,其进度安排和时间大致分配如下:

1.      十五周周一至周二  查阅资料、进行软、硬件初步设计;

2.      十五周周三至周四  上机调试,发现问题,解决问题,完善课程设计;

3.      十五周周五       总结设计过程,编写课程设计报告书。

四  主要参考文献

1、何立民. 单片机高级教程. 第1版.北京:北京航空航天大学出版社,2001

2、徐爱钧  KEIL Cx V7.0单片机高级语言编程与uVision2应用实践,北京,电子工业出版社,2004

3、李全利、仲伟峰、徐军,单片机原理及应用,北京:清华大学出版社,2006

五、设计分组及选题安排

    自动化114班所有学生。

指导教师签字:                   

 20##年05月30日


单片机课程设计报告

一、设计项目简介

随着人类科技文明的发展,人们对于日常交通便利的要求在不断地提高。交通信号灯被看成一种用来指挥交通的工具,当前高精度、多功能、小体积、低功耗,是现代交通信号灯发展的趋势。本课题设计正是基于这个方向设计一个符合指标要求的模拟交通信号灯控制器。

单片机在电子产品中的应用越来越广泛,特别是51系列的单片机,由于其使用方便、价格低廉等优势,在市场上占有很大的份额。AT89C51就是51系列中的一个比较成熟的型号,它完全兼容51单片机的指令。

本课题设计是基于单片机技术原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计出的一个模拟交通信号灯控制系统。该控制系统包括了按键复位电路、定时控制电路、显示电路等几部分的组成。设计以硬件和软件相结合为指导思想,通过软件编程实现系统大部分功能,电路简单明了,系统稳定性高。

本次课程设计所设计的交通灯控制器实现了以下几点功能:

一、显示电路实现显示各方向上红、绿、黄三种交通信号灯的剩余时间。

二、信号灯电路实现显示各路口的红黄绿交通信号灯。

三、按键复位电路实现对信号灯控制器的复位功能。

二、总体设计

利用AT89C51单片机,LED灯,共阴极数码管和MAX7219芯片来设计并实现交通灯控制系统,用单片机控制LED灯模拟指示。模拟东西南北方向的十字路口交通灯信号控制情况,并用MAX7219控制共阴极数码管来倒计时显示红灯、绿灯、黄灯的时间。

利用中断方式实现以上功能,设置定时器T0为工作方式1并装初值来实现数码管中的时间的倒计时。定时器T0产生每10ms一次的中断,每100次中断为1s;

本次交通灯控制器电路有以下几个电路模块组成,电源电路、单片机主控电路、显示电路、信号灯电路,各个电路之间相互联系,并用编程的方式对单片机各个引脚进行定义,从而实现交通灯的功能。

电路的各个模块之间的总体框图如下:

 

单片机交通控制系统的通行方案设计

   设在十字路口,分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。其具体状态如下图所示。说明:黑色表示亮,白色表示灭。

通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如下:

◆东西方向红灯灭,同时绿灯亮,南北方向黄灯灭,同时红灯亮,倒计时80秒。此状态下,东西向禁止通行,南北向允许通行。

◆东西方向绿灯灭,同时黄灯亮,南北方向红灯亮,倒计时3秒。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。

◆南北方向红灯灭,同时绿灯亮,东西方向黄灯灭,同时红灯亮,倒计时60秒。此状态下,东西向允许通行,南北向禁止通行。

◆南北方向绿灯灭,同时黄灯亮,东西方向红灯亮,倒计时3秒。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。

三、硬件设计

AT89C51单片机简介

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51单片机的主要特性

与MCS-51 兼容 ,4K字节可编程闪烁存储器 ,寿命:1000写/擦循环,数据保留时间:10年,全静态工作:0Hz-24Hz,三级程序存储器锁定,128*8位内部RAM,32可编程I/O线,两个16位定时器/计数器,5个中断源(两个外部中断源和3个内部中断源) ,可编程串行通道,低功耗的闲置和掉电模式,片内振荡器和时钟电路。

?时钟电路:

时钟电路的作用是产生单片机工作所需要的时钟脉冲序列。

?中断系统:

中断系统的作用主要是对外部或内部的终端请求进行管理与处理。AT89C51共有5个中断源,其中又2个外部中断源和3个内部中断源。

AT89C51系列单片机的内部结构示意图如下:


AT89C51主要引脚功能:


?VCC:电源电压

?GND:接地

?P0口:P0口是一组8位双向I/0口。P0口即可作地址/数据总线使用,又可以作为通用的I/O口使用。当CPU访问片外存储器时,P0口分时先作低8位地址总线,后作双向数据总线,此时,P0口就不能再作I/O口使用了。在访问期间激活要使用上拉电阻。

?P1口:Pl 是一个带内部上拉电阻的8准位双向I/O口,P1作为通用的I/O口使用。

?P2 口:P2 是一个带有内部上拉电阻的8 位准双向I/O 口,P2即可作为通用的I/O口使用,也可以作为片外存储器的高8位地址总线,与P0口配合,组成16位片外存储器单元地址。

?P3 口:P3 口是一组带有内部上拉电阻的8 位准双向I/0 口。P3 口除了作为通用的I/O口使用之外,每个引脚还具有第二功能。具体如下表所示:

?RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。WDT 溢出将使该引脚输出高电平,设置SFR AUXR的DISRT0 位(地址8EH)可打开或关闭该功能。DISRT0位缺省为RESET输出高电平打开状态。

单片机最小系统设计如下图,其包含晶振电路与复位电路:

                           单片机最小系统

MAX7219——共阴极数码管驱动芯片简介:

MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。

         MAX7129芯片外部引脚分配图

各引脚的功能为:

DIN:串行数据输入端

DOUT:串行数据输出端,用于级连扩展

LOAD:装载数据输入

CLK:串行时钟输入

DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流

SEG  A~SEG  G  DP     7 段驱动和小数点驱动

ISET:   通过一个10k电阻和Vcc相连,设置段电流

MAX7219芯片电路连接图:

显示电路:

1、八段共阴极数码管:

   LED显示屏作为大型显示设备的一种,具有亮度高、价格低、寿命长、维护简便等优点。LED数码管的结构简单,分为七段和八段两种形式,也有共阳和共阴之分。八段共阴管它有8个发光二极管(比七段多一个发光二极管,用来显示dP,即点),每个发光二极管的阴极连在一起,,一个LED数码管就有I根位选线和8根段选线,要想显示一个数值,就要分别对它们的高低电平来加以控制。

2、发光二极管:

          根据本设计的特点,红绿灯的显示不可少,红绿灯的显示采用普通的                发光二极管。每个方向上设置红绿黄灯,总共4组。如果东西红灯亮,                  那南北方向就是绿灯亮,反之亦然。

总电路设计图:

显示效果图:

        南北通行:                           东西通行:

             

黄灯显示:

四、软件设计


五、程序清单

# include <reg52.h>

# define uchar unsigned char

# define uint unsigned int

# include "MAX.h"

uchar code tab[] = {0x06, 0x05, 0x03}; //显示绿、黄、红的段码

uchar count;  //记录定时中断次数

uchar flag;     // 记录南北时间到零的次数

uchar flag1;  // 记录东西时间到零的次数

uchar SN= 82;  //南北方向红灯显示初始时间

uchar EW = 79;  //东西方向绿灯显示初始时间

/*********************************************/

void display(uchar num1, uchar num2) //向MAX7219送数据并显示函数

{

      write_7219(0x1, num1 / 10);

      write_7219(0x2, num1 % 10);

      write_7219(0x3, num2 / 10);

      write_7219(0x4, num2 % 10);

}

/***********************************/

void init_time(void)                //定时器的初始化函数          

{                                                                                

      TMOD = 0x01;                 //设定时器0为模式1,16位模式

      TH0 = 0xd8;

      TL0 = 0xf0;                       //设定时值为10000us(10ms)                              

      EA  = 1;

      IT0 = 1;                            

      ET0 = 1;                           //定时器0中断打开

      TR0 = 1;

                                 

}

/*****************************************/

void t0_time() interrupt 1              //定时器0中断函数

{

      TH0 = 0xd8;                               //装初值

      TL0 = 0xf0;

      count++;                                      //中断一次计数加1

      if(count == 100)                   //1S时间到

      {

             count = 0;    

             if(SN == 0 )                 //判断南北时间是否到0

             {

                    flag++;                         // 南北时间到零的次数+1

                    if(flag % 3 == 1)   // 如果是周期内第1次南北时间到零

                    {

                           SN = 60;              //给南北显示时间重新赋值,绿灯显示时间

                           P1 = tab[0];    // 南北方向绿灯亮

                    }

                    else if(flag % 3 == 2)   // 如果是周期内第2次南北时间到零

                                  {

                                         SN = 3;  //给南北显示时间重新赋值,黄灯显示时间

                                         P1 = tab[1];   // 南北方向黄灯亮

                                  }

                             else

                                {

                                         SN = 82;       //给南北显示时间赋值,红灯灯显示时间

                                         P1 = tab[2];  // 南北方向红灯灯亮

                                         flag = 0;        //计数清零,进入下一个循环

                                  }

             }

      if(EW == 0)                                           //判断东西时间是否到0

      {                                                            

            flag1++;                                   // 东西时间到零的次数+1

             if(flag1 % 3 == 1)                     // 如果是周期内第1次东西时间到零

             {

                    EW = 3;               //给东西显示时间重新赋值,黄灯显示时间

                    P0 = tab[1];                   // 南北方向黄灯亮

             }

             else if(flag1 % 3 == 2)

                    {

                           EW = 63;             //给东西显示时间重新赋值,红灯显示时间

                           P0 = tab[2];           // 南北方向红灯亮

                    }

                    else

                    {

                           EW = 79;             //给南北显示时间重新赋值,绿灯显示时间

                           P0 = tab[0];         // 南北方向绿灯亮

                           flag1 = 0;                    //计数清零,进入下一个循环

                    }

      }

            

      display(EW--, SN--);         //将东西、南北时间送到MAX7219并显示

      }

}

/***************主函数**************************/

void main()

{

      init_time();                    //调用定时器初始化函数

      init_7219();                   //调用MAX7219初始化函数

      display(EW--, SN--);     //将初始东西、南北显示时间送入MAX7219并显示

      P0 = tab[0];                   //南北方向显示绿灯

      P1 = tab[2];                   //东西方向显示红灯

      while(1);                               //死循环,等待中断

}

/***********MAX7219头文件包含数据的写入与发送***************/

# ifndef _MAX_H_

# define _MAX_H_

sbit DIN  = P3^0;          //MAX7219 片选             P3^0 脚

sbit LOAD = P3^1;         //MAX7219 串行数据        P3^1 脚

sbit CLK  = P3^2;          //MAX7219 串行时钟         P3^2 脚

/********地址、数据发送子程序**********/

void write_7219(uchar add, uchar dat) 

{

      uchar i;

      LOAD = 0;                                        //拉低片选线,选中器件

      /**********发送地址****************/

      for(i = 0; i < 8; i++)                     //移位循环8次

      {

            CLK = 0;                                     //清零时钟总线

             DIN = (bit)(add & 0x80);    //每次取高字节

             add <<= 1;                                 //左移一位

             CLK = 1;                                    //时钟上升沿,发送地址

      }

      /**************发送数据******************/

      for(i = 0; i < 8; i++)

      {

             CLK = 0;

             DIN = (bit)(dat & 0x80);

             dat <<= 1;

             CLK = 1;                                     //时钟上升沿,发送地址

      }

      LOAD = 1;                                        //发送结束,上升沿锁存数据

}

/********MAX7219初始化,设置MAX7219内部的控制寄存器**********/

void init_7219(void)

{

      write_7219(0x0c, 0x01);                          //开启正常工作模式(0xX1)

      write_7219(0x0f, 0x00);                          //选择工作模式(0xX0)

      write_7219(0x09, 0xff);                          //选用全译码模式

      write_7219(0x0b, 0x07);                         //8 只LED全用

      write_7219(0x0a, 0x04);                          //设置初始亮度

}

# endif


六、收获及体会

经过一周的努力工作,终于完成了自己的单片机课程设计。虽说忙碌了点,但我觉得这样的生活充实且有成就感,当然,也获益匪浅。

 整个课程设计过程我还掌握了一下几点:

(1)掌握了电子系统设计的流程,熟悉了各种硬件电路以及软件编程方法。

(2)理解了最单片机的各部分组成及特性。

(3)熟练使用了各种计算机辅助设计工具完成设计,充分掌握了这些工具的使用。

(4)学会了利用Keil uVision3对C语言进行编译过程.更进一步加深了对PROTEUS软件的学习。

(5)通过查看MA7219的芯片手册,学会了其使用方法一起编程原理。为以后使用其他芯片,需查看芯片技术手册编程打下了基础。

不过在本次试验中也出现了不少问题。比如,在用定时器计数时,在中断程序里每次都对东西南北的显示时间赋值,导致显示时一直停留在初始值,不变化。经过不断的调整,终于找到问题所在,并予以解决。

我觉得该交通控制器还不是特别完善,在实际生活中,各交叉路口的红绿灯可以根据车流情况调整红绿灯的间隔时间,以达到道路的通畅。而该交通控制器无该项功能。不过可以在其基础上加以改进,加上按键功能,使其可以人为的调整通行的时间,以达到更人性化的交通控制器。

通过本次的课程设计,充分意识到自己所学的东西还是非常有限的,不过通过设计,还是学到了一些书本上没有学到的东西,为自己以后的学习起了很大的帮助。就我个人而言,很深刻地体会到一点,那就是我们在设计过程中一定要有一个整体的清晰的思路,知道自己的设计的对象的基本功能和核心器件的适用及其作用,只要把握住这些主要方面,一些小问题都将围绕着这些主要问题而逐步得到解决。

 实践出真知,通过课程设计这些项目的练习我自学能力,解决实际问题的能力得到提高,可以说是对综合素质全面提升,我想这也是我们上大学应真正学到的。

七、参考文献

1、张俊谟:《单片机中级教程—原理与应用》                                                           北京航空航天大学出版社,2006

2、叶挺秀:《应用电子学[M]》     浙江大学出版社,1994

3、周润景:《PEOTEUS在MCS-51&ARM7系统中的应用百例》                                 电子工业出版社,2006

4、唐 工.:《51单片机工程应用实例》

5、边海龙,孙永奎.:《单片机开发与典型工程项目实例详解》                                                   .电子工业出版社,2008

相关推荐