(绝对实用)基于51单片机及数字电路的两种智能交通灯仿真与设计

来源:网络收集 时间:2025-06-11 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

附件二:

□ 规定类 □ 自选类

西南交通大学电气工程学院实验竞赛月活动

实验(作品)报告

作品名称: 智能交通灯的设计、仿真及实践 专 业: 电气工程及其自动化 队员姓名:

指导老师: 作品完成起止时间: 2012年4月13日起至5月10日止

2012年3月

35-1

一、课题的由来

当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。这一技术在19世纪就已出现了。1858年,在英国伦敦主要街头安装了以燃煤气为光源的红,蓝两色的机械扳手式信号灯,用以指挥马车通行。1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的议会大厦前的广场上,安装了世界上最早的煤气红绿灯。它由红绿两色旋转式方形玻璃提灯组成,红色表示“停止”,绿色表示“注意”。1869年1月2日,煤气灯爆炸,使警察受伤,遂被取消。

电气启动的红绿灯出现在美国,这种红绿灯由红绿黄三色圆形的投光器组成,1914年始安装于纽约市5号大街的一座高塔上。红灯亮表示“停止”,绿灯亮表示“通行”。

信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。

二、课题的目的、意义

为了使行人通过十字路口时更加方便、安全,也使车辆通行秩序化、规范化,就必须设计出更加完善、更加人性化和更加规范化的交通灯,以保障行人和车辆的安全通行,减少社会公共财富的流失。

我们为了使通行更加方便,在实现交通灯的基本功能的前提下,增设了蜂鸣器,这不仅能给行人以提示,更能引导盲人安全通过十字路口,而且蜂鸣器的声音也能是司机保持警惕,大幅度增加了十字路口交通的安全性。我们设计的单片机控制交通灯就是基于信号灯,同时也加入了个性元素。

三、人员分工

蔺子存:实现对交通灯电路的仿真,程序的编写及修改,绘制并制作印制板; 俞宙杰:实物制作与连接,程序的编写及修改; 王竞远:结题报告的编写,程序的编写及修改。

四、实验原理及预期结果

35-2

在本次实验中,本队本队使用了单片机和数字电路两种仿真方式设计出了较为合理的交通灯方案,我们也对传统交通灯进行了适当改进,使其更适应当今复杂多变的交通环境。

(一)基于单片机原理的智能交通灯设

计仿真与实践

1、单片机简介

单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器

等电路)集成到一块硅片上构成的一个小而完善的计算机系统。

AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示。 管脚说明: VCC:供电电压。 GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

35-3

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,所示:

口管脚 备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

如下表

35-4

/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 振荡器特性:

XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

2、Proteus7与Keil3 C51的及仿真

Proteus软件是英国Labcenter electronics公司出版的EDA工具软它不仅具有其它EDA工具软件的功能,还能仿真单片机及外围器它是目前最好的仿真单片机及外件的工具。虽然目前国内推广刚起

原理

件。

仿真件。围器步,

但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP、WIN7等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

Keil3 C51与Proteus的联调:

35-5

这是本设计仿真的核心。在所有仿真软件以及编译器之间,只有Proteus和Keil C51之间才能实现C语言编译8051、AVR等系列单片机程序.hex文件和proteus单片机模块的完美联调。在联调中需要用到右图所示的驱动,且需要设置Proteus启动远程调试功能,以及Keil的Option for Target‘Target1’选项中通过修改Tools.int目录调试出“调试”中的“Proteus VSM Simulator”一栏,就可以实现与Proteus的联合仿真。

3、仿真电路的功能实现

在Proteus中,AT89c51单片机的仿真电路省略了复位电路、晶振以及部分固定的接口的接线,经几次修改后的仿真电路图如下: 工作方式: (1)正常显示:

? 南北亮红灯,从24秒开始倒计时;东西亮绿灯,20秒开始倒计时 ? 东西倒计时到0,绿灯灭,黄灯亮3秒,并倒计时

? 东西红灯亮,从31秒倒计时;南北绿灯亮,从25秒倒计时 ? 南北倒计时到0,绿灯灭,黄灯亮5秒,并倒计时

35-6

35-7

35-8

(2)信号灯时间调节按钮功能:

? SET:按1下为调节东西绿灯显示时间;按2下为调节东西黄灯时间;按3下为调节南北绿

灯时间;按4下为调节南北黄灯时间。调时间时数码管以每秒钟3次的频率闪动,红灯时间=绿灯时间+黄灯时间+1 ? ADD:时间+1,长按加10 ? SUB:时间-1,长按减10

(3)紧急情况中断功能

? SW1闭合:正常显示状态和调时间状态时闭合,所有计时停止,数码管熄灭,东西南北信号灯统一亮红灯

? SW1断开:数码管点亮,继续从中断时间计时,信号灯继续亮红灯,待缓冲倒计时结束后恢复正常信号灯显示

35-9

4、单片机源程序:

#include\

unsigned char num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字0~9

unsigned char ctr[]={0x7e,0xf5}; //0xfa(P3_0和P3_2为0,即高位有效)0xf5(P3_1和P3_3为0,即低位有效)//修改::0xfe(P3_7为1)

unsigned char disEW[2]; //记录东西向高低位数值 unsigned char disSN[2]; //记录南北向高低位数值 unsigned char v; unsigned char cnt_ctr; unsigned int scdEW,scdSN;

unsigned int cntSN,cntEW; unsigned char cntP3_4,cntP3_5,cntP3_6;

unsigned int cnt_num,cnt_key,cnt_flash,keyMemory;

int greenEW = 20,yellowEW = 3,greenSN = 25,yellowSN = 5;

//延时函数,a为1延时1毫秒 void delay_ms(unsigned int a) { int i; while(a--) { i = 70; while(i--); } }

//设置红绿黄灯秒数 void setSecond(void) { while(P3_4 == 0); cntP3_4++; //标志设置键被按下的次数 switch(cntP3_4) { case 1: cntEW = 5; P1 = 0xf7; break; case 2: cntEW = 1; P1 = 0xef; break; case 3:

35-10

cntSN = 1; P1 = 0xfe; break; case 4: cntSN = 3; P1 = 0xfd; break; case 5: cntEW = 5; cntSN = 5; cnt_num = 0; cntP3_4 = 0; break; } }

//秒数加1

void addSecond(void) { while(P3_5 == 0); cnt_key = 0; //记录长按键的参数清零 switch(cntP3_4) { case 1: if(keyMemory != greenEW + 10) //判断按键是否已经加10,如果没有加10则秒数加1,如果已经加10则不加1 { greenEW++; } if(greenEW == 90) { greenEW = 0; } scdEW = greenEW; scdSN = greenEW + yellowEW + 1; break; case 2: if(yellowEW++ == 9) { yellowEW = 0; } scdEW = yellowEW; break; case 3:

35-11

if(keyMemory != greenSN + 10) { greenSN++; } if( greenSN == 90) { greenSN = 0; } scdEW = greenSN + yellowSN + 1; scdSN = greenSN; break; case 4: if(yellowSN++ == 9) { yellowSN = 0; } scdSN = yellowSN; break; } }

//秒数减1

void subSecond(void) { while(P3_6 == 0); cnt_key = 0; //记录长按键的参数清零 switch(cntP3_4) { case 1: if(keyMemory != greenEW - 10) //判断按键是否已经减10,如果没有减10则秒数减1,如果已经减10则不减1 { greenEW--; } if(greenEW == -1) { greenEW = 89; } scdEW = greenEW; scdSN = greenEW + yellowEW + 1; break; case 2: if(yellowEW-- == 0) {

35-12

yellowEW = 9; } scdEW = yellowEW; break; case 3: if(keyMemory != greenSN - 10) { greenSN--; } if(greenSN == -1) { greenSN = 89; } scdEW = greenSN + yellowSN + 1; scdSN = greenSN; break; case 4: if(yellowSN-- == 0) { yellowSN = 9; } scdSN = yellowSN; break; } }

//正常显示秒数 void display(void) { cnt_num++; if(cnt_ctr == 10) { cnt_ctr = 0; P3 = 0xff; P3 = ctr[v]; P2 = num[disEW[v]]; //显示东西方向秒数 P0 = num[disSN[v]]; //显示南北方向秒数 if(v++ == 1) { v = 0; } } }

35-13

//闪烁显示秒数 void dspFlash(void) {

cnt_flash++;

if(cnt_flash < 660) { P3 = 0xff; //数码管灭 } else { if(cnt_flash == 1333) //数码管亮 1333=4000/3 即1秒闪3次 { cnt_flash = 0; } if(cnt_ctr == 25) { cnt_ctr = 0; P3 = 0xff; P3 = ctr[v]; switch(cntP3_4) { case 1: P3_0 = 1; P3_1 = 1; P2 = num[disEW[v]]; break; case 2: P3_0 = 1; P3_1 = 1; P2 = num[disEW[v]]; break; case 3: P3_2 = 1; P3_3 = 1; P0 = num[disSN[v]];; break; case 4: P3_2 = 1; P3_3 = 1; P0 = num[disSN[v]]; break;

35-14

} if(v++ == 1) {

v = 0; } } } }

//长按加10秒 void add_10s(void) { cnt_key = 0; switch(cntP3_4) { case 1: greenEW = greenEW + 10; //长按秒数加10 if(greenEW >= 90) { greenEW = 0; } keyMemory = greenEW + 10; //keyMemory用来标记秒数已经加10 scdEW = greenEW; scdSN = greenEW + yellowEW + 1; break; case 3: greenSN = greenSN + 10; if(greenSN >=90) { greenSN = 0; } keyMemory = greenSN + 10; scdEW = greenSN + yellowSN + 1; scdSN = greenSN; break; } }

//长按减10秒 void sub_10s(void) { cnt_key = 0; switch(cntP3_4)

35-15

{ case 1: greenEW = greenEW - 10; //长按秒数减10 if(greenEW < 0) { greenEW = 89; } keyMemory = greenEW - 10; //keyMemory用来标记秒数已经减10 scdEW = greenEW; scdSN = greenEW + yellowEW + 1; break; case 3: greenSN = greenSN - 10; if(greenSN < 0) { greenSN = 89; } keyMemory = greenSN - 10; scdEW = greenSN + yellowSN + 1; scdSN = greenSN; break; } }

//T0中断

void t0(void) interrupt 1 { cnt_ctr++; if(cntP3_4 == 0) { display(); //正常显示秒数 } if(cntP3_4 != 0) { dspFlash(); //闪烁显示秒数 } if(cnt_num == 4000) {

cnt_num = 0; if(scdEW-- == 0) { cntEW++; //东西向秒数减至0,标志位加1 } if(scdSN-- == 0)

35-16

{ cntSN++; //南北向秒数减至0,标志位加1 } } switch(cntEW) { case 1: scdEW = yellowEW; //东西向黄灯亮,显示黄灯秒数 P1_3 = 1; P1_4 = 0; P1_5 = 1; cntEW++; //避免程序到此阻塞,故将其至为2 break; case 3: //避免cntEW为2 scdEW = greenSN + yellowSN + 1; //东西向红灯亮,显示红灯秒数 P1_3 = 1; P1_4 = 1; P1_5 = 0; cntEW++; //避免程序到此阻塞,故将其至为4 break; case 5: //避免cntEW为4 scdEW = greenEW; //东西向绿灯亮,显示绿灯秒数 P1_3 = 0; P1_4 = 1; P1_5 = 1; cntEW = 0; break; } switch(cntSN) { case 1: scdSN = greenSN; //南北向绿灯亮,显示绿灯秒数 P1_0 = 0; P1_1 = 1; P1_2 = 1; cntSN++; //避免程序到此阻塞,故将其至为2 break; case 3: //避免cntSN为2 scdSN = yellowSN; //南北向黄灯亮,显示黄灯秒数 P1_0 = 1; P1_1 = 0; P1_2 = 1; cntSN++; //避免程序到此阻塞,故将其至为4 break;

35-17

case 5: //避免cntSN为4 scdSN = greenEW + yellowEW + 1; //南北向红灯亮,显示红灯秒数 P1_0 = 1; P1_1 = 1; P1_2 = 0; cntSN = 0; break; } if(P3_5 == 0) { if(cnt_key++ == 4000) { add_10s(); //长按数码管加10秒 } } if(P3_6 == 0) { if(cnt_key++ == 4000) { sub_10s(); //长按数码管减10秒 } }

disEW[0] = scdEW/10; disEW[1] = scdEW; disSN[0] = scdSN/10; disSN[1] = scdSN; }

//主函数

void main(void) { TMOD = 0x02; //设置定时器0为工作方式2 TH0 = 0x06; TL0 = 0x06; //初始化8位定时器 (256 - 6)*40000 = 1s EA = 1; //总中断允许 ET0 = 1; //T0中断允许 TR0 = 1; //打开T0中断 EX0 = 1; //xiugai::开外部中断 P1 = 0xf3; //东西向绿灯,南北向红灯 P3_4 = 1; scdEW = greenEW; //设置东西向显示秒数 scdSN = greenEW + yellowEW + 1; //设置南北向显示秒数 while(1)

35-18

{ if(P3_4 == 0) { delay_ms(15); if(P3_4 == 0) { setSecond(); //设置红绿黄灯秒数 } } else if(P3_5 == 0) { delay_ms(15); if(P3_5 == 0) { addSecond(); } } else if(P3_6 == 0) { delay_ms(15); if(P3_6 == 0) { subSecond(); } } keyMemory = 200; //给keyMemory任意赋值,防止长按加10或减10后不能正常加减 } }

void exter0() interrupt 0 //紧急中断按钮 { P1_2=0; P1_5=0; P1_3=1; P1_0=1; P2=0; P0=0; }

5、实物的制作

35-19

35-20

图 1.14.7 CL002 BCD码译码显示器

表1.14.3 CL002 逻辑功能表

集成译码显示的接线图如图 1.14.9(一位显示)所示

35-31

输出PCB印制板图并排列美化后如下:

35-32

35-33

35-34

35-35

百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库(绝对实用)基于51单片机及数字电路的两种智能交通灯仿真与设计在线全文阅读。

(绝对实用)基于51单片机及数字电路的两种智能交通灯仿真与设计.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.70edu.com/wenku/177583.html(转载请注明文章来源)
Copyright © 2020-2025 70教育网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备16052595号-17
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219