课程设计任务书
学生姓名: 王凯 专业班级:电子科学与技术0901班
指导教师: 吴友宇 工作单位: 信息工程学院
题 目: 交通信号灯控制器的设计
初始条件:
本设计既可以使用集成集成译码器、计数器、定时器、脉冲发生器和必要的门电路等。本设计也可以使用单片机系统构建交通信号灯控制器。
用数码管显示时间计数值,用红、黄、绿LED作信号灯。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1、课程设计工作量:1周。
2、技术要求:
① 要求甲车道和乙车道两条交叉道路上的车辆交替运行(以红绿灯指示),每次通行时间设为0—30秒(可预置);变更车道以前,黄灯先亮5秒钟,黄灯亮时,要求每秒钟闪亮一次;两个车道均以减计数方式显示时间。其余部分可根据情况自行发挥。
② 确定设计方案,按功能模块的划分选择元、器件和集成电路,设计分电路,阐述基本原理。
③绘制总体电路原理图。
3、查阅至少5篇参考文献。按《武汉理工大学课程设计工作规范》要求撰写设计报告书。全文用A4纸打印,图纸应符合绘图规范。
时间安排:
1、 20## 年 7 月 3 日集中,作课设具体实施计划与课程设计报告格式的要求说明。
2、 20## 年 7 月 3 日,查阅相关资料,学习电路的工作原理。
2、 20##年 7 月 4 日 至 2011 年 7 月 5日,方案选择和电路设计。
2、 20## 年 7 月 6日 至 2011 年 7 月 7 日,电路调试和设计说明书撰写。
3、 20## 年 7 月 8 日上交课程设计成果及报告,同时进行答辩。
指导教师签名: 年 月 日
系主任(或责任教师)签名: 年 月 日
系主任(或责任教师)签名: 年 月 日
目 录
摘 要. 7
交通信号灯控制器的设计. 8
1 任务要求与设计. 8
1.1 设计目的. 8
1.2 设计任务和内容. 8
1.2.1设计任务. 8
1.2.2设计内容. 8
2 总体方案比较. 9
2.1 方案论证. 9
2.2 方案选择. 10
3 总体硬件电路设计及核心器件介绍. 11
3.1总体设计. 11
4单元电路模块设计. 12
4.1复位电路、晶振电路. 12
4.2 LED数码管显示电路. 12
4.3 仿真原理图. 13
5软件编程设计. 14
5.1 设计思想. 14
5.2 程序框图. 15
6 心得体会. 16
参考文献. 17
附录1 原件清单. 18
附录3 总电路图. 18
附录3 源程序. 18
摘 要
交通在人们的日常生活中占有重要的地位,随着人们社会活动的日益频繁,这点更是体现的淋漓尽致。交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。本系统采用单片机AT89C51为中心器件来设计交通灯控制器,系统实用性强、操作简单、扩展性强。本设计就是采用单片机模拟十字路口交通灯的状态显示以及倒计时。
本设计系统由单片机I/O口扩展系统、交通灯状态显示系统、LED数码显示系统、复位电路等几大部分组成。系统除基本的交通灯功能外,还具有倒计时功能,较好的模拟实现了十字路口可能出现的状况。
软件上采用汇编语言编程,主要编写了主程序,LED数码管显示程序。经过整机调试,实现了对十字路口交通灯的模拟。
关键词:交通灯 单片机 C语言
交通信号灯控制器的设计
1 任务要求与设计
1.1 设计目的
(1)加强对单片机和C语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、选择芯片器件、模块化编程等多项知识。
(2)用单片机模拟实现具体应用,使个人设计能够真正使用。
(3)把理论知识与实践相结合,充分发挥个人能力,并在实践中锻炼。
(4)提高利用已学知识分析和解决问题的能力。
(5)提高实践动手能力。
1.2 设计任务和内容
1.2.1设计任务
①要求甲车道和乙车道两条交叉道路上的车辆交替运行(以红绿灯指示),每次通行时间设为0—30秒(可预置);变更车道以前,黄灯先亮5秒钟,黄灯亮时,要求每秒钟闪亮一次;两个车道均以减计数方式显示时间。其余部分可根据情况自行发挥。
②确定设计方案,按功能模块的划分选择元、器件和集成电路,设计分电路,阐述基本原理。
③绘制总体电路原理图。
1.2.2设计内容
(1)填写设计任务书。
(2)进行总体设计,画出原理图。
(3)编写并调试程序。
(4)用Proteus软件进行仿真。
2 总体方案比较
为了实现上述功能,有两种选择,其一是采用纯硬件设置,可以使用集成集成译码器、计数器、定时器、脉冲发生器和必要的门电路设计技术延时显示电路,只需要手动按键,电路自行实现功能。另一选择就是通过编程使用单片机系统,利用软件硬件结合。
2.1 方案论证
方案一:如图 2-1采用集成集成译码器、计数器、定时器、脉冲发生器以及所需要的门电路,首先周期为一秒的脉冲发生器产生脉冲沿使计数器进行一秒钟计数,计数通过译码器将计数值送给数码管显示作为交通灯的倒计时显示,倒计时为零时产生计数脉冲改变LED灯的亮与灭,逻辑开关包括总开关、复位开关和预置数功能。
图 2-1方案一原理框图
方案二:如图2-2 此方案主要以单片机为核心,采用C语言编程实现交通灯效果。此方式为软硬件结合,硬件包括单片机最小系统,复位电路,数码管显示模块和LED灯模块。软件设计时包括四种状态转换,中断延时程序。系统框图如图。
图2-2 方案二原理图
2.2 方案选择
第一中方案使用纯硬件电路比较容易理解也也不需要软件设计,但是硬件焊接电路较复杂,而且需要比较精确的脉冲信号源,对硬件电路要求较高,第二种方案硬件电路很简单也几乎不需要电阻电容的组织选择,而且只需要+5V直接稳压电源,采用程序实现数码管与LED灯显示功能,所以综合难易程度也可实现性,选择第二种方案。
3 总体硬件电路设计及核心器件介绍
3.1总体设计
整个设计以AT89C51单片机为核心,LED数码管显示,晶振电路,复位电路组成。
硬件模块入图3-1。
图3-1 硬件原理图
4单元电路模块设计
4.1复位电路、晶振电路
复位电路、晶振电路总体电路图如图 4-1
图 4-1 复位电路、晶振电路
4.2 LED数码管显示电路
在单片机应用系统中,数码管显示常用两种方法:静态显示和动态扫描显示。所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种方法单片机中CPU的开销小,可以提供单独锁存的I/O接口电路很多,动态扫描电路软件设计较为复杂,由于89C52的可供使用I/O口足够多所以采用静态扫描。
此处使用74LS04是由于数码管位选段选直接与单片机I/O口相连,但是单片机I/O口输出电流很小,可能不足以带动数码管位选,则会导致数码管显示不够亮,此处使用的非门作为驱动,增加输出电流。
电路图如图 4-2
图 4-2 LED数码管显示电路
4.3 仿真原理图
如图4-3 数码管LED灯初始化显示(倒计时为三十秒)
当数码管倒计时到22秒时,此时状态是南北路红灯亮而东西路绿灯亮。
图4-3 仿真原理图
5软件编程设计
5.1 设计思想及程序框图
软件编程是实现交通信号灯显示的灵魂,由于设计要求LED灯循环显示,,并且倒计数时间可以(0~30s)预置数。程序可以分为按键模块,LED灯循环显示模块,数码管计数模块。
如图5-1所示根据分析可以将交通灯根据其显示情况可以分为四个状态,可以通过中断定时来控制每个状态的时间,程序总思路是 首先设计一秒钟的中断模块,在一秒到来时,数码管计数显示减一,当倒计时到五秒时状态转换到黄灯亮另一路口继续红灯亮,,倒计时到零,从新显示预置数值,状态装换到一路口红灯灭,另一路口路灯亮,然后继续倒计时五秒,装换状态,完成这四个状态构成一个完整的程序循环
图5-1 程序框图
6 心得体会
心得体会
今年是第二次做课程设计,上次做的很匆忙,可想而知结果也很糟糕,总结了上次的经验与教训,这次准备的比较早,虽然遇到了很多的困难与问题,但是在自己的自学和同学的帮助之下,圆满的完成任务。
本设计采用的是软硬件结合的方案,所以对软件编程和硬件焊接排布都有一定的要求,而且这也是我第一次自己写C语言程序,刚开始思路很僵硬也不知道机械语言的那种很强的逻辑性,最后通过多看程序,多思考和改进终于实现软件功能。
虽然硬件电路比较简单,但是首先要有比较好的布局,这关系到美观和走线的方便,再一个就是电路的排查方面,第一次焊出来的电路总是或多或少有一些接触不良的问题这就需要细心与耐心的排查。
总体觉得这次的课程设计对自己自学能力动手能力是一个很大的考验和检查。
参考文献
[1] 叶挺秀.应用电子学.杭州:浙江大学出版社,1994
[2] 朱承高.电工及电子技术手册.北京:高等教育出版社,1990
[3] 周润景.PEOTEUS在MCS-51&ARM7系统中的应用百例.北京:电子工业出版社,2006
[4] 李朝青.单片机原理及接口技术(第三版).北京:北京航空航天大学出版社,2005
[5]刘艳萍,高振斌,李志军.EDA实用技术及应用.北京:国防工业出版社,2006.
附录1 原件清单
附录2 总电路图
附录3 源程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit kai=P2^2;
sbit jia=P2^4;
sbit jian=P2^3;
sbit shiwen=P3^0;
sbit gewen=P3^1;
sbit LED_BLUE1=P3^2;
sbit LED_RED1=P3^3;
sbit LED_YELLOW1=P3^4;
sbit LED_BLUE2=P2^5;
sbit LED_RED2=P2^7;
sbit LED_YELLOW2=P2^6;
bit wen=1,guan;
uchar TIME,i,z;
char TIME_MAX1=30;
/*uchar code table[]={
0x30,0xf3,0x98,
0x91,0x53,0x15,
0x14,0xb3,0x10,0x11}; */
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90};
uchar wenxuan[]={0,1};shuzi[]={0,0};
void delayms(uchar z)
{
uchar x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void re_display(uchar z)
{
shuzi[0]=z/2/10;
shuzi[1]=z/2%10;
}
void display()
{
P0=0xff;
shiwen=wenxuan[wen];
gewen=!wenxuan[wen];
P0=table[shuzi[wen]];
}
void set_zhuangtai(uchar zhuangtai)
{
if(zhuangtai==0)
{
LED_BLUE1=0;
LED_RED1=1;
LED_YELLOW1=1;
LED_BLUE2=1;
LED_RED2=0;
LED_YELLOW2=1;
TIME=2*TIME_MAX1+1;
}
else if(zhuangtai==1)
{
LED_BLUE1=1;
LED_RED1=1;
LED_YELLOW1=!LED_YELLOW1;
LED_BLUE2=1;
LED_RED2=0;
LED_YELLOW2=1;
}
else if(zhuangtai==2)
{
LED_BLUE1=1;
LED_RED1=0;
LED_YELLOW1=1;
LED_BLUE2=0;
LED_RED2=1;
LED_YELLOW2=1;
TIME=2*TIME_MAX1+1;
}
else if(zhuangtai==3)
{
LED_BLUE1=1;
LED_RED1=0;
LED_YELLOW1=1;
LED_BLUE2=1;
LED_RED2=1;
LED_YELLOW2=!LED_YELLOW2;
}
}
void key()
{
while(!kai)
{
delayms(10);
if(!kai)
{
guan=~guan;
set_zhuangtai(z);
}
while(!kai);
}
}
void tiao()
{
if(jian==0)
{
delayms(10);
if(jian==0)
{
if(--TIME_MAX1<0) TIME_MAX1=30;
}
while(!jian);
}
else if(jia==0)
{
delayms(10);
if(jia==0)
{
if(++TIME_MAX1>30) TIME_MAX1=0;
}
while(!jia);
}
z=0;
if(TIME_MAX1<6) z=1;
}
void main()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65532-2000)/256;
TL1=(65536-2000)%256;
EA=1;
while(1)
{
key();
if(guan)
{
TR0=1;
TR1=1;
ET0=1;
ET1=1;
}
else
{
LED_BLUE1=1;
LED_RED1=1;
LED_YELLOW1=1;
LED_BLUE2=1;
LED_RED2=1;
LED_YELLOW2=1;
ET0=0;
TR0=0;
ET1=1;
TR1=1;
TIME=2*TIME_MAX1+1;
re_display(TIME);
tiao();
}
}
}
void TIME0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==10)
{
i=0;
if(TIME_MAX1>5)
{
if(1<--TIME&&TIME<12)
{
set_zhuangtai(z+1);
}
if(TIME<2)
{
set_zhuangtai(z=2-z);
}
}
else
{
if(--TIME<2)
{
set_zhuangtai(z=4-z);
TIME=2*TIME_MAX1+1;
}
else set_zhuangtai(z);
}
re_display(TIME);
}
}
void TIME1() interrupt 3
{
TH1=(65532-2000)/256;
TL1=(65536-2000)%256;
display();
wen=~wen;
}