基于51单片机交通灯课程设计

发布者:chunying最新更新时间:2019-12-17 来源: 51hei关键字:51单片机  交通灯  交通控制系统 手机看文章 扫描二维码
随时随地手机看文章

1 绪论1.1设计目的

单片机具有性价比高、集成度高、可靠性好、抗干扰性强等特点,广泛运用于各种智能仪器中。基于新型规则的可编程交通控制系统,可以实现对车辆、行人的控制,使的交通便于管理。所以,采用单片机自动控制交通灯有现实的社会意义。


通过本次设计,使学生不仅更加深刻领会微型计算机从硬件组成到软件编程的基本原理和知识,而且更要学会应用,务必做到理论和实践相结合,掌握硬件分析、软件设计的基本思想和方法,提高分析问题、解决问题和工程实践的能力。


1.2设计内容

1)设计一个十字路口交通灯控制器。用单片机控制LED灯模拟指示。模拟东西方向的十字路口交通信号控制情况。南北方向主干道计时时间为60s,东西方向次干道计时时间为45s。

2)红绿灯不变期间,在七段数码管上显示每秒倒计时。

3)计时到最后5秒时,两个方向的黄灯同时闪烁直至计时到0。
2 系统设计方案
2.1设计思路

模拟交通灯控制器就是使用单片机来控制一些LED灯和数码管,模拟真实交通灯的功能。当南北主干道通车时绿灯亮,而东西次干道干道红灯亮;当55s通车时间到后,主干道绿灯熄灭,黄灯亮,黄灯亮5s后由主干道切换到次干道通车。此时主干道黄灯熄灭,红灯亮,而次干道红灯熄灭,绿灯亮,次干道开始通车; 40s通车时间到后,次干道绿灯熄灭,黄灯亮,黄灯亮5s后由次干道切换到主干道通车。此时次干道黄灯熄灭,红灯亮;而主干道红灯熄灭,绿灯亮,如此不断循环。红、黄、绿交替闪亮,利用数码管倒计数显示间隔等,用于管理十字路口的车辆及行人交通。


2.2方案设计

利用AT89C52单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,数码管显示剩余时间。红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。用红、绿、黄发光二极管作信号灯,8个共阴极数码管显示剩余时间,根据设计功能及要求,我们可得系统的原理框图如图2-1所示。


图2-1  系统原理图(见51hei附件)3 系统硬件电路设计
3.1 AT89C52单片机

AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。


AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。

如下图3-1所示:

图3-1  AT89C52单片机3.1.1晶振电路设计

时钟电路用于产生MCS-52单片机工作时所必须的时钟控制信号。其内部电路在时钟信号控制下,严格地按时序执行指令进行工作。在执行指令时,CPU首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定操作。


本设计采用12MHz晶振和两个27Pf瓷片电容,他们构成一个稳定的自激振荡器。该电容的大小影响振荡器频率的高低、振荡器的稳定性和起振的快速性。为单片机提供标准时钟。其中两个瓷片电容起微调作用。 如图3-2所示:

图3-2  晶振电路3.1.2复位电路设计

复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。


复位电路通常采用上电自动复位和按钮复位两种方式。

该设计采用加电直接复位,复位电容采用10uF,电阻10000欧。加电瞬间,RES管脚为高电平。通过电阻回路放电,使电压逐渐降为零,从而实现了复位功能。

其连接图如下图3-3所示:

图3-3  复位电路3.2显示部分电路设计3.2.1数码管选择

此处采用的数码管时共阴极数码管,G、F、E、D、C、B、A七个端口是输入端口,对其各位进行赋值,置位则亮,复位则灭,用此来显示出相应的数字;1、2两端口用来控制高位和低位的选通显示,只要对端口置位,便可以选择该端口,并对其所代表的位进行赋值,显示。数码管如下图3-5所示。

图3-5 数码管
3.2.2十字路口交通灯设计

一条主干道和一条次干道汇合成十字路口,南北方向道路为主干道,东西方向干道为次干道。每个路口都采用了三个LED灯来显示,分别代表了红黄绿三种灯,来模拟路口交通灯的变换。LED信号灯如下图3-6所示。


图3-6 LED信号灯设计

3.3系统硬件总电路图

根据设计要求和所需电路,得到系统硬件总电路图如图3-7所示。

图3-7 系统硬件总电路图
4 系统软件程序设计4.1主程序设计4.1.1总体流程图



4.2其他子程序设计

4.2.1循环流程控制思路



5 调试与仿真5.1 Proteus软件系统仿真

打开Proteus软件,按照硬件系统图3-7所示接线,连线完毕后,通过keil把编好的c语言程序转换为.hex文件,并将其放入单片机内。


设置好仿真器后,编译程序无误后调试执行程序,结果显示符合要求。


5.2仿真结果

根据功能要求分别仿真各种情况下的亮灯情况,具体如下:

1.如下图5-1仿真图所示,南北方向主干道亮绿灯,东西次干道方向亮红灯。

图5-1  南北绿灯东西红灯


2.如下图5-2所示,南北方向倒计时5s后变为黄灯,东西为绿灯。

图5-2南北黄灯东西红灯

3.如下图5-3所示,东西方向变为绿灯,南北方向变为红灯。

图5-3南北红灯灯东西绿灯

4.如下图5-4所示,东西方向在变为黄灯


6 总结

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。


这次的单片机课程设计大概用了一个月的时间,在这一个月的时间当中,虽然开始遇到了很多的困难,但是由于合理地进行设计安排,分工合作,并各自查阅了相关的资料,最后在大家共同努力下我们顺利地完成了本次单片机课程设计,同时也学到了很多东西。

回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整一星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。例如我们在设计数码管显示的时候,刚开始的时候,由于对数码管引脚的不熟悉,我们都无法让数字显示,后来发现时十位和个位的置位、复位发生了问题,我们对此进行了修改,可以正确的显示出十位及个位的数值,但是数字的显示不稳定,不停的跳动,我们为此查阅了很多的资料,但还是未能解决,最后我们不停地对程序进行修改,终于发现了问题所在,在显示子程序上存在缺陷未能快速的切换对十位、个位的置位和复位,经过这样的修改,终于可以完美的显示时间了。我们也更好地掌握了对数码管的使用,这都是课堂上学不到的知识。   


这次的单片机课程设计是通过实践操作和理论相结合,提高动手实践能力,提高科学的思维能力。与此同时,我们也对分工合作有了进一步的认识,只有通过合理的分工合作,我们们才能够在短短一周的时间内完成设计任务,相信这对以后在社会上工作和学习会有很多帮助,让我们能更好的进入工作状态。最重要的是,这次课程设计也增加了我们对问题的研究和探讨,们以后的学习中会有更多的帮助。


单片机为我们的主要专业课之一,对我们还是很有帮助的,课程设计也是为我们以后的工作提前进行了一次练手,也是我们学习生活之中少有的一次自己探索、研究,发现问题、解决问题的机会。当然要做好一个课程设计也不是很简单的,我认为有以下几步:


  • 在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;

  • 要有一个清晰的思路和一个完整的的软件流程图,善于将大的程序段缩小为每个子函数来实现;

  • 在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;

  • 要养成注释程序的好习惯,写程序是应该思路清晰,结构明了,应该让人一看就能明  白你的思路,方便资料的保存和交流;

  • 我们们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的 


在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。我们们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,若遇到实在搞不明白的问题就会及时请教老师,或者与其他小组成员讨论,共同解决,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。通过这次课程设计我们也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。


通过这次课程设计使我更加懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正将一个东西学好学透,从而提高自己的实际动手能力和独立思考的能力。我想这对于我今后的学习生活和工作都会是有很大帮助的!


参考文献

[1].肖金球.单片机原理与接口技术[M];

[2].江志红.51单片机技术与应用系统开发案例精选[M];

[3].周润景.基于PROTEUS的51单片机设计与仿真[M];

[4].王守中.51单片机开发入门与典型实例[M];

[5].张齐.朱宁西.单片机系统设计与开发[M];

[6].周立功.单片机开发网[M];

[7].天津锐志单片机开发网[M];

[8].ATMEL公司AT89S52单片机中文PDF资料[M];
单片机源程序如下:


      #include

              #include

              #define uint unsigned int

              #define uchar unsigned char

              uchar temp,aa,nn;

              sbit rn=P2^0;                               

              sbit nb=P2^1;

              sbit gn=P2^2;

              sbit rw=P2^3;

              sbit dx=P2^4;

              sbit gw=P2^5;

              sbit shi=P3^6;

              sbit ge=P3^7;        /*对要使用的单片机各个口进行定义*/

              bit flag=0;


              uchar code table[]={

              0x3f,0x06,0x5b,0x4f,

              0x66,0x6d,0x7d,0x07,

              0x7f,0x6f,0x77,0x7c,

              0x39,0x5e,0x79,0x71};/*将数字0123456789的16进制数定义成数组用以显示*/


              void delay(uint z);

              void disp(uint n);

              void nb_flash(void);

              void dx_flash(void);

              void  xint0();

              void timer0();

              void  LED_ON();

              void  xint1();

              void  LED_OFF();

              void nanbei();

              void dongxi();                 /*将所使用的子函数定义*/


              void main()

              {

                            uint num;

                            num=0;

                            aa=0;

                            TMOD=0x01;

                            TH0=(65536-50000)/256;

                            TL0=(65536-50000)%256;

                            EA=1;

                            ET0=1;

                            TR0=1;

                            EX0=1;

                            IT0=0;

                            EX1=1;

                            IT1=1;                       /*中断初始化*/

                            while(1)

                            {

                                          nanbei();             

                                          nb_flash();

                                          dongxi();

                                          dx_flash();  /*主函数中显示部分*/

        }

              }


              void delay(uint z)                    /*延时子函数*/

              {

                            uint x,y;

                            for(x=z;x>0;x--)

                                          for(y=110;y>0;y--);

              }


              void timer0() interrupt 1             /*定时器初始化*/

              {

                            TH0=(65536-50000)/256;

                            TL0=(65536-50000)%256;

[1] [2]
关键字:51单片机  交通灯  交通控制系统 引用地址:基于51单片机交通灯课程设计

上一篇:基于51单片机的超声波测距仪的设计
下一篇:按钮 温度 红外三种方式控制电机转速的单片机程序

推荐阅读最新更新时间:2024-11-13 03:19

51单片机汇编内部RAM数据传送类指令举例介绍
(1)以累加器A为目的地址 MOV A,Rn ;(A) (Rn)以下类似。 MOV A,direct MOV A,@Ri MOV A,#data (2)以寄存器Rn为目的地址 MOV Rn,A MOV Rn,direct MOV Rn,#data (3)以直接存储单元为目的地址 MOV direct,A MOV direct,Rn MOV direct,direct MOV direct,@Ri MOV direct,#data (4)以间接地址为目的地址 MOV @Ri,A MOV @Ri, direct MOV @Ri,#data (5)以DPTR为目的地址 MOV
[单片机]
一个51单片机的键盘扫描程序
/**************************************** 键盘_不采用定时器_不延时 特点: 按键在松手后有效,灵敏度高,消耗资源少,运行效率高 独立键盘为:K01=P2^4;K02=P2^5;K03=P2^6;K04=P2^7; 矩阵键盘为:行(上到下)_P2.3_P2.2_P2.1_P2.0 列(左到右)_P2.7_P2.6_P2.5_P2.4 提供的操作函数: //独立键盘.无按键动作时其返回值num_key=0,否则返回按键号num_key extern unsigned char keyboard_self(); //矩阵键盘.无按键动作时其返回值num_key=0,否则
[单片机]
uIP在51单片机上的移植
  uIP其主要是为8位和16位系统设计的,程序在编写时就考虑到了移植问题。uIP的主要文件包括uip.c和uip_arp.c。      (1)移植的基本过程。      针对所用编译器的类型更改定义数据类型,底层RTL8019AS芯片的驱动和实现应用层代码,系统定时器接口等。下面分别予以说明。      数据类型的定义:   typedefunsignedcharu8_t;typedefunsignedshortu16_t;typedefunsignedshortuip_stats_t;由于KeilC编译器默认情况下的编译模式为small,变量的定义在内部RAM中,编译时编译模式应改为Large,即变量的定义在XDATA中
[单片机]
uIP在<font color='red'>51单片机</font>上的移植
51单片机-单独文件封装
1.再遇多文件编程 因为定时器经常在后面的教程中使用到,所以我们也把这部分功能代码单独使用文件封装起来。 在第六章的教程中已经教过大家多文件创建,这里点到为止。 创建好“timer.c”和“timer.h” 添加进工程中 2.timer.c的代码 #include reg52.h #include function.h //详见第六章第8讲 u8 T0RH,T0RL,T1RH,T1RL; void TIM0_Init(u32 us,int trim)//trim:微调 { u32 tmp; //临时变量 tmp = 11059200 / 12; //定时器计数频率
[单片机]
<font color='red'>51单片机</font>-单独文件封装
基于89C2051单片机的织机监测器键盘显示装置设计
  1前 言   在嵌入式计算机系统设计中,经常要考虑键盘显示装置的设置问题。尽管有多种方案可以满足键盘显示的要求,但是这些方案都各有其优缺点,比如采用专用的键盘显示器管理芯片8279,在系统的按键及显示器位数较多时是一种好的方案,但目前键盘的设置趋于简单化(即采用一键多用方式或利用增加键和减少键来取代数字键等),因此,一般系统按键不多,其显示器的位数一般也不超过8位。这样,采用 8279由于需要较多的外围 电路 器件,因此显得不是很方便了。而14499是显示器管理芯片,它虽然可以管理四位显示器,但它没有按键管理功能。此外, PS7219是高性能的多位 LED 显示驱动器,可管理8位显示器,并有很强的显示管理功能,如位闪、复位等功
[单片机]
基于89C20<font color='red'>51单片机</font>的织机监测器键盘显示装置设计
51单片机实验16:A/D模数转换(XPT2046)
关于A/D模数转换以及XPT2046芯片的内容请参考:https://blog.csdn.net/cax1165/article/details/87024388 #include reg52.h #include XPT2046.h sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; uc code x ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uc dig ; void delay(uc x) { uc i,j; for(i=1;i =x;i++) for(j=1;j =110;j++); } v
[单片机]
51单片机汇编中断程序
首先,介绍一下51单片机的定时计数器,51有两个定时计数器,分别为T0,T1,基本一样,;有一点不同,下面我们介绍定时计数器T0 ;了解8051的timer0中断的程序写法,用中断法产生定时 ;上面显示的是proteus仿真图,下面的是源程序 ;说明:(源程序中的中断入口地址很重要(这个是固定的),程序中断时,会在对应中断固定的 ;入口地址进入,因为规定的相隔入口间的空进有限,只能用跳转指令跳转,最终用RETI强制返回 ;这个程序把所有的中断入口地址都写上了,没有用到的,用RETI直接屏蔽) ;运行结果是使led灯明一下,暗一下。 COUNT EQU 9217;对于11.0592的晶振来说,延时10ms LED EQ
[单片机]
三种C51单片机上电复位延时电路图
  下面几种延时复位电路,都是利用在单片机RST引脚上外接一个RC支路的充电时间而形成的。典型复位电路如图(a)所示,其中的阻容值是原始手册中提供的。图(b)是简化后的复位电路,图(c)在图(a)的基础上加上一个二极管D,有助于电容C的快速放电,为下一次上电复位延时做准备。在经历了一系列延时之后,单片机才开始按照时钟源的工作频率,进入到正常的程序运行状态。   
[电源管理]
三种C<font color='red'>51单片机</font>上电复位延时电路图
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved