模拟交通灯电子设计实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电
子
设
实
验
报
告
班级:电子信息科学与技术信科09-4班学号:08093610
姓名:司祥
指导教师:许新征
引言:
电子技术是一门实践性很强的学科。电子系统设计与实践是电子技术综合应用的实践性环节,是提高在校大学生实践技能和增强动手能力的有效措施。通过电子实习,使学生建立起电子技术在实际生活中应用的概念和工程意识,培养和提高理论与实践相结合、分析和解决问题、动手实践的能力,为后续电子技术的应用和创新打下基础。本课程着重进行电子技术综合性应用实习,包括对实际电原理图的理解、设计,融合课堂各相关课程的理论知识、实验基础,结合实际项目,培养学生实践能力、综合应用能力以及独立工作能力,除了综合性应用实习外,还要进行设计性应用实习,加大培养工程设计能力,完成电子产品或电子电路的印制板图设计。
一、设计背景:
如今,红绿灯成为管制交通的最有效的手段之一。作为疏导交通必不可少的工具,已经出现在各个交通路口。红绿灯的出现有效的减少了交通事故的发生,提高了道路的畅通性。因此,为了巩固对课堂知识的理解,更进一步了解单片机结构与功能,加强自己的动手实践能力,我决定用单片机来实现简单模拟交通灯的设计。
二、设计功能:
1.东西方向车道和南北方向车道上车辆交替运行。
2.南北方向为主干道,即南北方向通行时间大于东西通道。
3.红灯亮表示禁止通行,绿灯亮表示允许通行。
4.在绿灯转为红灯时,绿灯先变为黄灯持续3s ,此时另一通道红灯保持不变。
5.路口数码管按秒倒计时显示数字作为提醒。
南
东
西北
交通路口示意图
主
干
道
三、所需器件:
1.STC89C52 1块(含底座)
2.晶振12MHz
3.电容30pF 2个
4.电解电容10μF 1个
5.双位共阳LED 4个
6.发光二极管12个(红黄绿各3个)
7.74ls244 1块(含底座)
8.电阻470Ω12个
9.电阻1KΩ4个
10.万用板1块
B座1个
B线1个
四、详细设计:
首先连接单片机最小系统:XTAL1和XTAL2分别接晶振两端,RST为单片机的掉电保护或上电复位端。
利用P0口控制数码管数据显示,P0口和数码管之间接74ls244作数据缓冲器,数据经74ls244缓冲器送到数码管显示。P2口连接数码管的公共极COM1和COM2,也即动态扫描时的位选,“1”有效。P1口控制LED灯模拟交通灯的亮灭,“0”有效。利用单片机定时/计数器0计数方式1产生50ms的延时,中断20次即1s延时,作为数码管倒计时单位;利用定时/计数器1产生3ms延时作动态扫描。
由于南北方向为主干道,因此起始时设置南北方向亮绿灯,数码管初值为32;东西方向亮红灯,数码管初值为35,当南北方向数码管倒计时为0时黄灯亮3s,东西方向红灯恰好倒计时为0。此时,南北方向亮红灯25秒,东西方向亮绿灯22秒,东西方向数码管倒计时为0时亮黄灯3秒。之后以此为周期重复。
电路原理仿真图如下:
东西方向红灯35秒,南北方向绿灯32秒
南北方向绿灯倒计时为0后,3s黄灯
南北方向25s红灯,东西方向22s绿灯
由于软件中244元件问题,仿真时用255代替。实际电路中,单片机驱动
COM1和COM2电流不够,因此每个数码管的公共极都接了上拉电阻驱动电路。
流程图:
五、程序代码:
#include
#define uchar unsigned char
#define uint unsigned int
#define westred 0xfe //定义各方向红黄绿灯状态
#define westyel 0xfd
#define westgre 0xfb
#define westhigh 0x01
#define westlow 0x02
#define southred 0xef
#define southyel 0xdf
#define southgre 0xbf
#define southhigh 0x40
#define southlow 0x80
int tick=0;
uint westvalue,southvalue;
uint count=0;
code uchar Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void timer0_init()
{
TMOD=TMOD&0XF1;
ET0=1;
PT0=1;
TH0=0x3c;//50ms
TL0=0xb0;
TR0=1;
}
void timer1_init()
{
TMOD=TMOD&0X1f;
ET1=1;
PT1=0;
TH1=0xf4; //3ms
TL1=0x48;
TR1=1;
}
void timer0_iqr() interrupt 1
{
TH0=0x3c; //TH0=0x4b
TL0=0xb0; // TL0=0x00;
if(tick%150==0)
{
southvalue--;
westvalue--;
}
if(tick==0)
{
P1=westred&southgre;
westvalue=35;
southvalue=32;
}
else if(tick==32*150)
{
P1=westred&southyel;
southvalue=3;
}
else if(tick==35*150)