
——交通信号灯设计报告
专业:计算机科学与技术系
班级:计科0702班
成员:何传喜
沈 加
汪亚文
2009年5月18日
一、设计摘要:
根据交通灯的设计原理及要求,通过总体设计交通灯原理接线图,综合应用单片机原理、微机原理、微机接口技术等方面的知识,结合单片机仿真系统的使用方法,通过软硬件结合,使用C52单片机来设计出符合要求的交通灯控制系统。完成由单片机C52、发光二极管、 LED数字显示器、开关、部分电阻及电容组成的交通灯控制系统。系统除基本交通灯功能外,还具有倒计时、显示时间设置、LED信息显示等功能。
关键词:ATC52单片机、交通灯、LED数码管
二、设计的基本思路及要求
1、设计要求
(1)设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。
(2)主干道处于常允许通行的状态,支干道有车来时才允许通行。主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯。
(3)主、支干道均有车时,两者交替允许通行,主干道每次放行45秒,支干道每次放行25秒,设立45秒、25秒计时、显示电路。
(4)在每次由绿灯亮到红灯亮的转换过程中,要亮5秒黄灯作为过渡,使行驶中的车辆有时间停到禁行线外,设立5秒计时、显示电路。
2、具体设计思路.
利用c52单片机控制交通灯系统工作。其中P0口接数据输出口,与外部数码管连接,P2口与数码管的COM口连接,用于选择数据输出的地址,这样就可以实现时间的动态显示,并且节省了端口数。P1口作为红黄绿灯的控制口,通过上拉电阻将红黄绿灯的正极接高电平,负极接在P1口上,我们可以利用控制单片机的P1口的输出数据控制红黄绿灯的亮灭。调时可以利用外部中断INT0申请中断。当有外部中断的时候,单片机的PC指向INT0的中断入口地址,从而转向中断服务程序。这是我们可以通过判断外部开关量的状态来对红黄绿灯的显示时间进行修改。同时当INT0为低电平时,东西南北方向的都送红灯亮,实现紧急情况下禁止通行。然后通过判断INT0的状态来决定中断是否返回,当INT0为低电平时,说明开关又一次按下,这是退出中断服务程序,继续执行主程序。
3、交通灯控制系统状态表
| 状态 | 主干道 | 支干道 | 时间 |
| s0 | 绿灯亮,允许通行 | 红灯亮,禁止通行 | 45秒 |
| s1 | 黄灯亮,停车 | 红灯亮,禁止通行 | 5秒 |
| s2 | 红灯亮,禁止通行 | 绿灯亮,允许通行 | 25秒 |
| s3 | 红灯亮,禁止通行 | 黄灯亮,停车 | 5秒 |
总体设计方案共有五个部分组成,分别是:单片机C52、发光二极管电路、LED数显电路及驱动电路、晶振及复位控制电路、控制与调时开关电路。该设计的设计方框图如图1所示,
图1
四、交通灯各部分功能分析及各逻辑器件描述
(1)时钟定时控制部件
由于ATC52单片机内部有一个用于构成振荡器的高增益反向放大器,此放大器的输入和输出端分别是引脚XTAL1和XTAL2,在XTAL1和XTAL2上外接时钟源即可构成时钟电路,该电路采用的是内部方式,如图2所示:
图2
在XTAL1和XTAL2的两端接石英晶体振荡器,与内部反向器构成稳定的自激振荡器,发出的时钟脉冲直接进入片内定时定时控制部件。用以提供交通灯时钟信号。
在该电路的设计过程中,C1、C2的选取对频率有微调作用,选取值是20pF。为了减少寄生电容,保证振荡器稳定和可靠的工作,在接线时将晶振和电容的管脚接在单片机最近的地方。
(2)LED数字显示电路
图3
如上图3所示为其管脚配置,该电路选用的LED显示器是共阳极,采用动态显示。
(3)C52单片机
C52提供以下标准功能:8K字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两极中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时, C52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作,掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
其管脚如图4所示
图4
(4)上电加按钮电平复位电路
如下图5所示:我们采用上电+按钮复位的方式。当开关打开时,RST通过电阻接地,当有开关闭合时由于电容的作用使电源VCC通过电阻施加在单片机复位端RST上,实现单片机复位。
图5
(5)红黄绿灯显示电路:红黄绿灯显示电路如下图6所示。二极管的正极通过上拉电阻接+5v的电源VCC,负极分别接C52单片机的外部接口P1.0、P1.1、P1.2、P1.3、P1.4、P1.5口,我们可以通过控制单片机P1口的数据输出来控制二极管的亮灭。例如为P1口送值为#0DEH,则南北红灯亮禁止通行,东西绿灯亮允许通行。
图6
当系统上电时,实验电路开始工作。七段数码管开始40秒倒计时,计时起始信号由主控电路给出,定时结束信号也输入到主控芯片,由主控芯片启、闭三色信号灯或启动另一计时电路。在这里正确的程序是核心,应该完成一个时序电路的工作。其状态表(1)为:
| 状态 | 南北干道 | 东西干道 | 时间 |
| 1 | 红灯亮,禁止通行 | 绿灯亮,允许通行 | 40秒 |
| 2 | 红灯亮, 禁止通行 | 黄灯亮,停车 | 5秒 |
| 3 | 绿灯亮,允许通行 | 红灯亮,禁止通行 | 30秒 |
| 4 | 黄灯亮,停车 | 红灯亮,禁止通行 | 5秒 |
五、元件列表
| 名称 | 数量 | 元件说明 |
| 单片机 | 一个 | 52型单片机 |
| 发光二极管 | 12个 | 红色、黄色、绿色各四个 |
| LED数字显示器 | 四个 | 分段式数字显示器(共阳极) |
| 石英晶体振荡器 | 一个 | 12兆振荡频率 |
| 电阻 | 18个 | 510欧16个,5.1K2个 |
| 电容 | 3个 | 20pF2个,20uF1个 |
| 开关 | 2个 |
(1)主程序流程图
七、系统原理图
八.程序设计
#include #define uchar unsigned char #define uint unsigned int uchar code dispcode[]={0x88,0xdb,0x94,0x91,0xc3,0xa1,0xa0,0x9b,0x80,0x81}; uchar second[]={45,5,25,5}; uchar code table[]={0xf3,0xf5,0xde,0xee}; sbit P20=P2^0; sbit P21=P2^1; sbit P22=P2^2; sbit P23=P2^3; unsigned char tcount; unsigned char time; unsigned char order; void delay(uint ms) // 毫秒级延时(ATC52 @ 11.0592MHz) { uint ti; while(ms--) { for(ti=0;ti<112;ti++){}//112 } } void main(void) { P0=0xff; P1=0xff; P2=0xff; P3=0xff; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; ET0=1; EA=1; order=0; tcount=0; time=second[order]; P1=table[0]; P20=1;P21=0;P22=0;P23=0; P0=dispcode[time/10]; delay(8); P0=0xff; P20=0;P21=1;P22=0;P23=0; P0=dispcode[time%10]; delay(8); P0=0xff; P20=0;P21=0;P22=1;P23=0; P0=dispcode[(time+5)/10]; delay(8); P0=0xff; P20=0;P21=0;P22=0;P23=1; P0=dispcode[(time+5)%10]; delay(8); P0=0xff; while(1) { switch (order) { case 0: P1=table[0]; P20=1;P21=0;P22=0;P23=0; P0=dispcode[time/10]; delay(8); P0=0xff; P20=0;P21=1;P22=0;P23=0; P0=dispcode[time%10]; delay(8); P0=0xff; P20=0;P21=0;P22=1;P23=0; P0=dispcode[(time+5)/10]; delay(8); P0=0xff; P20=0;P21=0;P22=0;P23=1; P0=dispcode[(time+5)%10]; delay(8); P0=0xff; break; case 1: P1=table[1]; P20=1;P21=0;P22=0;P23=0; P0=dispcode[time/10]; delay(8); P0=0xff; P20=0;P21=1;P22=0;P23=0; P0=dispcode[time%10]; delay(8); P0=0xff; P20=0;P21=0;P22=1;P23=0; P0=dispcode[time/10]; delay(8); P0=0xff; P20=0;P21=0;P22=0;P23=1; P0=dispcode[time%10]; delay(8); P0=0xff; break; case 2: P1=table[2]; P20=1;P21=0;P22=0;P23=0; P0=dispcode[(time+5)/10]; delay(8); P0=0xff; P20=0;P21=1;P22=0;P23=0; P0=dispcode[(time+5)%10]; delay(8); P0=0xff; P20=0;P21=0;P22=1;P23=0; P0=dispcode[time/10]; delay(8); P0=0xff; P20=0;P21=0;P22=0;P23=1; P0=dispcode[time%10]; delay(8); P0=0xff; break; case 3: P1=table[3]; P20=1;P21=0;P22=0;P23=0; P0=dispcode[time/10]; delay(8); P0=0xff; P20=0;P21=1;P22=0;P23=0; P0=dispcode[time%10]; delay(8); P0=0xff; P20=0;P21=0;P22=1;P23=0; P0=dispcode[time/10]; delay(8); P0=0xff; P20=0;P21=0;P22=0;P23=1; P0=dispcode[time%10]; delay(8); P0=0xff; break; } } } void t0(void) interrupt 1 using 0 { tcount++; if(tcount==20) { tcount=0; time--; } TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; if(time==0) { if (order==3) { order=0; } else { order++; } time=second[order]; } } 九,系统调试 1、硬件调试:按照已经设计好的电路设计图,在万能印刷电路板上焊接各个元件。电路板制作完成以后,利用万用表检查硬件是否焊接正常以及是否出现短路和断路的情况,并修改焊接中的错误,直到硬件电路可以正常工作为止。在第一次进行检测时发现显示管不会显示数据,经过进一步检查才发现是电源线没有焊接。如此反复操作,直到硬件可以正常运行。 2、软件调试:程序编好以后,先自己检查是否有逻辑错误,保证正确后利用伟福仿真软件对所编写的程序进行编译,检查是否有语法错误,出现错误时伟福系统会自动提示有错误产生,并会指定错误的语句,这时我们需要认真检查程序,修改编译中出现的错误。程序修改无误后,利用仿真软件,我们可以监视程序PC指针、P0、P1、P2口的变化、以及存储单元的值的变化来检查程序是否运行正常,是否能够实现预定的控制功能。
