基于51单片机的红绿灯模拟系统
基于51单片机的交通信号灯模拟控制系统设计

XXXX学院毕业设计(论文)课题名称交通信号灯模拟控制系统学生姓名X X X学号XXXXXXXXXXXXX系别自动化工程系专业班级机电一体化X班指导教师X X技术职务讲师XXXXXX学院教务处制指导教师:XXX 2016年9月5 日用51单片机设计交通信号灯模拟控制系统机电一体化X班XXX 指导老师:XXX摘要:城市交通信号灯模拟控制系统模拟了能够对信号灯进行远程投时的城市十字路口控制系统功能。
借助于单片机开发板上的已有资源,构建了模拟实际系统功能的单片机扩N82C55控制LED灯模块、8位七段数码管显示控制模块和板上扩展接线模块。
在分析实际系统工作流程的基础上,给出了针对单片机开发板的模拟系统C51控制程序流程。
用于实际系统时,只需要将代码移植到现场设备并进行具体设置和适当修改即可,可以在满足客户需求的前提下最小化系统开发成本。
交通信号灯模拟控制系统模拟了能够对信号灯进行远程授时的城市十字路口控制系统功能。
基于AT89C51单片机的性能参数和工作原理,应用Keil单片机编译软件的C语言编程以及使用该软件开发单片机程序,说明设计的交通信号灯模拟控制系统的工作原理、程序流程和硬件结构等相关技术,指出该系统的特点。
设计一种基于AT89C51超低功耗单片机的交通信号灯模拟控制系统,详细阐明了交通信号灯模拟控制系统的工作原理,实现了一般交通信号灯控制系统的主要功能及要求,具有实用性。
该系统充分利用了AT89C51单片机的特点,使用现今单片机广泛采用的C语言编制了系统程序,并利用Keil uVision3软件进行编译运行,最终通过Proteus完成了模拟控制系统的仿真。
关键词:AT89C51单片机K eil单片机编译软件仿真软件Proteus 6 C语言交通灯XXXXX学院毕业设计(论文)指导记录表注:指导情况须填明学生在毕业设计(论文)撰写过程中存在的问题,指导教师要求修改的内容或改进措施。
指导情况填写不包括下达任务书和开题报告意见。
基于51单片机的智能交通灯系统设计

十字路口交通灯控制系统的设计1.设计思路近年来,随着科技的飞速发展,电子器件也随之广泛应用,其中单片机也不断深入人民的生活当中。
本模拟交通灯系统利用单片机AT89C51作为核心元件,实现了通过信号灯对路面状况的智能控制。
从一定程度上解决了交通路口堵塞、车辆停车等待时间不合理、急车强通等问题。
系统具有结构简单、可靠性高、成本低、实时性好、安装维护方便等优点,有广泛的应用前景。
本模拟系统由单片机硬/软件系统,两位8段数码管和LED灯显示系统。
和复位电路控制电路等组成,较好的模拟了交通路面的控制。
1.1 电源提供方案采用单片机控制模块提供电源。
1.2显示界面方案采用数码管显示。
这种方案只显示有限的符号和数码字符,简单,方便。
1.3 输入方案:直接在I/O口线上接上按键开关。
由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择该方案。
2 单片机交通控制系统总体设计2.1单片机交通控制系统的通行方案设计设在十字路口,分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。
一共可以有四个状态。
通过具体的路口交通灯状态的分析我们可以把这四个状态归纳如下:(1)东西方向红灯灭,同时绿灯亮,南北方向黄灯灭,同时红灯亮,倒计时80秒。
此状态下,东西向禁止通行,南北向允许通行。
(2)东西方向绿灯灭,同时黄灯亮,南北方向红灯亮,倒计时3秒。
此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
(3)南北方向红灯灭,同时绿灯亮,东西方向黄灯灭,同时红灯亮,倒计时60秒。
此状态下,东西向允许通行,南北向禁止通行。
(4)南北方向绿灯灭,同时黄灯亮,东西方向红灯亮,倒计时3秒。
此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
用图表表示灯状态和行止状态的关系如下:表1交通状态及红绿灯状态灯禁止通行,转绿灯允许通行,之后黄灯亮警告行止状态将变换。
51单片机红绿灯设计报告

51单片机红绿灯设计报告一、引言红绿灯是城市道路交通管理中非常重要的设备,它能够有效地控制车辆和行人的通行,维护交通秩序,提高交通效率。
本报告将介绍一种基于51单片机的红绿灯设计,利用单片机的强大功能,实现了智能化、自动化的红绿灯控制系统。
二、设计原理1.硬件设计本设计使用了51单片机,通过其IO口控制LED灯的亮灭。
红绿灯的控制通过三个IO口分别连接到红、黄、绿三个LED灯,通过控制这三个IO口的电平,实现红绿灯的切换。
2.软件设计设计中使用了C语言进行程序开发。
程序通过设置IO口的状态和延时函数,控制红绿灯的切换和延时时间。
三、电路设计1.电路图电路图给出了51单片机、LED灯和电流限制电阻之间的连接关系。
单片机的P1口连接到红、黄、绿三个LED灯上,通过改变P1口的电平,控制LED的亮灭。
2.电路元件说明-51单片机:中央处理器,负责控制整个系统的运行和信号的处理。
-LED灯:用于显示红、黄、绿三种不同的状态。
-电流限制电阻:用于限制电流大小,保护51单片机和LED灯。
四、程序设计程序设计中,通过无限循环实现红绿灯系统的连续运行,程序中设置了红绿灯切换的时间间隔和黄灯亮灭的时间间隔。
五、实验结果经过测试,本设计能够正常地实现红绿灯的切换,各种状态都能够正确显示。
红灯亮10秒,黄灯亮3秒,绿灯亮15秒,然后循环重复。
六、总结本设计利用51单片机的强大功能,实现了红绿灯的自动切换。
通过控制IO口的电平和延时函数,能够实现红绿灯的各种状态的切换。
该设计简单、实用、可靠,适用于城市交通管理中的红绿灯设备。
基于51单片机的交通信号灯系统工作过程

基于51单片机的交通信号灯系统工作过程下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!交通信号灯系统在城市交通中起着至关重要的作用,它能够有效地指挥车辆和行人的通行,保障交通的顺畅和安全。
基于51单片机的交通信号灯模拟控制系统设计整理资料

语言 交通灯
XXXXX 学院毕业设计
XXXXX 学院毕业设计(论文)指导记录表
学生姓 名 系 别
指导教 师
课题名 称
XXX
学号
XXXXXXXXXXX
自动化工程工程系
专业班级 xxx 级机电一体化 X 班
XXX
技术职务
基于 51 单片机设计交通信号灯模拟控制系统
第一次 指导情
况
XXXXX 学院毕业设计
指导教师签字:
年
月
日
第二次 指导情
况
日
指导教师签字:
年
月
XXXXX 学院毕业设计
注:指导情况须填明学生在毕业设计(论文)撰写过程中存在的问题,指导 教师要求修改的内容或改进措施。指导情况填写不包括下达任务书和开题报 告意见。
XXXXX 学院毕业设计
XXXX 学院 毕业设计(论文)
课题名称 交通信号灯模拟控制系统
学生姓名
XXX
学号
XXXXXXXXXXXXX
系别
自动化工程系
专业班级
机电一体化 X 班
指导教师
XX
技术职务
讲师
XXXXXX 学院教务处制
XXXXX 学院毕业设计
XXXXX 学院毕业设计(论文)任务书
学生姓名
XXX
关 2)有必要的程序流程图与单片机系统设计
要 3)上位机程序的编写或规划 求 4)要求格式正确,模块完整
第五学期 第2周
学生完成设计开题报告
第五学期 学生完成毕业设计初稿,指导教师给予修改
进 第 3-5 周 建议。
基于51单片机的模拟交通灯课程设计报告

模拟交通灯控制系统的设计一、功能要求利用红、绿、黄三种不同颜色的LED显示不同的通行情况,利用2个数码管进行1秒倒计时显示,最大定时时间为90秒;要求LED点亮时间和倒计时时间准确;完成单片机最小系统及其扩展设计,焊接电路板,组成功能完整的样机。
模拟实际交通灯控制系统功能,完成控制软件的编写与调试。
二、方案论证采用标准AT89C51单片机作为控制器;东、西、南、北各方向通行倒计时显示采用2位LED数码管,LED显示采用直接驱动方式;模拟交通信号灯采用直径为ψ5mm的圆形发光二极管;紧急车辆通行采用实时中断完成;通过蜂鸣器实现盲人提示功能。
按以上系统构架设计,单片机端口资源刚好满足要求,该系统设计方便,电路简单。
三、系统硬件电路的设计整套电路系统由控制系统模块、通行灯控制显示模块、时间显示模块、特种车辆通行控制模块和盲人提示电路模块等组成。
1、主控制系统主控制器采用AT89C51单片机的P1.0~P1.5脚用于控制东西及南北方向的通行灯,P1.6脚用于控制盲人提示电路;P0口及P2 口用于4组2位LED计时器的控制;特种车辆通过时使用外部中断0口(P3.2).5、盲人提示电路模块道口控制系统设计中也考虑到了方便盲人过人行道的声音提示电路,采用蜂鸣器作为声括信号灯提示、数码管倒计时显示、盲人提示功能和紧急车辆通行功能等)。
1、初始化程序初始化程序主要包括声明IO口的连接对象、声明7段LED数码管驱动信号数组、声明基本变量、定义无返回函数(延时函数)。
2、主程序主程序主要负责总体程序管理功能,实现信号灯显示与数码管倒计时显示,以及蜂鸣器提示和特种车通行提示。
主程序流程图如下子程序流程图如下状态1状态2状态4 状态5五、调试及性能分析1、硬件部分首先应用Proteus软件对电路原理图进行检查,检查无误后进行焊接,焊接结束后利用万用表检查线路是否为通路。
2、软件部分首先应用keil u4软件对程序进行编译和调试,调试成功后,利用Proteus 软件进行在线仿真,经过对程序多次地修改后,仿真效果达到了预期的要求。
基于51单片机的交通信号灯模拟控制系统
基于51单片机的交通信号灯模拟控制系统一、实验目的和要求1.掌握单片机基本资源使用。
2.掌握单片机电路原理图绘制和仿真。
3.掌握单片机C语言软件开发以及联合仿真。
二、实验内容和原理实验内容:1.根据题目绘制单片机电路原理图。
2.绘制程序流程图并编写C语言程序3.在仿真程序中进行联合仿真,最后提交实验报告三、主要仪器设备keilC,proteus。
四、操作方法与实验步骤4.1 题目要求用单片机设计一个十字路口交通灯模拟控制系统,要求东西、南北两个方向都通行20秒,警告3秒,禁止20秒,同时要考虑到东西、南北两个方向出现异常情况,出现异常情况器该方向通行60秒。
4.2 系统设计思路南北的绿红黄发光二极管与单片机AT89C51单片机的P1.0,P1.1,P1.2相连。
东西的绿红黄发光二极管与单片机AT89C51单片机的P1.4,P1.5,P1.6相连。
改变单片机P1口编码控制交通灯。
控制过程中会出现两种异常情况用外中断0和外中断1处理。
时间单位采用500ms信号,由定时/计数器0定时50ms,循环10次产生,定时/计数器0采用查询方式,主程序中设定定时/计数器0的工作方式:方式1。
4.2 电路图绘制(包含详细的参数选定文字和图像叙述)C1=1nF,C2=1nF,C3=1nF,R1=300,R2=300,R3=300,R4=300,R5=300,R6=300,R7=300,R8=300,R9=300,R10=300,R11=300,R12=300,R13=3004.3 C程序编制(包含详细的文字和程序流程图)4.3 仿真分析(包含文字和图像叙述)东西绿灯,南北红灯东西黄灯,南北红灯南北绿灯,东西红灯南北黄灯,东西红灯东西发生异常时,东西通行,南北禁止,东西方向绿灯闪,南北方向红灯闪南北发生异常时,南北通行,东西禁止,南北方向绿灯闪,东西方向红灯闪五、讨论和心得(不少于100字)通过这次对交通灯信号的模拟,了解了交通灯4种正常状态,2种异常状态,它们分别是:状态1,东西方向绿灯,南北方向红灯20秒。
基于51单片机的红绿灯模拟系统
基于增强型8051单片机的红绿灯模拟控制系统2012年11月13日目录系统功能介绍 (3)1.1系统结构框图 (3)1.2各部分功能说明 (4)二、系统方案 (4)2.1 系统设计与结构框图 (4)2.2 方案论证与比较 (4)2.2.1 虚拟仿真模块 (4)2.2.2 控制器模块 (5)2.2.3 交通灯显示模块 (6)2.2.4 数码管显示模块 (7)2.2.5 蜂鸣器模块 (9)2.2.6 矩阵键盘模块 (9)三、方案不足与改进方案 (10)3.1控制器模块 (10)3.2 显示输出模块(数码管模块、红绿灯模块) (10)3.3 输入模块(矩阵键盘模块) (10)3.4 拓展模块 (10)四、项目清单与注意事项 (11)4.1 项目清单 (11)4.2 注意事项 (11)4.2.1 模拟仿真 (11)4.2.2 连接电路 (11)4.2.3 软件调试与故障排除 (11)五、程序代码 (11)附录、相关芯片资料 (22)74HC573中文资料 (22)摘要:本系统是以STC公司的STC12C5A60S2单片机为主控制器,通过74HC573驱动4位数码管显示红绿灯倒计时,能实现红绿灯的模拟控制,并具有比较强的适应性和可调性。
关键词:4×4矩阵键盘;STC12C5A60S2;74HC573。
系统功能介绍1.1系统结构框图1.2各部分功能说明(1)红绿灯模块可以实现红绿灯系统的显示模拟,在黄灯亮时,另一个方向上的红灯会闪烁;(2)数码管模块可以显示路口各个方向红灯、黄灯和绿灯的持续时间,并进行倒计时;(3)矩阵键盘模块可以进行对倒计时时间的修改,修改的时间可由数码管显示;(4)蜂鸣器在交通灯的状态发生改变时,会有不同的声音提示。
二、系统方案2.1 系统设计与结构框图根据题目要求,本系统主要由虚拟仿真模块,控制器模块,交通灯显示模块,数码管显示模块,蜂鸣器模块,矩阵键盘模块组成。
2.2 方案论证与比较2.2.1 虚拟仿真模块我们决定先通过proteus软件仿真,设计好电路与程序,再动手焊接系统板。
基于51单片机数码管显示十字路口红绿灯
基于51单片机数码管显示十字路口红绿灯#include<reg51.h>unsigned char count,d1,d2,c1,c2;unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; signed int time=10,time1=13,g=3,y=13;void delay(unsigned char i);/***********子函数声明***************/void sm();/***********I/O端口声明*****************/sbit P2_0=P2^0; //东西绿sbit P2_1=P2^1; //东西红sbit P2_2=P2^2; //东西黄sbit P2_3=P2^3; //南北绿sbit P2_4=P2^4; //南北红sbit P2_5=P2^5; //南北黄sbit button=P2^6;sbit button1=P2^7;sbit button2=P3^0;sbit button3=P3^1;sbit button4=P3^2;sbit button5=P3^3;sbit button6=P3^4;sbit button7=P3^5;sbit button8=P3^6;/*************************************数码显示******************************************/void sm(){d1=time/10;d2=time%10; //东西数码管P1=0x00;P0=s[d1];delay(20);P1=0x01;P0=s[d2];delay(20);c1=time1/10; //南北数码管c2=time1%10;P1=0x02;P0=s[c1];delay(20);P1=0x03;P0=s[c2];delay(20);}void main() //主函数{TMOD=0x01;TH0=0x3c;TL0=0xb0;EA=1;ET0=1;TR0=1;while(1){sm();}}void int1()interrupt 1 {count++;if(count==20){count=0;ts++;th++;time--;time1--;}/*****************************判断程序******************************/if(ts==0&&th==0) //初始状态时间与亮灯颜色{time1=13;time=10;P2=0xee;}if(ts==11) //东西10秒转3秒{P2=0Xeb;time=3;}if(ts==15) //东西3秒转13秒{P2=0xf5;time=13;}if(ts==29) //东西13秒转10秒{ts=0;}if(th==14) //南北13秒转10秒{P2=0xf3;time1=10;}if(th==25) //南北10秒转3秒{P2=0xdd;time1=3;}if(th==29) //南北3秒转10秒{th=0;}}void delay(unsigned char i ) //延时函数{unsigned char j,k;for (k=0;k<i;k++)for (j=0;j<10;j++);}。
基于51单片机的交通灯设计
基于51单片机的交通灯设计交通信号灯是指示人和交通工具在道路交通中行进方向或行为的一种交通设施。
在设计交通信号灯时,应考虑交通流量、车辆速度、交叉口结构等因素,以确保交通的顺畅和安全。
本文将基于51单片机设计一种交通信号灯系统,并详细介绍其原理和实现方法。
交通信号灯系统的设计目的是通过控制红、黄、绿三种不同颜色的灯,指示车辆和行人在交通路口安全行驶。
在单片机设计中,我们将使用三个LED灯分别代表红、黄、绿三种状态。
通过控制LED的亮灭,来实现交通信号灯的变换。
首先,我们需要选择适当的硬件设备进行交通信号灯的设计。
在51单片机设计中,可以选择STC89C51或者AT89C51等型号的单片机。
此外,还需要准备三个LED灯、电阻、电容、按键等器件。
接下来,我们将进行电路设计。
在设计电路时,首先将三个LED灯连接到单片机的三个IO口上,每个IO口通过一个电阻与正极连接,负极与GND连接。
此外,在单片机的一个IO口上连接一个按键,通过按下按键触发程序的执行。
在编写程序之前,首先需要确立交通信号灯的运行逻辑。
一般而言,交通信号灯的运行逻辑如下:1.全红状态:所有车辆和行人均停止,任何方向都不可行驶。
2.绿灯状态:一些方向的车辆和行人可以行驶,其他方向均不可行驶。
3.黄灯状态:信号灯将要变成红灯或绿灯,此时车辆和行人应注意刹车或等待。
接下来,我们将编写程序并烧录到单片机中。
在程序中,需要使用到定时器和中断来进行交通信号灯的控制。
具体步骤如下:1.在程序中定义三个LED灯所对应的IO口。
2.初始化定时器,并设置定时时间,用于控制信号灯的变化。
3.设置中断,用于按键的检测和处理。
4.在主循环中,不断检测按键状态,当按键按下时,切换信号灯的状态。
5.根据信号灯的状态,控制LED灯的亮灭。
在程序设计中,应充分考虑各种异常情况和执行顺序,以保证交通信号灯的正常运行。
此外,还可以增加一些辅助功能,如倒计时显示等,以提高交通信号灯的可视性和安全性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于51单片机的红绿灯模拟系统基于增强型8051单片机的红绿灯模拟控制系统2012年11月13日目录系统功能介绍 (2)1.1系统结构框图 (2)1.2各部分功能说明 (3)二、系统方案 (3)2.1 系统设计与结构框图 (3)2.2 方案论证与比较 (3)2.2.1 虚拟仿真模块 (3)2.2.2 控制器模块 (4)2.2.3 交通灯显示模块 (5)2.2.4 数码管显示模块 (6)2.2.5 蜂鸣器模块 (8)2.2.6 矩阵键盘模块 (8)三、方案不足与改进方案 (9)3.1控制器模块 (9)3.2 显示输出模块(数码管模块、红绿灯模块) (9)3.3 输入模块(矩阵键盘模块) (9)3.4 拓展模块 (9)四、项目清单与注意事项 (10)4.1 项目清单 (10)4.2 注意事项 (10)4.2.1 模拟仿真 (10)4.2.2 连接电路 (10)4.2.3 软件调试与故障排除 (10)五、程序代码 (10)附录、相关芯片资料 (21)74HC573中文资料 (21)摘要:本系统是以STC公司的STC12C5A60S2单片机为主控制器,通过74HC573驱动4位数码管显示红绿灯倒计时,能实现红绿灯的模拟控制,并具有比较强的适应性和可调性。
关键词:4×4矩阵键盘;STC12C5A60S2;74HC573。
系统功能介绍1.1系统结构框图1.2各部分功能说明(1)红绿灯模块可以实现红绿灯系统的显示模拟,在黄灯亮时,另一个方向上的红灯会闪烁;(2)数码管模块可以显示路口各个方向红灯、黄灯和绿灯的持续时间,并进行倒计时;(3)矩阵键盘模块可以进行对倒计时时间的修改,修改的时间可由数码管显示;(4)蜂鸣器在交通灯的状态发生改变时,会有不同的声音提示。
二、系统方案2.1 系统设计与结构框图根据题目要求,本系统主要由虚拟仿真模块,控制器模块,交通灯显示模块,数码管显示模块,蜂鸣器模块,矩阵键盘模块组成。
2.2 方案论证与比较2.2.1 虚拟仿真模块我们决定先通过proteus软件仿真,设计好电路与程序,再动手焊接系统板。
因为通过软件仿真,设计系统时灵活性会大一些,可以提前选择好硬件,便于硬件部分的修改,也可以做到软件部分的即时调试。
仿真时的状况如图2-2所示:图2-1 Proteus软件欢迎界面图2-2 Proteus仿真情况2.2.2 控制器模块控制器模块我们决定选择STC公司的STC12C5A32S2单片机。
STC12C5A60S2/AD/PWM 系列单片机是STC生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S,即25万次/秒),针对电机控制,强干扰场合。
(《STC12C5A32S2系列单片机器件手册》);内部结构相对简单,可用作入门级芯片;而且我们手中已经有几块STC12C5A32S2系列单片机最小应用系统,便于硬件电路的焊接。
最小系统电路图参考图2-3:图2-3 最小系统电路图2.2.3 交通灯显示模块方案一:采用四组红黄绿三色二极管,通过10K 的排阻分别连至单片机的P1.0-P1.6口,通过改变P1.1-P1.6的输出电平控制交通灯的亮灭。
缺点是占用I/O口较多,但易于编程控制;方案二:采用74HC573芯片控制四组发光二极管。
通过P0.0-P0.5向74HC573发送信号,P2中某一I/O口控制芯片的开启和关闭。
优点是能比较大的节约I/O口,缺点是会增加编程复杂度。
由于单片机的I/O口足够用来实现系统的基本功能,所以我们决定采用方案一。
如果之后扩展功能时还会需要更多的I/O口时,可以考虑换成方案二。
方案一的电路图如下:图2-4 交通灯模块电路图(方案一)2.2.4 数码管显示模块方案一:采用两片74HC595芯片驱动共阳极四位数码管。
一片控制段选,一片控制位选。
位选信号通过三极管9012放大。
优点是占用I/O口较少,但在仿真过程中出现了一些问题。
问题如下:静态显示时数码管显示正常,但动态仿真时虽然单片机的各个引脚的电平变化正常,但位选信号(9012的基极输入信号)的一直为零。
更改限流电阻以后,数码管全部显示8。
经查阅资料,得知在程序和硬件电路正常显示的情况下,数码管不正常显示的原因,可能是因为数码管的响应时间过短,对PNP 三极管的仿真速度太低。
资料中建议使用NPN型三极管,并将数码管的minimum Trigger Time值调高。
这也说明了仿真与硬件电路之间的不统一。
电路图如下图所示:方案二:采用两片74HC573芯片驱动共阴极四位数码管。
一片控制段选,一片控制位选。
通过P0口控制输出电平,故需要上拉电阻。
上拉电阻采用10K的排阻。
优点是软件控制比较简单,但相比方案一要占用更多的I/O口。
此方案在仿真时也出现了问题,即数码管显示乱码。
之后通过对数码管进行软件清屏的方法使数码管显示正常。
方案二的电路图如下图所示:为了使硬件电路与仿真有较高的统一性,我们决定采用方案二。
图2-5数码管电路仿真图(方案一)图2-6 数码管电路仿真图(方案二)2.2.5 蜂鸣器模块方案一:通过控制蜂鸣器,使蜂鸣器发出不同的声音,指示交通灯路口的不同状态。
其优点是控制较为简易,缺点是通过蜂鸣器的发声,不同路口之间通行状态是通过蜂鸣器的不同频率的声音决定的,但不同频率的声音与不同方向的通行状态之间的对应关系不直观,交互性较差。
方案二:通过ISD400x系列语音芯片,录放不同的声音,指示交通灯路口的不同状态。
其优点是可以让通行者直观的了解各个方向下一步的通行状态,有很强的交互性,缺点是硬件电路和软件控制较为复杂,占用较多的I/O口,而且与其他部分之间的时序比较难以协调。
由于本系统的制作本着仿真模拟的原则,暂时通过蜂鸣器来代替语音信息,但在以后的实验中可以考虑用ISD400x系列语音芯片代替蜂鸣器。
2.2.6 矩阵键盘模块根据题目要求,本系统最少三个按键就可以实现按键调节时间功能。
但为了更好的完成项目,和以后的功能拓展,我们决定采用4*4矩阵按键。
方案一:通过P3口控制矩阵按键。
优点是易于编程,其缺点是占用过多的I/O口。
但由于按键在一般情况下都是断开的,所以同一个引脚还可以扩充其他功能。
其原理图如下图所示:方案二:采用改进型I/O端口键盘。
优点是I/O 端口只占用4个,但在编程上复杂度增加。
其原理图如下图所示:所以目前在I/O口比较充足的情况下,我们决定先采用方案一,在以后的改进工作中考虑将其换成方案二。
图2-7 矩阵键盘仿真电路图(方案一)三、方案不足与改进方案3.1控制器模块I/O口的利用情况较差。
在各引脚中,P0口和P2.6,P2.7用来控制74HC573驱动数码管,P2.0—P2.5用来控制红绿灯;P3控制按键;P1.0控制蜂鸣器,还有P1.1—P1.7没有用。
这几个口可以用来接更多的外设,比如AD模块等。
但在很多模块上,存在着引脚“浪费”的情况。
矩阵按键可以用四个I/O口实现,也可以用P0口的模数转化器ADC通道实现。
可以考虑把两片74HC573芯片换成功能更强大的MAX7219芯片;如果仍使用74HC573芯片的话,可以考虑将红绿灯模块也用该芯片驱动,这样只会再增加一个I/O口的使用。
3.2 显示输出模块(数码管模块、红绿灯模块)1、显示模块就占用了P1,P2的14个I/O口,使得系统的可改进程度降低。
可以考虑更换显示模块的驱动芯片,如3.1中所述,也可以将红绿灯与倒计时协调起来,用另外一片74HC573驱动。
2、倒计时方面,由于在各个方向上(除一个方向上亮黄灯,另一个方向上红灯闪烁外)倒计时的显示相同,在做仿真模拟时只选择了两位数码管进行倒计时显示。
在改进阶段,需要把黄灯亮,红灯闪烁的情况考虑进去,将数码管SEG1的剩余两位用上,SEG1的前两位和后两位分别显示不同方向上的倒计时。
3、做好倒计时模块以后,还有SEG2数码管没有用上。
可以考虑将其做成一个温度计,选择功能比较强大的如DS18xx数字化温度传感器,占用线口少、连接方便、测量精度高的传感器。
3.3 输入模块(矩阵键盘模块)1、4*4的矩阵键盘占用了P3口,限制了功能的拓展。
但按键在释放的状态下,P3口还是可以用来实现更多功能,只要按键不被按下,P3口的其他功能就不会受影响;2、矩阵键盘16个按键目前为止只用了四个,分别是:时间选择键、个/十位切换键、增加键、减小键。
但还有12个键没有使用。
这十二个键可以仿照小键盘的模式,分别对应0-9这十个数,另外两个键设定为紧急状态键。
3、若在之后的改进中存在I/O口不够用的情况,可以换成改进型I/O端口键盘。
3.4 拓展模块1、可以考虑用压力传感器模拟超载监测装置;2、可以考虑用光敏电阻、ADC,DAC来制作可调光强的红绿灯。
四、项目清单与注意事项4.1 项目清单(1)数码管显示模块:74HC573,(2)MCU控制模块:STC12C5A32S2,IC座,LED,SPI插座等(3)基本元器组件:电阻、瓷片电容,电解电容,9012,8050,1N4007,排针,杜邦线,开关,导线4.2 注意事项4.2.1 模拟仿真模拟仿真只是工具,仿真的目的是为了更好的制作硬件和辅助调试软件。
当程序和电路图没有问题时却得不到正确的仿真效果,应该考虑是不是仿真本身的问题;或者将该模块的硬件先搭出来,通过硬件电路调试。
不要过度的依赖仿真。
4.2.2 连接电路连接电路前尽量都要做出仿真实验,避免不必要的麻烦和损失(元器件烧坏等问题);做不出仿真的先手动搭出硬件电路,经测试成功后再焊接。
电路板可以选用一种多个金属环连接在一起的板子,减少焊接线的数量。
4.2.3 软件调试与故障排除如果在调试中出现问题,应考虑是硬件问题还是软件问题。
若是硬件问题,对照电路图检查连接是否有误;检查芯片是否坏掉;检查各焊点是否存在虚焊等接触不良的问题;若是软件问题,检查算法是否有误;还有编译器自身的问题。
五、程序代码(本程序在proteus上已仿真成功)#include"reg51.h"#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //U2锁存器的锁存端sbit wela=P2^7; //U3锁存器的锁存端uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x08};//最后一个是下划线,用来做闪烁uint code jiepai[]={524,262,293,330,349,392,440,494}; //节拍uchar code yindiao[]={55,110,98,87,82,73,65,58}; //音谱sbit P20=P2^0;//红绿灯的位定义sbit P21=P2^1;sbit P22=P2^2;sbit P23=P2^3;sbit P24=P2^4;sbit P25=P2^5;sbit s1=P3^0; //定义按键,功能键sbit s2=P3^1; //定义按键,十位个位选择键sbit s3=P3^2; //定义按键,增大键sbit s4=P3^3; //定义按键,减小键sbit rd=P3^7;sbit fmq=P1^0; //蜂鸣器定义端ucharnum1, //倒计时剩余时间,单位是秒num2, //50ms计数标志位shi,ge; //十位个位倒计时暂存变量uchar s1num; //按键功能判断标志,取值为1,2,3,4,分别对应两个方向的倒计时不同状态uint timer[4]={10,5,10,5}; //数组,里面的数据是4种不同状态倒计时的时间unsigned int m; //红灯闪烁延时uint cnt=1;//状态切换标志uint flag=0;//时间调整个位十位切换位void delayms(unit); //延时函数声明void display(uchar,uchar); //数码管显示函数声明void matrixkeyscan(); //扫描键盘函数void move(); //修改定位void save_data(uint,uint);//保存数据void yanzou(uchar yindiao,uint jiepai);//蜂鸣器函数声明/****************************************** *********************函数功能:主函数******************************************* *********************/void main(void){num1=timer[0];TMOD=0x01; //计时器设置TH0=(65536-45872)/256; //计时器设置TL0=(65536-45872)%256; //计时器设置TR0=1; //计时器设置ET0=1; //计时器设置EX0=1; //emergency中断设置IT0=1; //emergency中断设置EA=1; //总开关num1=timer[0];shi=num1/10; //使数码管初始显示正确ge=num1%10;s1num=0;rd=0;while(1){matrixkeyscan(); //在主函数中不停进行按键扫描switch (cnt){case 1:while(1){//状态1matrixkeyscan(); //在主函数中不停进行按键扫描display(shi,ge); //数码管倒计时显示P20=1; //红绿灯显示P21=1;P22=0;P23=0;P24=1;P25=1;if(cnt==2){yanzou(yindiao[1],jiepai[1]/2);yanzou(yindiao[2],jiepai[2]/2);break;}} break;case 2:while(1){//状态2matrixkeyscan(); //在主函数中不停进行按键扫描display(shi,ge);P20=1;P21=0;P22=1;P23=1;for(m=150;m>0;m--){display(shi,ge);}P23=0;for(m=150;m>0;m--){display(shi,ge);}P24=1;P25=1;if(cnt==3){yanzou(yindiao[2],jiepai[2]/2);yanzou(yindiao[3],jiepai[3]/2);break;}} break;case 3:while(1){//状态3matrixkeyscan(); //在主函数中不停进行按键扫描display(shi,ge);P20=0;P21=1;P23=1;P24=1;P25=0;if(cnt==4){yanzou(yindiao[5],jiepai[5]/2);yanzou(yindiao[6],jiepai[6]/2);break;}} break;case 4:while(1){//状态4matrixkeyscan(); //在主函数中不停进行按键扫描display(shi,ge);P21=1;P22=1;P24=0;P25=1;P20=1;for(m=150;m>0;m--){display(shi,ge);}P20=0;for(m=150;m>0;m--){display(shi,ge);}if(cnt==1){yanzou(yindiao[6],jiepai[6]/2); yanzou(yindiao[1],jiepai[1]/2);break;}} break;}}}/****************************************** *********************函数功能:延迟cnt毫秒******************************************* *********************/void delay (long cnt)//闪烁延时函数{uint i,j;for(i=cnt;i>0;i--)for(j=110;j>0;j--);}/****************************************** **********************//*****************************************************************函数功能:将十位和个位数字送至数码管显示******************************************* ***********************/void display(uchar shi,uchar ge) //显示子函数{dula=1;P0=table[shi]; //送段选数据dula=0;P0=0xff; //*送位选数据前关闭所有显示,防止打开位选锁存时wela=1; //原来的段选数据通过位选锁存器造成混乱*/P0=0xfe; //送位选数据wela=0;delay(1); //延时约1毫秒P0=0x00;dula=1;P0=table[ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(1);P0=0x00;}/****************************************** ***********************//****************************************** **********************函数功能:中断服务函数,可计算出送给数码管的数据******************************************* ***********************/void T0_time(void) interrupt 1 //时间延时函数{TH0=(65536-45872)/256; //计时器设置TL0=(65536-45872)%256; //计时器设置num2++;if(num2==20) //如果到了20次,说明1秒时间已到{num2=0; //然后把num2清0重新再计20次num1--;shi=num1/10; //把一个2位数分离后分别送给数码管显示ge=num1%10; //十位和个位if(num1==0){ //这个数用来送数码管显示,到60后归0cnt++;switch(cnt){case 1:num1=timer[0];break;case 2:num1=timer[1];break;case 3:num1=timer[2];break;case 4:num1=timer[3];break;default:cnt=1;num1=timer[0];break;}}}}/****************************************** ***********************//****************************************** **********************函数功能:键盘扫描******************************************* ***********************/void matrixkeyscan(){if(s1==0){delay(5);if(s1==0){s1num++;while(!s1);if(s1num==1) //绿灯时长{TR0=0;move(); //修改定位shi=num1/10; //把一个2位数分离后分别送给数码管显示ge=num1%10; //十位和个位//shining(); //修改闪烁}if(s1num==2) //黄灯时长{move(); //修改定位shi=num1/10; //把一个2位数分离后分别送给数码管显示ge=num1%10; //十位和个位//shining(); //修改闪烁}if(s1num==3) //绿灯时长{TR0=0;move(); //修改定位shi=num1/10; //把一个2位数分离后分别送给数码管显示ge=num1%10; //十位和个位//shining(); //修改闪烁}if(s1num==4) //黄灯时长{move(); //修改定位shi=num1/10; //把一个2位数分离后分别送给数码管显示ge=num1%10; //十位和个位//shining(); //修改闪烁}if(s1num==5) //若满四则归0{s1num=0;TR0=1; //启动定时器使时钟开始走}}}if(s1num!=0){if(s2==0){delay(5);if(s2==0){flag++;flag=flag%2;}}if(s3==0){delay(5);if(s3==0){while(!s3); //等待按键释放switch(flag){case 0:ge++;if(ge==10)ge=0;display(shi,ge); //将修改以后的数显示save_data(shi,ge);//保存数据break;case 1:shi++;if(shi==7) //若满6则清0shi=0;display(shi,ge); //将修改以后的数显示save_data(shi,ge);//保存数据break;}}}if(s4==0){delay(5);if(s4==0){while(!s4);switch(flag){case 0:ge--;if(ge==-1)ge=9;display(shi,ge); //将修改以后的数显示save_data(shi,ge);//保存数据break;case 1:shi--;if(shi==-1) //若满6则清0shi=6;display(shi,ge); //将修改以后的数显示save_data(shi,ge);//保存数据break;}}}}}/****************************************** ***********************//****************************************** **********************函数功能:蜂鸣器函数入口参数:yindao,jiepai******************************************* ***********************/void yanzou(uchar yindiao,uint jiepai){u char yd;uint jp;if(jiepai==1) delay(250); //空半拍elseif(jiepai==2) delay(500); //空一拍else{for(jp=jiepai;jp>0;jp--){fmq=0;for(yd=yindiao;yd>0;yd--);fmq=1;for(yd=yindiao;yd>0;yd--);}}}/****************************************** ***********************//****************************************** **********************函数功能:按键后将数码管显示还原到倒计时的时长******************************************* ***********************/void move() //修改定位{switch(s1num){case 1:num1=timer[0];break;case 2:num1=timer[1];break;case 3:num1=timer[2];break;case 4:num1=timer[3];break;default:num1=timer[0];break;}}/****************************************** ***********************//****************************************** **********************函数功能:将修改后的时间存储到timer数组中******************************************* ***********************/void save_data(uint shi,uint ge)//保存数据{timer[s1num-1]=shi*10+ge;}/****************************************** ***********************/附录、相关芯片资料74HC573中文资料高性能硅门CMOS器件当锁存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。