单片机控制的交通灯控制系统设计.docx
- 文档编号:14751334
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:20
- 大小:278.28KB
单片机控制的交通灯控制系统设计.docx
《单片机控制的交通灯控制系统设计.docx》由会员分享,可在线阅读,更多相关《单片机控制的交通灯控制系统设计.docx(20页珍藏版)》请在冰点文库上搜索。
单片机控制的交通灯控制系统设计
单片机控制的交通灯控制系统设计
一.系统总体方案及硬件设计
1)南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道和支干道每次通行时间都设为30秒,时间可设置修改。
2)在绿灯转为红灯时,黄灯先亮3秒钟,才能变换运行车道;
3)黄灯亮时,每秒闪亮一次。
4)东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。
5)一道有车而另一道无车(实验时用开关K0和K1控制),交通灯控制系统能立即让有车道放行。
二.总体设计
三.硬件设计
1)单片机选型:
AT89C51
与8051单片机产品兼容、4K字节在系统可编程Flash存储器、10000次擦写周期、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器五个中断源、全双工UART串行通道
功能特性描述
At89C51是一种低功耗、高性能CMOS8位微控制器,具有4K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89C51具有以下标准功能:
4k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89C51可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
8位微控制器8K字节在系统可编程FlashAT89C51
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻
辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号第二功能
P1.0T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P1.5MOSI(在系统编程用)
P1.6MISO(在系统编程用)
P1.7SCK(在系统编程用)
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。
在flash编程和校验时,P3口也接收一些控制信号。
端口引脚第二功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2INTO(外中断0)
P3.3INT1(外中断1)
P3.4TO(定时/计数器0)
P3.5T1(定时/计数器1)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器读选通)
此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。
RST——复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。
ALE/PROG——当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。
此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。
FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
引脚结构图如下所示:
2)复位电路:
上电+按钮
复位电路原理图
当8051的ALE及/PSEN两引脚输出高电平,RST引脚高电平到时,单片机复位。
RST/VPD端的高电平,若直接由启动瞬间产生,则为启动复位,若通过按动按钮产生高电平复位称手动复位。
图中,上电时,接通电源,电容器C相当于瞬间短路,+5V加到了RST/VPD端,该高电平使8051全机复位。
若运行过程中,需要程序从头执行,只需按动按钮S,则直接把+5V加到了RST/VPD端,从而复位。
显然,该电路即可以上电复位,也可以手动复位,是常用复位电路之一。
3)晶振电路
晶振电路原理图
四.Proteus软件仿真
4.1正常运行仿真图
4.2南北强制通行仿真
4.3东西强制通行仿真图
五.程序附录:
#include
#include
#defineucharunsignedchar//宏定义
#defineuintunsignedint//宏定义
sbitRED_ZHU=P1^0;
sbitYELLOW_ZHU=P1^1;
sbitGREEN_ZHU=P1^2;
sbitRED_ZHI=P1^3;
sbitYELLOW_ZHI=P1^4;
sbitGREEN_ZHI=P1^5;
uintaa,bai,shi,ge,bb;
/*数码管显示0-9*/
uintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*子函数声明*/
voiddelay(uintz);
voiddelay0(uintz);
voiddisplay(uintge,uintshi);
voidxtimer0();
voidcheck();
voidinit1();
voidinit2();
voidinit3();
voidinit4();
voidinit5();
voidxint0();
voidxint1();
voidGREEN_ZHU_ON();
voidGREEN_ZHI_ON();
/*********************************************************
主函数
*********************************************************/
voidmain()
{
EA=1;//开中断
EX0=1;//允许外部中断INT0中断
IT0=0;//定义INT0触发方式
PX0=1;//中断优先级高
EX1=1;//允许外部中断INT1中断
IT1=0;//定义INT1触发方式
PX1=1;//中断优先级高
check();//开机自检
init1();//第1个状态
while
(1)
{
init2();//第2个状态
init3();//第3个状态
init4();//第4个状态
init5();//第5个状态
}
}
voidinit1()//第一个状态:
主干道、支干道均亮红灯5S
{
inttemp;
temp=6;//变量赋初值
TMOD=0x01;//定时器T0工作于方式1
TH0=0x4c;
TL0=0x00;//定时器赋初值
EA=1;//开中断
ET0=1;//开定时中断
TR0=1;//开定时器T0
while
(1)
{
RED_ZHU=0;
RED_ZHI=0;
GREEN_ZHU=1;
GREEN_ZHI=1;
YELLOW_ZHU=1;
YELLOW_ZHI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自减
if(temp<0)
{
break;
}
shi=temp%100/10;//显示十位
ge=temp%10;//显示个位
}
display(ge,shi);
}
}
voidinit2()//第二个状态:
主干道亮绿灯27S、支干道亮红灯
{
inttemp;
temp=31;//变量赋初值
TMOD=0x01;//定时器T0工作于方式1
TH0=0x4c;
TL0=0x00;//定时器赋初值
EA=1;//开中断
ET0=1;//开定时中断
TR0=1;//开定时器T0
while
(1)
{
RED_ZHU=1;
RED_ZHI=0;
GREEN_ZHU=0;
GREEN_ZHI=1;
YELLOW_ZHU=1;
YELLOW_ZHI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自减
if(temp==3)
{
break;
}
shi=temp%100/10;//显示十位
ge=temp%10;//显示个位
}
display(ge,shi);
}
}
voidinit3()//第三个状态:
主干道黄灯闪烁、支干道红灯闪烁
{
inttemp;
temp=4;//变量赋初值
TMOD=0x01;//定时器T0工作于方式1
TH0=0x4c;
TL0=0x00;//定时器赋初值
EA=1;//开中断
ET0=1;//开定时中断
TR0=1;//开定时器T0
while
(1)
{
GREEN_ZHU=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自减
YELLOW_ZHU=~YELLOW_ZHU;
RED_ZHI=~RED_ZHI;
if(temp<0)
{
break;
}
shi=temp%100/10;//显示十位
ge=temp%10;//显示个位
}
display(ge,shi);;
}
}
voidinit4()//第四个状态:
主干道亮红灯、支干道亮绿灯22S
{
inttemp;
temp=26;//变量赋初值
TMOD=0x01;//定时器T0工作于方式1
TH0=0x4c;
TL0=0x00;//定时器赋初值
EA=1;//开中断
ET0=1;//开定时中断
TR0=1;//开定时器T0
while
(1)
{
RED_ZHU=0;
RED_ZHI=1;
YELLOW_ZHU=1;
GREEN_ZHI=0;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自减
if(temp==3)
{
break;
}
shi=temp%100/10;//显示十位
ge=temp%10;//显示个位
}
display(ge,shi);
}
}
voidinit5()//第五个状态:
主干道红灯闪烁、支干道黄灯闪烁
{
inttemp;
temp=4;//变量赋初值
TMOD=0x01;//定时器T0工作于方式1
TH0=0x4c;
TL0=0x00;//定时器赋初值
EA=1;//开中断
ET0=1;//开定时中断
TR0=1;//开定时器T0
while
(1)
{
RED_ZHI=1;
GREEN_ZHU=1;
GREEN_ZHI=1;
if(aa==20)//定时20*50MS=1S
{
aa=0;//定时完成一次后清0
temp--;//变量自减
YELLOW_ZHI=~YELLOW_ZHI;
RED_ZHU=~RED_ZHU;
if(temp<0)
{
break;
}
shi=temp%100/10;//显示十位
ge=temp%10;//显示个位
}
display(ge,shi);
}
}
/*显示子函数*/
voiddisplay(uintge,uintshi)
{
P0=0xfd;
P2=table[shi];//显示十位
delay0(5);
P0=0xfe;
P2=table[ge];//显示个位
delay0(5);
}
voidxint0()interrupt0//外部中断INT0
{
GREEN_ZHU_ON();
}
voidxint1()interrupt2//外部中断INT1
{
GREEN_ZHI_ON();
}
voidGREEN_ZHU_ON()//外部中断INT0显示子程序
{
RED_ZHI=0;
RED_ZHU=1;
GREEN_ZHI=1;
GREEN_ZHU=0;
YELLOW_ZHI=1;
YELLOW_ZHU=1;
P0=0x00;
P2=0Xff;
delay0(1000);
return;
}
voidGREEN_ZHI_ON()//外部中断INT1显示子程序
{
RED_ZHI=1;
RED_ZHU=0;
GREEN_ZHI=0;
GREEN_ZHU=1;
YELLOW_ZHI=1;
YELLOW_ZHU=1;
P0=0x00;
P2=0xff;
delay0(1000);
return;
}
voidcheck()//开机自检子程序
{
RED_ZHI=0;
RED_ZHU=0;
GREEN_ZHI=0;
GREEN_ZHU=0;
YELLOW_ZHI=0;
YELLOW_ZHU=0;
P0=0x00;
P2=0Xff;
delay
(2);
RED_ZHI=1;
RED_ZHU=1;
GREEN_ZHI=1;
GREEN_ZHU=1;
YELLOW_ZHI=1;
YELLOW_ZHU=1;
P0=0xff;
P2=0xff;
}
/*定时中断子函数*/
voidxtimer0()interrupt1
{
TH0=0x4c;
TL0=0x00;
aa++;
}
/*延时子函数*/
voiddelay0(uintz)
{
uinti,j;
for(i=0;i for(j=0;j<110;j++); } /********************************************************* 500ms延时函数 晶振: 11.0592MHz *********************************************************/ voiddelay(ucharj) { uchark; uinti; for(;j>0;j--) { for(i=1250;i>0;i--) { for(k=180;k>0;k--); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 控制 交通灯 控制系统 设计