单片机交通灯课程设计报告IWord下载.docx
《单片机交通灯课程设计报告IWord下载.docx》由会员分享,可在线阅读,更多相关《单片机交通灯课程设计报告IWord下载.docx(18页珍藏版)》请在冰豆网上搜索。
2.4.软件设计8
3.调试9
4.结束语10
5.参考文献10
6.附录10
6.1.附录1:
程序清单10
6.2.附录2:
PCB图15
6.3.附录3:
原理图16
摘要
交通在人们的日常生活中占有重要的地位,随着人们社会活动的日益频繁,这点更是体现的淋漓尽致。
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
本系统采用单片机STC89C52为中心器件来设计交通灯控制器,系统实用性强、操作简单、扩展性强。
本设计就是采用单片机模拟十字路口交通灯的各种状态显示以及倒计时时间。
本设计系统由单片机I/O口扩展系统、交通灯状态显示系统、LED数码显示系统、复位电路等几大部分组成。
系统除基本的交通灯功能外,还具有倒计时等功能,较好的模拟实现了十字路口可能出现的状况。
软件上采用C语言编程,主要编写了主程序,LED灯闪亮,数码管显示程序,中断程序延时程序等。
经过整机调试,实现了对十字路口交通灯的模拟。
关键字:
电子线路STC89C52数码管交通灯
1.总体设计方案
1.1.设计思路
1.1.1.设计目的
1)加强对单片机和汇编语言的认识充分掌握和理解设计各部分的工作原理、设计过程、选择芯片器件、模块化编程等多项知识。
2)用单片机模拟实现具体应用,使个人设计能够真正使用。
3)把理论知识与实践相结合,充分发挥个人能力,并在实践中锻炼。
4)提高利用已学知识分析和解决问题的能力。
5)提高实践动手能力。
1.1.2.设计任务和内容
1.1.2.1.设计任务
单片机采用用STC89S52芯片,使用发光二极管(红,黄,绿)代表各个路口的交通灯,用8段数码管对转换时间进行倒时(红灯时间20秒,绿灯时间25秒,黄灯时间5秒)。
1.1.2.2.设计内容
6)设计并绘制电路图
7)制作万能版并焊接好元器件
8)编写程序并将调试好的程序固化到单片机中
1.1.3.方案设计
1.1.3.1.电源提供方案
为使模块稳定工作,须有可靠电源,采用单片机控制模块提供电源。
此方案的优点是系统简明扼要,节约成本;
缺点是输出功率不高。
1.1.3.2.复位方案
复位方式有两种:
按键复位与软件复位。
由考虑到程序的简洁,避免冗长,本设计采用按键复位,在芯片的复位端口外接复位电路,通过按键对单片机输入一个高电平脉冲,达到复位的目的。
1.1.3.3.显示界面方案
采用数码管与点阵LED(点阵式和8段式LED)相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。
这种方案既满足系统功能要求,又减少了系统实现的复杂度。
整个设计以STC89C52单片机为核心,由数码管显示,LED数码管显示,复位电路组成。
硬件模块如图。
图1设计方框图
1.1.4.芯片简介
1.STC89C52单片机简介
图2封装引脚图
主要性能
与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:
0Hz~33Hz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器、八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
功能特性描述
89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
在访问外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高八位地址。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
P3口亦作为STC89C52特殊功能(第二功能)使用,如下表所示。
端口引脚第二功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2INTO(外中断0)
P3.3INT1(外中断1)
P3.4TO(定时/计数器0)
P3.5T1(定时/计数器1)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器读选通)
1.2.设计方框图
图3设计方框图
2.设计原理分析
2.1.交通灯显示时序的理论分析
正常情况下A、B(A、B道交叉组成十字路口,A是主道,B是支道)轮流放行,A道放行,B道放行30s。
本次设计的信号交通灯只用于显示主干道,分别绿灯亮25s,红灯亮20s,黄灯亮5s(用于警告)。
期间分别伴有数码管倒计时显示。
图4交通信号图
2.2.交通灯显示时间的理论分析与计算
东西和南北方向的放行时间的长短是依据路口的各个方向平时的车流量来设定。
我们可以依据上述的标准来改变车辆的放行时间。
按照一般的规则,一个十字路口可分为主干道和次干道,主干道的放行时间大于次干道的放行时间,我们设定值时也应以此为参考。
2.3.电路模块
2.3.1.LED数码管显示模块
1)静态显示方式:
静态显示方式是指当显示器显示某一字符时,发光二极管的位选始终被选中。
在这种显示方式下,每一个LED数码管显示器都需要一个8位的输出口进行控制。
由于单片机本身提供的I/O口有限,实际使用中,通常通过扩展I/O口的形式解决输出口数量不足的问题。
2)静态显示主要的优点是显示稳定,在发光二极管导通电流一定的情况下显示器的亮度大,系统运行过程中,在需要更新显示内容时,CPU才去执行显示更新子程序,这样既节约了CPU的时间,又提高了CPU的工作效率。
其不足之处是占用硬件资源较多,每个LED数码管需要独占8条输出线。
随着显示器位数的增加,需要的I/O口线也将增加。
3)动态显示方式:
动态显示方式是指一位一位地轮流点亮每位显示器(称为扫描),即每个数码管的位选被轮流选中,多个数码管公用一组段选,段选数据仅对位选选中的数码管有效。
对于每一位显示器来说,每隔一段时间点亮一次。
显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。
通过调整电流和时间参数,可以既保证亮度,又保证显示。
若显示器的位数不大于8位,则显示器的公共端只需一个8位I/O口进行动态扫描(称为扫描口),控制每位显示器所显示的字形也需一个8位口(称为段码输出)。
2.3.2.复位电路
复位方式有多种,本设计采用按键复位。
框图
图5复位电路图
2.3.3.晶振电路
晶振电路原理图:
图6晶振电路图
本设计晶振电路采用12M的晶振。
晶振的作用是给单片机正常工作提供稳定的时钟信号。
单片机的晶振并不是只能用12M,只要不超过20M就行,在准许的范围内,晶振越大,单片机运行越快,还有用12M的就是好算时间,因为一个机器周期为1/12时钟周期,所以这样用12M的话,一个时钟周期为12us,那么定时器计一次数就是1us了。
2.3.4.下载端口
图7下载端口电路图
管脚TXD和RXD用于异步串行通信。
其实STC89C52单片机的ISP下载线就是一个max232芯片连接STC和计算机的串行通信口。
计算机把程序从九针串口送到max232芯片,电平转换后送进单片机的串行口,也就是TXD和RXD。
然后单片机的串行模块把数据送到程序区。
2.4.软件设计
具体程序在附录程序里。
图8程序流程图
3.调试
第一次编写的程序比较混乱,都是采用嵌套语句,调试时出现很多问题,灯亮的顺序很混乱,正常倒计时一段时间就出现乱码,主要是由于死循环造成的。
由于长时间修改不过来就采用另一种思路编写程序。
第二次写的程序比前一次明显有条理,主要采用主函数调用子函数的形式。
但在子函数的调用上出现紊乱,经常两个灯一起亮,经过长时间的修改后,终于成功了。
下图为程序编译后生成HEX文件下载到板子上的运行情况。
图9实物图
4.结束语
通过这次课程设计,使我得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。
使我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧(特别是C语言)的掌握方面都能向前迈了一大步。
本次课程设计的过程是艰辛的,不过收获却是很大的。
在设计过程中,会出现了一些问题,但都是常见的小问题,如:
代码中双引号的使用并不是在英语书写状态下,输入字母出错等,在调试时经常出现异常,刚开始调试时经常出现一堆乱码,而后灯的闪亮时间,闪亮顺序等经常出错,不过这些都是经常性错误,经过长时间的调试修改都一一解决,程序顺利完成,并实现了其功能。
在本次设计中,从一开始焊接时我就犯了一个严重的错误,我直接将芯片焊在板子上而没有使用芯片座,庆幸芯片完好,不然板子又要重新做一个了。
这件事让我认识到,做任何事之前都要思考细节,细节不容忽视。
而且综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识。
在此,由于自身能力有限,在课程设计中碰到了很多的问题,我通过查阅相关书籍、资料以及和周围同学交流得以解决。
很多问题都不是一次能解决的,在一遍一遍的实验中,不仅进一步巩固自己的知识点,也让自己更加有耐心。
5.参考文献
【1】张友德,《单片微型机原理应用与实践》(第四版),复旦大学出版社,2000
【2】李朝青.单片机原理及接口技术(第三版)。
北京航空航天大学出版社。
2005。
【3】丁明亮、唐前辉。
51单片机应用设计与仿真--基于KeilC与Proteus。
北京航空航天大学出版社,2009。
【4】杨长兴、刘卫国。
C++程序设计。
中国铁道出版社。
2010。
6.附录
PCB图
图10PCB板图
原理图
图11原理图
源程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
voidinit();
voiddisplay1();
voiddisplay2();
voiddisplay3();
voiddelay(uintz);
ucharcodetable[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
uinta,t,aa,i=25,j=20,k=5;
bitr;
bitg;
bity;
sbitP02=P0^2;
sbitP03=P0^3;
sbitP00=P0^0;
sbitP01=P0^1;
sbitred=P3^5;
sbityellow=P3^4;
sbitgreen=P3^3;
voidmain()
{
P02=0;
P03=0;
P00=1;
P01=1;
init();
while
(1)
{
if(y&
g)display2();
delay(5);
if(r&
g)display3();
y)display1();
}
}
/*绿灯*/
voiddisplay1()
{
green=0;
g=0;
if(a==20)
a=0;
i--;
if(i==0)
{
i=25;
green=1;
g=1;
y=0;
}
P01=1;
P1=table[i/10];
delay(5);
P01=0;
P1=table[i%10];
P00=0;
/*红灯*/
voiddisplay2()
red=0;
r=0;
j--;
if(j==0)
j=20;
red=1;
r=1;
P1=table[j/10];
P1=table[j%10];
/*黄灯*/
voiddisplay3()
y=0;
yellow=0;
k--;
if(k==0)
k=5;
yellow=1;
y=1;
t++;
if(t==3)t=0;
if(t==1)g=0;
elser=0;
P1=table[0];
P1=table[k%10];
/*初始化*/
voidinit()
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
y=g=1;
t=0;
/*中断函数*/
voidtimer0()interrupt1
a++;
aa++;
/*延时1ms*/
voiddelay(uintz)
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);