找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6338|回复: 1
收起左侧

51单片机交通灯(四个方向)word格式设计报告与源码下载

[复制链接]
ID:300058 发表于 2018-3-31 19:42 | 显示全部楼层 |阅读模式
《微型计算机系统》
课程设计
题目名称:基于单片机的交通灯控制系统设计
专业:电气工程及其自动化
班级:151
姓名:赵*
学号:201*58
指导教师:*
青岛理工大学自动化工程学院
课程设计任务书

课程名称:微型计算机系统

设计题目:基于单片机的交通灯控制系统设计

系统要求:

可用红、黄、绿三种颜色发光二极管和两位LED数码管模拟交通灯的变化规律:

  • 首先,东西路口红灯亮,同时开始60秒倒计时;
  • 南北路口直行绿灯亮,同时开始40秒倒计时,南北人行道绿灯亮。当南北路口倒计时至4秒时,黄灯开始闪烁,南北人行道红灯亮;倒计时至0秒时,直行灯变红,左转绿灯亮,同时开始20秒倒计时。当20秒倒计时结束时,南北路口红灯亮,开始60秒倒计时;
  • 东西路口直行绿灯亮,开始40秒倒计时,东西人行道绿灯亮;按照上述变化规律依次循环。

硬件设计:

  • 最小系统设计: 51单片机为本设计的控制器,包括外扩ROMRAM(其大小由设计者自己设计),系统时钟电路、复位电路等构成的最小系统;
  • 接口电路的设计:设计者扩展一个并行接口〔8155〕;
  • 键盘设计:由设计者根据需要设计键盘的数量
  • 显示设计:采用LED数码管显示时间,显示电路根据显示的内容设计;采用三种颜色(红、黄、绿)的发光二极管模拟交通灯;有开机显示状态(如显示888888);
  • 在完成基本设计功能的基础上可以另加其他功能。

软件设计:

1)主程序设计

2)各功能子程序设计

其他要求:

  • 每位同学独立完成本设计。
  • 依据题目要求,提出系统设计方案。
  • 设计系统电路原理图。
  • 调试系统硬件电路、功能程序。
  • 编制课程设计报告书并装订成册,报告书内容(按顺序)

(1)报告书封面

(2)课程设计任务书

(3)系统设计方案的提出、分析

(4)系统中典型电路的分析

(5)系统软件结构框图

(6)系统电路原理图

(7)源程序

(8)课设字数不少于3000字

成绩

评语:

基于单片机的交通灯控制系统设计

摘要:

当你路过一个十字路口时,你是否注意到各个方向车辆和信任有条不紊的通过十字路口。这样井然有序的情景靠什么来实现呢?靠的是交通灯控制系统。在论文中我使用STC89C51作为主控单元。通过单片机芯片的P1口和P2口分别控制东西方向和南北方向红黄绿灯的点亮。通过单片机芯片STC89C51的RXD和TXD控制数码管的显示时间。采用发光二极管来实现交通灯的点亮,由数码管实现时间的显示。该系统不仅仅具有交通等的基本功能还有倒计时,还可以通过按键在紧急事件中四个方向都设置为红灯紧急模式。当然也可以通过按键来设置倒计时时间,使系统更加符合实际交通情况。

我设计的交通灯控制系统可以较好的模拟十字路口出现的交通状况,使行人和车辆能有序的通行。

关键词:交通控制系统 单片机 AT89C51 数码管 按键 LED

内容

1系统方案论证

1.1设计方案

方案一:控制系统主要控制东西方向和南北方向交通状况,系统以单片机芯片STC89C51为主控单元,通过控制三种颜色LED灯的亮灭来指导个车道通行,上电时复位系统使系统进入运行状态。总体框图如下:(见51hei附件   




1.2功能概述

在东西方向和南北方向的十字路口分别设立红黄绿交通指示灯,用数码管倒计时显示。正常情况下两个主干线上的红黄绿灯进行交换。红灯亮表示禁止通行,绿灯亮表示可以通行,每次绿灯变红灯之前,黄灯亮五秒,方便那些未能及时通过十字路口的车辆能继续通过。十字路口设立数码管有倒计时功能,方便人们直关把握通过时间。本设计也考虑紧急情况,当按下紧急模式按键后,四个方向红灯都会常亮。对于夜晚车辆比较少,本设计设计了夜晚模式,按下按键后四个方向黄灯会常亮。

2系统硬件设计

2.1交通信号灯控制系统的组成

2.1.1 ATC89C51芯片

选用的ATC89C51与同系列AT89C51在功能上有明显的提高,最突出的是可以实现在线编程。用于系统的总控制。其主要功能列举如下:

  • 为一般控制应用的8位单片机
  • 内部具有时钟振荡器
  • 内部程序存储器(ROM)位4KB
  • 内部数据存储器(RAM)为128B
  • 外部程序存储器可扩充至64KB
  • 外部数据存储器可扩充至64KB
  • 32条双向输入线,且每条均可以单独做I/O的控制
  • 5个中断源
  • 2组独立的16位定时器
  • 1个全双工串行通信端口
  • 单片机芯片提供位逻辑运算指令

单片机引脚图如下:

2.1.2交通灯控制系统构成

芯片ATC89C51一片,2段共阴极数码管四个,红黄绿发光二极管各四个,电阻若干,晶振一个,电容若干,按键若干。

交通灯控制系统结构框图:(见51黑附件)

系统各部分工作原理:采用单片机的I/O口P0口通过上拉电阻和交通灯相连接,P3.0、P3.1口接到数码管控制位上,控制数码管的显示,程序放在ATC89C51单片机的ROM中来设置初始时间,在十字路口的四组红、黄、绿交通灯中,由单片机的P1.5—P1.7、P1.0—P1.2、P2.5—P2.7、P2.0—P2.2分别控制东西南北方向的三色灯。由于交通灯为发光二极管并且阳极通过限流电阻与电源正极相连,因此I/O口输出电平时,与之相连的指示灯才会点亮,然后通过数码管倒计时时间。I/O口输出高电平时,相应指示灯会灭。由于ATC89C51本身集成了看门狗指令,当系统出现异常时看门狗会发出溢出中断。通过专用的端口输出,引起RESET复位信号复位系统。

2.2各单元电路模块功能

2.2.1时钟电路模块

本时钟电路由一个晶体振荡器12MHz和两个30pF的瓷片电容组成。时钟电路用于产生单片机工作所需的时钟信号,而是需所研究的是指令执行中各信号之

间的相互关系。单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格的工作。其电路图所示:

2.2.2复位电路模块

电容在上接高电平,电阻在下接低电平,中间为RST。这种复位电路为高电平复位。其工作原理是:通电时,电容两端相当于是短路,于是RST引脚上为高电平,然后电源通过电容对电阻充电,RST端电压慢慢下降,降到一定程度,即为低电平,单片机开始正常工作。其电路如下:

2.2.3信号灯输出控制模块

路口交通灯指示采用红、黄、绿发光二极管进行提示。其电路如下:

2.2.4时间显示电路模块

  本系统使用数码管完成倒计时显示功能。以东西方向为例,数码管显示的数值从绿灯的设置时间最大值往下减,每秒钟减1,一直减到零。然后又从红灯的设置时间最大值往下减,一直减到零。接下来又显示绿灯时间,如此循环。系统共有4个两位LED数码管,分别放在模拟交通灯的上方。路口通行剩余时间采用红色7段数码管显示,采用共阴极数码管,如用单机IP0口加上拉电阻驱动,P3.0/P3.1口来控制数码管的位。其显示电路如下:

2.2.5按键输入模块

由于该系统具有夜间模式,紧急情况模式和交通灯倒计时时间设定功能,所有需要加上这些功能键,如下图所示:







3系统软件设计


3.2延时的设定

3.2.1 计数器初值计算

定时器工作时必须给计数器送初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0自动产生溢出中断请求。因此,可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC可得到如下计算公式:

TC=M-C

式中,M为计数器模值,该值与计数器工作方式有关。在方式0时M为

2^13;在方式1时M的值为2^16;在方式2和3中为2^8。

算法公式:T=(M-TC)T(计数)或TC=M-T/T(计数)

T(计数)是单片机时钟周期T(clk)的12倍;TC为定时的初值

如果单片机的主脉冲频率为T(clk)12MHz,经过12分频

方式0 TMAX=2^13*1微妙=8.192毫秒

方式1 TMAX=2^16*1微妙=65.536毫秒

实现1秒钟方法:

采用在主程序中设定一个初值为20的软件计数器和使T1定时50毫秒。

这样每当T1到50毫秒时CPU就响应他的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,CPU先使软件计数器减1,然后判断他是否为零。为0表示1秒已到可以返回到输出时间显示程序。


  • 2.2相应程序代码

定时器需定时50毫秒,故T1工作于方式1。

初值计算:TC=M-T/T(计数)=2^16-50ms/1us=15536=3CB0H

延时程序:

START:MOV              TMOD,#10H              ;令TO为定时器方式1

 MOV              TH0,#3CH                            ;装入定时器初值

 MOV              TL0,#0B0H

 SETB EA                                                                      ;打开总中断

 SETB ET1                                                        ;开T1中断

 SETB ER                                                                      ;启动T1计数器

 CLR  FLAG1

 CLR  FLAG2

 CLR               FLAG3

 MOV  R3,#20H                            ;软件计数器赋初值

  • 相应中断服务子程序

 ORG              001BH

 LJMP DSD

 ORG 0300H

DSD:INC              R3

 MOV TH0,#3CH                            ;重装定时器初值

 MOV TL0,#B0H

 CJNE R3,#20,FH

 DEC R0

 DEC R1

 MOV R3,#00H

 FH: RETI

程序的软件延时:

单片机的工作频率为12MHz。机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/12M)=1us。可以知道具体每条指令的周期数,这样就可以通过指令的执行条数来确定1秒的时间。

具体的延时程序分析:

DELY: MOV   R4,#80H                                          ;延时一秒主程序

DE2: LCALL              DELAY1

     DJNE   R4,DE2

RET

DELAY1: MOV  R4,#00H                                          ;延时125us子程序

D1:                            MOV  R5,DL2

        DJNE R4,D1

RET

   DELAY1为一个双重循环,循环次数为256*256=65536次,所以延时时间=65536*2=131072us约为125ms。

DELY R4设置为初值8,主延时程序循环8次,所以125ms*8=1s

  • 数码管动态显示

用于四个数码管的倒计时显示,代码如下:

sbit  smg1=P3^0;     //定义南北方向数码管低位

sbit  smg2=P3^1;     //定义南北方向数码管高位

sbit  smg1=P3^2;     //定义东西方向数码管低位

sbit  smg2=P3^3;     //定义东西方向数码管高位

void djsxs()

{

int b1=0,b2=0;

b1=djs/10;       //将倒计时时间的高位赋予b1

b2=djs%10;       //将倒计时时间的低位赋予b2

P0=table[b1];

smg1=0;

delayms(3);

smg1=1;           //显示b1

P0=table[b2];

smg2=0;

delayms(3);

smg2=1;           //显示b2

P0=table[b1];

smg3=0;

delayms(3);

smg3=1;           //显示b1

P0=table[b2];

smg4=0;

delayms(3);

smg4=1;           //显示b2


仿真电路图:


实物:


总结:
经过我反复思考及验证,逐渐完善电路以及程序 bug,具体程序及电路图请详见附录。通过此次课程设计的学习,我已掌握老师课堂所述内容,并应用于实践中,在设计及过程中,发现自己好多知识都掌握不扎实,通过询问其他同学,以及查阅资料等,已逐步掌握未扎实的内容,为此,我从心底不免升起一份感激之情,感谢老师为了我们着想,老师谢谢您!

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<LED.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar time,second,seconde,miao1,miao0;
  6. sbit smg1=P2^5;//低位
  7. sbit smg2=P2^6;//东西高位
  8. sbit smg3=P2^7;//南北高位
  9. uchar code table1[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
  10. uchar code table2[]={0x6d,0x66,0x4f,0x5b,0x06,0x3f};
  11. uchar code table3[]={0x4f,0x5b,0x06,0x3f,0x06,0x3f};
  12. void display(uchar miao1,miao0);
  13. void delay(uint z);
  14. void init();
  15. void LED();
  16. void EW_LED();
  17. void NS_LED();
  18. void main()
  19. {        
  20.         init();//初始化子程序
  21.         while(1)
  22.         {
  23.                 display(miao1,miao0);
  24.                 LED();
  25.         }
  26. }

  27. void delay(uint z)
  28. {
  29.         uint x,y;
  30.         for(x=z;x>0;x--)
  31.                 for(y=110;y>0;y--);
  32. }

  33. void display(uchar miao1,miao0)
  34. {
  35.         smg1=0;
  36.         P0=table1[miao0];
  37.         delay(3);
  38.         smg1=1;
  39.         if(seconde<60)
  40.         {
  41.                 smg2=0;
  42.                 P0=table2[miao1];
  43.                 delay(3);
  44.                 smg2=1;        
  45.                 smg3=0;
  46.                 P0=table3[miao1];
  47.                 delay(3);
  48.                 smg3=1;        
  49.         }               
  50.         else if(seconde>=60)
  51.         {
  52.                 smg3=0;
  53.                 P0=table2[miao1];
  54.                 delay(3);
  55.                 smg3=1;        
  56.                
  57.                 smg2=0;
  58.                 P0=table3[miao1];
  59.                 delay(3);
  60.                 smg2=1;        
  61.         }
  62. }

  63. void init()
  64. {        
  65.         smg1=0;
  66.         smg2=0;
  67.         smg3=0;
  68.         P0=0xff;
  69.         TMOD=0x01;
  70.         TH0=0x3c;
  71.   TL0=0xb0;
  72.         EA=1;
  73.         ET0=1;
  74.         TCON=0x10;
  75.         second=0;
  76.         seconde=0;
  77. }

  78. void timer0() interrupt 1
  79. {
  80.         TH0=0x3c;
  81.   TL0=0xb0;
  82.         time++;
  83.         if(time==20)
  84.         {
  85.                 time=0;
  86.                 second++;
  87.                 seconde++;
  88.         }
  89.         if(second>=60)
  90.         {
  91.                 second=0;
  92.         }
  93.         miao0=second%10;
  94.         miao1=second/10;
  95.         if(seconde>=120)
  96.                 seconde=0;
  97. }
  98. void LED()
  99. {
  100.         if(seconde<60)
  101.         {
  102.                 P1=0x12;//60s内东西红灯亮
  103.                 NS_LED();
  104.         }
  105.         
  106.         else if(seconde>=60)
  107.         {
  108.                 P3=0x12;//60s以上南北红灯亮
  109.                 EW_LED();
  110.         }
  111. }
  112. void NS_LED()
  113. {
  114.         if(seconde<36)
  115.         {
  116.                 P3=0x28;//36s南北绿灯亮
  117.         }
  118.         else if(seconde>=36&&seconde<40)
  119.         {
  120.                 NSRP=1;
  121.                 NSGP=0;//人行道绿灯灭,红灯亮
  122.                 NSG=0;
  123.                 NSY=seconde%2;//南北绿灯灭,黄灯闪烁
  124.         }
  125.         else if(seconde>=40&&seconde<60)
  126.         {
  127.                 P3=0x11;//南北左转灯亮;人行红灯亮
  128.         }
  129. }
  130. void EW_LED()
  131. {
  132.         if(seconde>=60&&seconde<96)
  133.         {
  134.                 P1=0x28;//东西绿灯亮
  135.         }
  136.         else if(seconde>=96&&seconde<100)
  137.         {
  138.                 EWRP=1;
  139.                 EWGP=0;//人行绿灯灭,红灯亮
  140.                 EWG=0;
  141.                 EWY=seconde%2;//东西绿灯灭,黄灯闪
  142.         }
  143.         else
  144.         {
  145.                 P1=0x11;//东西左转灯亮,人行红灯亮;
  146.         }

  147. }












  148. ……………………

  149. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png

所有资料51hei提供下载(word格式的设计报告文件):
交通灯设计.rar (9.99 MB, 下载次数: 112)
回复

使用道具 举报

ID:337199 发表于 2018-5-24 12:02 | 显示全部楼层
朋友 能不能把你pcb的打印图发一份给我啊 急用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表