基于某proteus地交通信号灯设计与仿真.docx
《基于某proteus地交通信号灯设计与仿真.docx》由会员分享,可在线阅读,更多相关《基于某proteus地交通信号灯设计与仿真.docx(14页珍藏版)》请在冰点文库上搜索。
![基于某proteus地交通信号灯设计与仿真.docx](https://file1.bingdoc.com/fileroot1/2023-6/7/a88f9a96-89ad-4ec1-a0da-d429bcde6e22/a88f9a96-89ad-4ec1-a0da-d429bcde6e221.gif)
基于某proteus地交通信号灯设计与仿真
宁波理工学院
专业综合课程实习
课程论文
题目基于proteus的交通信号灯设计与仿真
项目成员沈毅
专业班级电气101
指导教师裘君
分院信息
完成日期20013.7.14
基于proteus的交通信号灯设计与仿真
一、题目及要求
实现一个如下基本功能的交通灯:
按照常规我们假设一个十字路口为东西南北走向。
初始状态为状态1,南北方向绿灯通车,东西方向红灯。
经过一段时间(25S)转换状态2,南北方向绿灯闪几次转亮黄灯,延时5S,东西方向仍然红灯。
再转换到状态3,东西方向绿灯通车,南北方向红灯。
过一段时间(25S)转换到状态4,东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯。
最后循环至南北绿灯,东西红灯。
在这些状态下,有时钟倒数计时。
(35分)
附加功能得分(15分)
如按键、蜂鸣器等
1.1实验目的
●掌握MCS-51单片机定时器/计数器、外部中断、LED数码管显示及I/O口的综合应用。
●了解交通灯的工作原理及设计方法。
●掌握单片机应用系统分析、设计、调试方法。
1.2实验原理图
图1交通灯电路原理图
(1)
图2交通灯电路原理图
(2)
二、软件设置
图3软件仿真
三、硬件原理图
图4硬件模块
图5硬件连接
四、软件流程图
五、设计结果(仿真+实物)
5.1状态一
状态1:
南北方向绿灯通车,东西方向红灯。
经过一段时间(25S),倒计时。
图6状态一
5.2状态二
状态2,南北方向绿灯闪几次转亮黄灯,延时5S,东西方向仍然红灯。
图7状态二
5.2状态三
状态3,东西方向绿灯通车,南北方向红灯,过一段时间(25S)倒计时。
图8状态三
5.2状态四
状态4,东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯。
图9状态四
六、个人心得
通过keil与proteus和硬件的联合使用,对交通灯综合考虑,实现了红灯30s,绿灯25s,3s绿灯闪烁,2s黄灯亮的交通功能设计。
七、附件
#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;
}
}