基于proteus的交通灯控制系统分析.docx
《基于proteus的交通灯控制系统分析.docx》由会员分享,可在线阅读,更多相关《基于proteus的交通灯控制系统分析.docx(17页珍藏版)》请在冰豆网上搜索。
基于proteus的交通灯控制系统分析
基于proteus的交通灯控制系统分析
第1章红绿灯的设计与电脑仿真
1.1实验原理图
图2.1交通原理图
1.2软件设计
1.2.1keiluvision4软件初始化
由于KEIL必须要新建一个项目才可以进行C51单片机编程操作,因此以下进行初始化操作。
1.新建project
图2新建project
2.保存工程:
新建立一个文件夹,输入工程名称。
例如LED_DEMO
图3建立一个文件夹
3.选择CPU:
ATMEL->AT89C52
4.建立main.c
图4新建工程
5.选中SourceGroup1,鼠标右击,选择AddFiletoGroup“SourceGroup1”
6.选择main.c工程文件列表框出现main.c,则表示成功,便可在程序框里填写程序。
7.设置生成HEX文件,最后烧入程序与硬件相配合实现交通灯功能。
1.2.2keilc与proteus联调
1.在proteus里画好下图:
图5proteus仿真原理图
2.双击proteus里的单片机出现下图:
图6添加可执行HEX文件
选择刚刚用keil编译后的HEX文件,点击运行按钮发光管一闪一闪。
然后用记事本打开keil目录下的tools.ini,在[C51]栏目下加入TDRV9=BIN\VDM51.DLL("ProteusVSMMonitor-51Driver"),在keil软件里的"optionsfortarget"target1→Debug"选项里选中右边的use,在下拉菜单中选择proteusvsmsimulator。
最后在proteus的debug菜单中选中useremotedebugmonitor即可实现联调。
第2章硬件原理
2.1硬件原理图
图7硬件模块
图8硬件连接
以STC89C52单片机为控制核心,设计交通灯的控制系统.在该系统中STC89C52和外围电路的各个模块进行信息交流并且进行相应的控制。
该系统由时钟电路、复位电路、控制系统电路、LED交通灯显示电路、七段数码管显示时间电路、自动和手动按键控制电路等组成.主控制器采用STC89C52单片机.P1口设置红、绿灯点亮和黄灯闪烁的功能,P0、P2口来显示时间,P3口设置系统工作模式.用发光二极管实现交通灯的红绿黄灯,时间的显示则采用七段数码管实现。
2.2系统软件电路的设计
(1)LED交通灯显示模块
89C52单片机P1口对LED交通灯进行控制,在不同的状态时控制相应的LED交通灯状态。
(2)数码管显示模块
89C52单片机P0口进行时间倒计时段选,P2.0~P2.3端口进行数码管时间显示位选,用T2中断定时每2ms对七段数码管刷新一次。
(3)键盘控制模块
89C52单片机P3.0~P3.3口与P3.6口外部键盘控制交通灯自动和手动状态及手动控制时的不同状态进行实时扫描,进入相应的运行状态。
2.3硬件介绍
交通灯控制器实例主要使用了89C51单片机的定时器/计数器,基础知识主要包括交通灯的变化规律、定时器/计数器的概念、定时器/计数器的相关寄存器、定时器/计数器的4种工作方式、以及定时器/计数器的变成。
定时器/计数器,定时器/计数器是单片机中最常用、最重要的功能模块之一,本节通过交通灯控制器实例来演示定时器的使用,并复习如何使用散转程序。
首先介绍交通灯以及定时器/计数器的基础知识,接着介绍本实例的硬件电路构成,然后逐步分析定时器的变成以及程序的全貌,最后总结一下本实例的技巧与注意点。
第3章设计结果
3.1软件流程图
状态一持续25秒
状态二持续5秒
状态三延时25秒
状态4延时5秒
图9实验效果图
占用端口少,耗电也最小。
系统电源采用独立的+5V稳压电源,有各种成熟电路可供选用,使此方案可靠稳定。
该设计可直接在I/O口上接按键开关,精简并优化了电路。
结合实际情况,显示界面采用LED提示和数码管计时的方法,满足了倒计时的时间显示输出和状态灯提示信息输出的要求,减少系统的复杂度。
开机上电便处于正常运行状态,南北方向通行25秒后变为南北方向黄灯5秒东西方向红灯30秒,东西方向通行25秒后变为东西方向黄灯5秒南北方向红灯30秒。
如此60秒循环一次,使得东西方向和南北方向交替通行。
3.2仿真结果
状态一
状态1:
南北方向绿灯通车,东西方向红灯。
经过一段时间(25S),倒计时。
图10状态一
状态二
状态2,南北方向绿灯闪几次转亮黄灯,延时5S,东西方向仍然红灯。
图11状态二
状态三
状态3,东西方向绿灯通车,南北方向红灯,过一段时间(25S)倒计时。
图12状态三
状态四
状态4,东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯。
图13状态四
3.3系统工作模式
本系统启动为自动控制模式.最初为南北直行方向导通即直行为绿灯,其余为红灯,并且数码管从25s开始倒计时,当倒计时至5s时黄灯开始闪烁(1s完成闪烁一次),闪烁3s后,即倒计时至2s时,南北方向左转和右转变为绿灯,直行为红灯;当倒计时至0s时,路口进入禁行等待状态,即绿灯全部熄灭红灯点亮,并且数码管从3s开始倒计时,同时黄灯开始闪烁3s;当倒计时再次为0s,黄灯闪烁完毕后,南北方向数码管从30s开始倒计时,同时东西直行方向导通即为绿灯,其余为红灯,并且数码管从25s开始倒计时,当倒计时至5s时黄灯开始闪烁(1s完成闪烁一次),闪烁3s后,即倒计时至2s时,东西方向左转和右转变为绿灯,直行为红灯;当倒计时至0s时,路口进入禁行等待状态,即绿灯全部熄灭红灯点亮,并且数码管从3s开始倒计时,同时黄灯开始闪烁3s;当倒计时再次为0s,黄灯闪烁完毕后。
第4章代码
#include
#defineucharunsignedchar
#defineuintunsignedint
//uintFUNC=1;//0:
数码管功能,1:
红绿灯功能
uintT_Count=0;
uintnumber=0;
uinta=0,a1=0,a2=0;
uintb=0,b1=0,b2=0;
sbitLED=P1^0;
intLEDSHOW[10]={0xC0,0xF9,0xA4,0xB0,0X99,0X92,0X82,0XF8,0X80,0x90};
//#defineLEDP1^0
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
voidmain()
{
//定时器0中断初始化代码
TMOD=0x00;//定时器0工作方式0
TH0=(8192-5000)/32;//5ms定时
TL0=(8192-5000)%32;
IE=0x82;//允许T0中断
TR0=1;
//开始循环
while
(1)
{
if(number<=25&&number>0)//状态一
{
//南北绿灯,东西红灯东西红黄绿南北红黄绿
P1=0xde;
//显示倒计时
b=30-number+1;
b1=b/10;
b2=b%10;
a=25-number+1;
a1=a/10;
a2=a%10;
P2=0X01;//00001110//南北1
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X02;//00001101//南北2
P0=LEDSHOW[a2];
DelayMS(5);
P2=0X04;//00001011//东西1
P0=LEDSHOW[b1];
DelayMS(5);
P2=0X08;//00000111//东西2
P0=LEDSHOW[b2];
DelayMS(5);
}
if(number>25&&number<=30)//状态2
{//南北绿闪烁几次转黄灯,东西继续红灯东西红黄绿南北红黄绿
if(number>25&&number<=28)
{
if(number%2==1)
P1=0xde;
elseP1=0xfe;}
if(number>28&&number<=30)
P1=0Xee;
a=30-number+1;//显示
a1=a/10;
a2=a%10;
P2=0X01;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X02;
P0=LEDSHOW[a2];
DelayMS(5);
P2=0X04;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X08;
P0=LEDSHOW[a2];
DelayMS(5);
}
if(number>30&&number<=55)//状态3
{//东西绿南北红
P1=0xf3;//东西红黄绿南北红黄绿
a=55-number+1;//显示
a1=a/10;
a2=a%10;
b=60-number+1;
b1=b/10;
b2=b%10;
P2=0X01;
P0=LEDSHOW[b1];
DelayMS(5);
P2=0X02;
P0=LEDSHOW[b2];
DelayMS(5);
P2=0X04;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X08;
P0=LEDSHOW[a2];
DelayMS(5);
}
if(number>55&&number<=60)//状态4
{//东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯东西红黄绿南北红黄绿
if(number>55&&number<=58)
{
if(number%2==1)
P1=0xf3;
elseP1=0xf7;}
if(number>58&&number<60)
P1=0Xf5;
a=60-number+1;//显示
a1=a/10;
a2=a%10;
P2=0X01;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X02;
P0=LEDSHOW[a2];
DelayMS(5);
P2=0X04;
P0=LEDSHOW[a1];
DelayMS(5);
P2=0X08;
P0=LEDSHOW[a2];
DelayMS(5);
}
}
}
//T0中断函数
voidLED_Flash()interrupt1
{
TH0=(8192-5000)/32;//恢复初值
TL0=(8192-5000)%32;
if(++T_Count==200)//1s开关一次LED
{
number++;
if(number>60)
number=1;
//FUNC=++FUNC%2;
//LED=~LED;
T_Count=0;
}