十字路口交通灯Proteus仿真

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《微机原理与接口技术》课程设计报告
题目:十字路口交通灯设计
学院:信息工程学院
专业:通信工程
目录
1、摘要 (1)
2、硬件电路图 (2)
3、AT89C51功能介绍 (3)
4、交通灯程序设计思路 (5)
5、交通灯运行流程图 (6)
6、源代码函数说明 (6)
7、交通灯设置红绿灯时间结果图 (8)
8、心得与体会 (9)
9、源程序代码 (10)
摘要
十字道口的红绿灯是交通法规的无声命令,是司机和行人的行为准则。

十字道口的交通红绿灯控制是保证交通安全和道路畅通的关键。

当前,国内大多数城市正在采用“自动”红绿交通灯,它具有固定的“红灯—绿灯”转换间隔,并自动切换。

它们一般由“通行与禁止时间控制显示、红黄绿三色信号灯和方向指示灯”三部分组成。

通常,生活中常见的红绿灯控制为,红灯六十秒,绿灯四十五秒,黄灯三秒等,因道路,车辆,城市交通规划而异,此次,基于proteus仿真十字路口的交通灯控制系统,设定南北方向绿灯15秒,黄灯5s,东西方向绿灯10s,黄灯5s。

系统基于MSC-51系列单片机89C51为中心器件来设计交通灯,显示器件为LED 红绿灯,LCD数码管。

采用c51编程,简单易懂,将功能模块化,除了可以实现红绿灯按要求变化,还通过proteus里的按钮,设置了键盘函数,可以按要求调整红绿灯亮的时间,并且还有重置(初始化)按钮。

一.功能概述
1.设计任务:
交通灯的硬件设计和软件设计
2.设计目的:
(1).初步了解和认识51单片机的工作原理,引脚图。

(2).掌握单片机相关接口技术和相关外围芯片的特性。

( 3 ).通过实际的设计程序,查找资料,调试程序,熟悉keil和proteus软件仿真,理解并熟悉模块化程序设计方法和调试。

3.基本要求:
利用单片机的定时器产生秒信号,控制十字路口的红、绿、黄灯交替点亮和熄灭,并且用 4 只LED 数码管显示十字路口两个方向的剩余时间。

当东西方向亮绿灯时,南北方向红灯亮起;反之,如果南北方向亮绿灯,同时东西方向亮绿灯;绿灯亮时车辆行驶,红灯亮时车辆停止。

即在同一时间内保证只有两个对应方向的车辆可以行驶。

要求能用按键设置两个方向的通行时间(绿、红等点亮的时间)和暂缓通行时间(黄灯点亮的时间)。

系统的工作应符合一般交通灯控制的要求。

4.设计方案
设计系统单片机89C51 为中心器件来设计交通灯控制器,系统实用性强、操作简单、扩展性强、成本较低。

本设计就是采用单片机模拟十字路口交通灯的各种状态显示。

利用单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,数码管显示剩余时间。

红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。

用红、绿、黄发光二极管作信号灯,8 管共阴极数码管显示剩余时间,矩阵键盘用来设置交通灯的显示时间和状态。

二.硬件电路图一.总体电路图
二.部分电路图。

VCC:供电电压
GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于2 内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

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口同时为闪烁编程和编程校验接收一些控制信号。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

选用P0口驱动数码管,由于选用的数码管是共阴极两位数码管,因此P0口必须
例如设计南北绿灯10s,黄灯3s,东西绿灯15s,黄灯3s
1.先按下“设置”按钮
2.然后按下“按钮5”和“按钮6”,观察南北数码管,此时显示的是绿灯的值。

根据观察,设定好绿灯值为10。

3.按下“按钮7”和“按钮8”,设定南北数码管,此时显示的是要设定的黄灯的值。

根据观察,设定好黄灯值为3
4.按下“按钮9”和“按钮10”,设定东西数码管,此时显示的是要设定的绿灯的值。

根据观察,设定好绿灯值为15
5.按下“按钮11”和“按钮12”,设定东西数码管,此时显示的是要设定的黄灯的值。

根据观察,设定好黄灯值为3
结果如图:
(1).初始时,南北绿灯,东西红灯
(2).南北黄灯,东西红灯
(3).南北红灯,东西绿灯。

心得与体会
通过这次课程设计,使我掌握了交通灯控制的基本思想与原理,学习到了一些有用的专业知识、专业技能分析和解决问题全面系统的锻炼。

使我在单片机的基本原理、单片机应用系统开发过程,电路图的绘制以及在常用编程设计思路技巧的掌握方面都向前迈了一大步。

期间我查阅了许多资料,看了许多例子,也自己试着学习编程与调试。

决定做交通灯的设计,是因为它具有实用性,原理很简单,程序思想明确,proteus内置了许多红绿灯的元件,如led灯,数码管等,程序编好后,出现了许多问题,如程序结果不是预期的结果,做好交通灯显示模块后,我参考网上的资料,加入了键盘函数,可以控制交通灯的运行,可以自己设置交通灯亮的时间,键盘的每个按钮的功能虽然简单,但是将其模块化却十分复杂,我体会到编程模块化思想的重要性,程序冗长但不失条理,添加一定的注释方便
理解并运用。

由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。

但是在设计和调试的过程中,也发现了一些问题,不过设计也有很多不足之处,譬如红灯和绿灯的切换还不够迅速,红绿灯规则不效率还不是很高,键盘效率不太高等等,这需要在实践中进一步完善,希望在今后的学习中学习更多新知识然后得以完善。

当然,通过这次课程设计,我也发现了自身的很多不足之处,在以后的学习中,我会不断的完善自我,将课本中的知识运用到实际的程序运用中。

源程序代码
#include<reg51.H>
#define uchar unsigned char //定义unsigned char 为uchar
#define uint unsigned int //定义unsigned int 为uint
uchar code table[]={ //共阴数码管管表
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0xC9,0xFF,0x40};//设置码,测试码,不计时码
void delay(uint x);//延时函数
void display(uchar,uchar,uchar,uchar); //数码管显示函数
void traffic(); //交通灯函数
uchar num,nbnum,dxnum, //nbnum表示南北方向数码管dxnum表示东西方向数码管
shi1,ge1,shi2,ge2,
nbgreen,nbyellow,//南北方向的绿灯时间黄灯时间
dxgreen,dxyellow,//东西方向的绿灯时间黄灯时间
count1,count2,flag1,flag2; //南北标记东西标记
void main()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1; //c51的外部访问端接高电平
ET0=1;
TR0=1;
/*初状态南北方向的绿灯亮15s黄灯亮5s,东西方向的红灯亮20s*/
nbgreen=15; //南北方向绿灯默认值为15s,黄灯默认时间为5s
nbyellow=5;
dxgreen=10; //东西方向绿灯默认时间为10s,黄灯默认时间为5s
dxyellow=5;
nbnum=nbgreen; //南北数码管初始显示绿灯时间初始值15s
dxnum=nbyellow+nbgreen;//东西红灯时间=南北方向的绿灯时间+南北方向的黄灯时间初始值20s
shi1=nbnum/10; //南北数码管的十位
ge1=nbnum%10; //南北数码管的个位
shi2=dxnum/10; //东西数码管的十位
ge2=dxnum%10; //东西数码管的个位
P1=0x41;//初始状态:41H=10000010B,观察P1.0-1.7可知东西红灯亮南北绿灯亮/*这是交通灯运行过程,南北方向绿灯亮15s,然后亮黄灯5s,接着亮红灯15s,东西方向红灯亮20s,接着绿灯10s,黄灯5s*/
while(1){
if(num==20) //定时器1s
{
num=0;
nbnum--;
dxnum--;
traffic();
shi1=nbnum/10;
ge1=nbnum%10;
shi2=dxnum/10;
ge2=dxnum%10;
}
display(shi1,ge1,shi2,ge2);
}
}
void traffic() //红绿灯主控制程序
{
if(nbnum==0){
count1++;
if(count1==1){
P1=0x42;//东西红灯南北黄灯 5 5
nbnum=nbyellow;
}
if(count1==2){
nbnum=dxgreen+dxyellow;//东西绿灯南北红灯10 15
P1=0x14;
}
if(count1==3){
P1=0x41;// 东西黄灯南北红灯5 5
nbnum=dxyellow;
count1=0;
}
}
if(dxnum==0){
count2++;
if(count2==1){
//P1=0x14;//东西绿灯南北红灯
dxnum=dxgreen;
}
if(count2==2){
P1=0x24;//东西黄灯南北红灯
dxnum=dxyellow;
}
if(count2==3){
dxnum=nbgreen+nbyellow; //东西红灯南北绿灯
nbnum=nbgreen;
count2=0;
}
}
}
void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2) //数码管显示子函数{
uchar temp;
temp=P2;
P2=0xfe;
P0=table[shi1];
delay(5);
P2=0xfd;
P0=table[ge1];
delay(5);
P2=0xfb;
P0=table[shi2];
delay(5);
P2=0xf7;
P0=table[ge2];
delay(5);
}
void delay(uint x)//延时子函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void T0_time() interrupt 1 //定时器T0 中断子程序{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
}
void mkeys() //4*4矩阵键盘功能子函数
{
uchar temp,key;
P3=0xfe;//第一行线
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
temp=P3;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0) {//按键1:暂停
TR0=~TR0; //定时器取反
flag1=~flag1;//南北能够设置标志0有效
flag2=~flag2;//东西能够设置标志
}
if(key==1&&flag1==0){ //按键2:设置时间按钮
TR0=0;
P1=0x44;//禁止东南西北车辆全为红灯可以设置
shi1=ge1=shi2=ge2=16;
}
if(key==2&&flag2==0){//按键3:设置完成重启
TR0=1;
num=0; //定时器初始化
P1=0x41; //重新开始初状态
nbnum=nbgreen; //南北数码管先绿灯时间
dxnum=nbyellow+nbgreen;//东西红灯时间
shi1=nbnum/10;
ge1=nbnum%10;
shi2=dxnum/10;
ge2=dxnum%10;
}
}
}
////////////////
P3=0xfd;//第二行线
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
temp=P3;
switch(temp)
{
case 0xed:
key=0;
break;
case 0xdd:
key=1;
break;
case 0xbd:
key=2;
break;
case 0x7d:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0&&P1==0x44){ //按键5:设置南北绿灯时间+
nbnum=nbgreen;
if(dxnum!=159){
nbnum++;
nbgreen=nbnum;
}
shi1=nbnum/10;
ge1=nbnum%10;
dxnum=nbgreen+nbyellow;//显示东西红灯时间
shi2=dxnum/10;
ge2=dxnum%10;
}
if(key==1&&P1==0x44){ //按键6:设置南北黄灯时间+
nbnum=nbyellow;
if(dxnum!=159){
nbnum++;
nbyellow=nbnum;
}
shi1=nbnum/10;
ge1=nbnum%10;
dxnum=nbgreen+nbyellow;//显示东西红灯时间
shi2=dxnum/10;
ge2=dxnum%10;
}
if(key==2&&P1==0x44&&nbgreen>3){ //按键7:设置南北绿灯时间- nbnum=nbgreen;
nbnum--;
nbgreen=nbnum;
shi1=nbnum/10;
ge1=nbnum%10;
dxnum=nbgreen+nbyellow;//显示东西红灯时间
shi2=dxnum/10;
ge2=dxnum%10;
}
if(key==3&&P1==0x44&&nbyellow>3){ //按键8:设置南北黄灯时间- nbnum=nbyellow;
nbnum--;
nbyellow=nbnum;
shi1=nbnum/10;
ge1=nbnum%10;
dxnum=nbgreen+nbyellow;//显示东西红灯时间
shi2=dxnum/10;
ge2=dxnum%10;
}
}
}
////||||||||||||||||||
P3=0xfb;//第三行线
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0){
temp=P3;
switch(temp)
{
case 0xeb:
key=0;
break;
case 0xdb:
key=1;
break;
case 0xbb:
key=2;
break;
case 0x7b:
key=3;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
if(key==0&&P1==0x44){ //按键9:设置东西绿灯时间+ dxnum=dxgreen;
if(nbnum!=159){
dxnum++;
dxgreen=dxnum;
}
shi2=dxnum/10;
ge2=dxnum%10;
nbnum=dxgreen+dxyellow;//显示南北红灯时间
shi1=nbnum/10;
ge1=nbnum%10;
}
if(key==1&&P1==0x44){ //按键10:设置东西黄灯时间+
dxnum=dxyellow;
if(nbnum!=159){
dxnum++;
dxyellow=dxnum;
}
shi2=dxnum/10;
ge2=dxnum%10;
nbnum=dxgreen+dxyellow;//显示南北红灯时间
shi1=nbnum/10;
ge1=nbnum%10;
}
if(key==2&&P1==0x44&&dxgreen>3){ //按键11:设置东西绿灯时间- dxnum=dxgreen;
dxnum--;
dxgreen=dxnum;
shi2=dxnum/10;
ge2=dxnum%10;
nbnum=dxgreen+dxyellow;//显示南北红灯时间
shi1=nbnum/10;
ge1=nbnum%10;
}
if(key==3&&P1==0x44&&dxyellow>3){ //按键12:设置东西黄灯时间- dxnum=dxyellow;
dxnum--;
dxyellow=dxnum;
shi2=dxnum/10;
ge2=dxnum%10;
nbnum=dxgreen+dxyellow;//显示南北红灯时间
shi1=nbnum/10;
ge1=nbnum%10;
}
}
}。

相关文档
最新文档