欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载
     

    基于单片机控制的交通灯设计(含完整C程序 原理图) .doc

    • 资源ID:3264656       资源大小:487.02KB        全文页数:19页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于单片机控制的交通灯设计(含完整C程序 原理图) .doc

    实 习 报 告电子与信息工程学院课 程 设 计 报 告(2010 2011学年 第 2 学期)课程名称: 单片机课程设计 班 级: 学 号: 姓 名: 指导教师: 2011年 03月1、 目的实习是在教师指导下,学生运用所学理论知识及实验方法解决实际问题的一种实践活动,通过这些活动培养学生分析问题和解决问题的能力。具体表现在构造一个控制系统框架的能力;检索和阅读文献资料的能力;综合运用所学专业知识使之对所设计系统具有独立调试的能力和故障处理的能力;绘图能力;计算机运用能力;逻辑思维能力与形象思维能力;文字及口头表达的能力;撰写实习报告的能力2、 内容和要求任务1:交通灯(1)基本要求:以单片机为核心设计一个完整的交通灯模拟系统。所谓模拟就是以每组有绿,红,黄色3支共两组发光二极管表示交通信号灯,数码管2只共两组以递减的方式表示各色信号灯的时间。在双干线路口上,交通信号灯的变化是定时的。假定: 放行线,绿灯亮放行25秒,黄灯亮警告5秒,然后红灯亮禁止。 禁止线,红灯亮禁止30 秒,然后绿灯亮放行。使两条路线交替地成为放行线和禁止线,就可以实现定时交通控制。假定以P1口线接6支发光二极管(即交通信号灯),因为电路中有反相器的关系,所以口线输出高电平则“信号灯”熄灭,口线输出低电平则“信号灯“亮。(2)进阶要求一:在基本要求的基础上,要求红绿灯时间可通过按键设置,例如红灯60秒,绿灯52秒,黄灯8秒。提示:时间设置一定是要遵循以下规律:红灯时间绿灯时间黄灯时间;任务2:秒表要求:至少包括4个功能:时间清零;启动计时;暂停计时;继续计时;计时最小单位0.1 秒,最大计时时间999.9秒3过程(如实际程序开发、电子制作,详细说明有关原理、开发过程、调试过程、结果)一交通灯芯片介绍SST89E58RD:是8位FLASH FLEX51系列单片机。FLASH FLEX51是在高级FLASH CMOS半导体工艺下设计和生产出来的单片机产品之一。单片机有40K片内FLASH EEPROM程序存储器,它利用SST的超级FLASH专利技术,这些都是SST的领先技术。超级FLASH存储器被分为两个独立的程序存储器块,基本FLASH Block0占用32K字节片内程序存储空间,二级FLASH Block1占用8K字节的片内程序存储器空间;8K字节的二级FLASH块能被映射到32K字节低地址空间它也能从程序计数器中被隐藏掉而用做一个独立的类似EEPROM的数据存储器。其具有以下特点:兼容80C51系列,内置超级FLASH存储器的单片机;工作电压Vdd=4.55.5;1K*8的内部RAM(256Bytes+768Bytes,可以放心使用C语言编程)等。8155:Intel8155是可编程RAM/IO芯片,为40脚双列直插式封装。有256*8位静态RAM,2个8位和1个6位可编程并行I/O接口,以及1个14位可编程定时器/计数器。可直与MCS-51单片机相接,是MCS-51单片机应用系统中应用最多的芯片之一其内部结构图和引脚图如图1所示图11.数码管显示模块在交通灯系统中,四位数码管是用来显示交通灯倒计时时间的,一路显示放行线时间,一路显示禁止线时间四位数码管的电路如图2:图2四位八段数码管,属共阴逆序,高电平有效,所以不带小数点的0-f的段码如下:0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H,0EEH,3EH,9CH,7AH,9EH,8EH;PROTEUS 仿真图如图3:图3四位数码管的显示使用了并行扩展芯片8155,8155与单片机SST89E58RD的接口如图4图48155的高8位数据地址线与单片机的P0口相连,CE与AD15相连,IO/M与AD8相连数码管的八位段选与PB口相连,四位位选与PA口相连。用C语言初始化8155和显示程序如下:#define PA8155 XBYTE0x7101#define PB8155 XBYTE0x7102#define COM8155 XBYTE0x7100COM8155=0x03;2发光二极管模块用两组分别为红黄绿共六盏LED灯来模拟实际的交通信号灯,时间上遵循红灯时间等于绿灯时间加黄灯时间。LED灯是低电平有效,硬件电路图如图5所示:图5LED的控制是在定时器0的中断中实现的,每一秒时间到后,会根据实时时间(current_time)与红黄绿时间比较,来确定相应的两盏灯亮,程序如下所示: if(current_time<green)/主绿灯和从红灯时间 Allocate(green-current_time)*100+green+yellow-current_time); P1=0xf3; else if(current_time<green+yellow)/主黄从红 Allocate(green+yellow-current_time)*100+green+yellow-current_time); P1=0xf5; else if(current_time<green*2+yellow)/主红从绿 Allocate(2*green+2*yellow-current_time)*100+green*2+yellow-current_time); P1=0xde; else / 主红从黄 Allocate(2*green+2*yellow-current_time)*100+2*green+2*yellow-current_time); P1=0xee;3.进阶一的实现(即实现交通灯时间的自由修改)在程序运行的过程中,要实现绿灯和黄灯时间的修改,我们需要使用一个外部中断,在中断中实现要修改的灯的颜色,选定颜色后,再扫描两个IO口来实现时间的加减具体是扫描P3.4口实现加,扫描P3.5口实现减硬件电路如图6所示:图6中断程序如下所示:void Ex0() interrupt 0 EA=0;if(!inte0)delay(500);if(!inte0)traffic_mode+;if(traffic_mode>2) traffic_mode=0;EA=1;4.程序流程图如下:开始初始化1S到?进入定时器中断0LED及数码管显示Traffic_mode=1?状态1按键处理按键是否按下状态2Traffic_mode=2?主流程图K1按下进入修改选择状态进入加状态K3按下进入减状态K4按下返回按键流程图二秒表秒表的要求是至少包括4个功能:时间清零;启动计时;暂停计时;继续计时;计时最小单位0.1 秒,最大计时时间999.9秒数码管显示模块见一中“数码管显示模块”,此处略;程序主流程图如下:开始初始化复位键?暂停暂停键?显示时间结束 秒表主流程图三将两个程序合并将两个程序合并需要用一个变量来判断,我们选择扫描P1.7口来设定变量的值,然后在中断和主函数中用变量的值来选择执行的程序段程序流程图如下:开始初始化执行交通灯功能Mode=2?执行秒表功能Mode =1?四合并后的程序如下:#include<reg51.h> /头文件#include<absacc.h>#include <intrins.h>#include<math.h>#define PA8155 XBYTE0x7101 /数码管位选地址#define PB8155 XBYTE0x7102 /数码管段选地址#define COM8155 XBYTE0x7100unsignedcharcode Table16=0X0FC,0X60,0X0DA,0X0F2,0X66,0X0B6,0X0BE,0X0E0,0X0FE,0X0F6;unsigned char Buf4=0,0,0,0;/数据缓冲区sbit BTN=P17;sbit inte0=P32;sbit add=P34;sbit minus=P35;unsigned int mode=1; unsigned int traffic_count=0; /交通灯变量unsigned int traffic_mode=0;unsigned int current_time=0;unsigned int green=25;unsigned int yellow=5;unsigned int time_count=0; /秒表变量unsigned int time=0;unsigned int reset; /复位标志位bit i=0; /启停标志位void delay(unsigned int t)/延迟函数 while(t-);void DISP_LED(unsigned char *Bufptr)/ 数码管显示 unsigned char disi;unsigned char BitCT=0X10; for(disi=0;disi<4;disi+) PA8155=BitCT; PB8155=Table*Bufptr+(disi=1 && mode=2); BitCT=BitCT<<1;/左移一位delay(500); void Allocate(unsigned int a)/ 数据分配 Buf3=a/1000; Buf2=a%1000/100; Buf1=a%100/10; Buf0=a%10;unsigned char ChKey(bit Key)/ 键值扫描函数 if(Key=0) delay(20000); if(Key=0) return 1; void Testmode()/键值扫描函数 if(ChKey(BTN)=1) mode+; if(mode=3) mode=1; Allocate(mode*10); unsigned char scankey (unsigned char sec)/加减实现函数 if(!add) delay(20000); sec+; if(!minus) delay(20000); sec-; return sec;void Ex0() interrupt 0 /外部中断0if(mode=1) /EA=0; if(!inte0) delay(2500); if(!inte0) traffic_mode+; if(traffic_mode=3) traffic_mode=0; /EA=1; else if(mode=2) reset=1;void timer0() interrupt 1 /定时器0中断 if(mode=1) traffic_count+; if(traffic_count=20) traffic_count=0; current_time=(current_time+1)%(2*yellow+2*green); if(current_time<green) Allocate(green-current_time)*100+green+yellow-current_time); P1=0xf3; else if(current_time<green+yellow) Allocate(green+yellow-current_time)*100+green+yellow-current_time); P1=0xf5; else if(current_time<green*2+yellow) Allocate(2*green+2*yellow-current_time)*100+green*2+yellow-current_time); P1=0xde; else Allocate(2*green+2*yellow-current_time)*100+2*green+2*yellow-current_time); P1=0xee; else if(mode=2) time_count+; if(time_count=2) time_count=0; time+; Allocate(time); TH0=0x4b; TL0=0x40;void Ex1() interrupt 2 /外部中断1 if(mode=2) i=i;void main() TMOD=0x01; TH0=0x4b; TL0=0x40; IP=0x01; EA=1; ET0=1; EX0=1; IT0=1; EX1=1; IT1=1; COM8155=0x03; TR0=1; Allocate(green*100+green+yellow);while(1) while(mode=1)/交通灯 Testmode(); switch(traffic_mode) case 1: yellow=scankey(yellow); Allocate(yellow*100); break; case 2: green=scankey(green); Allocate(green); break; DISP_LED(Buf); while(mode=2) /秒表 Testmode(); if(i=1) TR0=1; else TR0=0; if(reset=1) /当接收到复位信号后令各缓冲区清零,同时停止计时 time=0; reset=0; i=0; TR0=0; Allocate(0); DISP_LED(Buf);五完整的硬件电路图图7秒表的实现是在上图的基本上去掉LED部分,在独立按键控制模块换成下面的图8图84.小结(1).通过这次实现我熟悉了51单片机C语言程序的编写和单片机设计仿真工具PROTEUS的使用。用C编写程序比汇编更符合人们的思考习惯,开发者可以摆脱与硬件无必要的接触,更专心的考虑功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。C语言具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,将功能模块化,由不同的模块完成不同的功能;PROTEUS不仅是模拟电路,数字电路,模/数混合电路的设计与仿真平台,更是目前世界上最先进,最完整的多种型号单片机系统的设计与仿真平台。它真正实现了在计算机上完成从原理图设计,电路分析与仿真,单片机代码级调试与仿真,系统测试与功能验证到形成PCB的完整的电子设计,研发过程。在本次实习中主要用到ISIS功能模块,ISIS是单片机与外设的设计,仿真和协同仿真环境,它提供了进行设计的方法,为单片机系统的实时交互式仿真提供了结构体系;为单片机编辑源程序,产生目标代码提供了管理系统。(2). 在本次实习中主要遇到两个大的问题,一个是在交通灯进阶模块,如何通过按键实现交通灯时间的修改,起初准备把整个修改时间的功能实现都放在一个外部中断中实现,进入中断就进入了交通灯时间的修改,可实现起来比较困难,最后设计思路是在中断中只实现一个判断变量值的设定,在主函数中通过判断这个变量值并调用加减函数来选择修改状态;另一个是如何把两个程序合并到一个程序中并通过按键来选择,在没有参考程序的情况下,这个实现确实不容易,参考一个相关程序发现原理很简单,就是通过扫描一个IO口来设置一个变量的值,在主函数和中断中都需要实现的程序通过这个变量的值来选择具体执行那个程序。参考文献1李广弟等.单片机基础 M.北京:北京航空航天大学出版社,2010 .2龚运新.单片机C语言开发技术M.北京:清华大学出版社,2006.3张靖武等.单片机系统PROTEUS设计与仿真M.北京:电子工业出版社,2007.成绩日期批阅人- 18 -

    注意事项

    本文(基于单片机控制的交通灯设计(含完整C程序 原理图) .doc)为本站会员(李主任)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开