基于proteus交通信号灯设计与仿真(1)
时间:2020-11-10 04:36:50 来源:勤学考试网 本文已影响 人
学 海 无 涯
PAGE
PAGE 1
宁波理工学院
专业综合课程实习
课程论文
题 目 基于proteus的交通信号灯设计与仿真
项目成员 沈 毅
专业班级 电气101
指导教师 裘 君
分 院 信 息
完成日期 20013. 7.14
目 录
一、 题目及要求 4
1.1 实验目的 4
1.2 实验原理图 4
二、软件设置 5
三、硬件原理图 6
四、软件流程图 7
五、设计结果(仿真+实物) 8
5.1状态一 8
5.2状态二 8
5.2状态三 9
5.2状态四 10
六、个人心得 10
七、附件 10
基于proteus的交通信号灯设计与仿真
题目及要求
实现一个如下基本功能的交通灯:按照常规我们假设一个十字路口为东西南北走向。初始状态为状态1,南北方向绿灯通车,东西方向红灯。经过一段时间(25S)转换状态2,南北方向绿灯闪几次转亮黄灯,延时5S,东西方向仍然红灯。再转换到状态3,东西方向绿灯通车,南北方向红灯。过一段时间(25S)转换到状态4,东西方向绿灯闪几次转亮黄等,延时5S,南北方向仍然红灯。最后循环至南北绿灯,东西红灯。在这些状态下,有时钟倒数计时。(35分)
附加功能得分(15分)
如按键、蜂鸣器等
实验目的
掌握MCS-51单片机定时器/计数器、外部中断、LED数码管显示及I/O口的综合应用。
了解交通灯的工作原理及设计方法。
掌握单片机应用系统分析、设计、调试方法。
实验原理图
图1 交通灯电路原理图(1)
图2交通灯电路原理图(2)
软件设置
图3 软件仿真
硬件原理图
图4 硬件模块
图5硬件连接
软件流程图
开始
开始
初始化
初始化
中断初始化
中断初始化
中断触发
Y状态一0<N
Y
状态一
0<N<=25
1s中断
1s中断
N
N
N
Number+1
状态二Y25
状态二
Y
25<N<=30
NNN>60
N
N
N>60
状态三YYY30<N<=55
状态三
Y
Y
Y
30<N<=55
N状态四YN=1N55<N<=60
N
状态四
Y
N=1
N
55<N<=60
设计结果(仿真+实物)
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<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//uint FUNC = 1 ; //0:数码管功能, 1:红绿灯功能
uint T_Count= 0;
uint number=0;
uint a=0,a1=0,a2=0;
uint b=0,b1=0,b2=0;
sbit LED=P1^0;
int LEDSHOW[10] = {0xC0,0xF9,0xA4,0xB0,0X99,0X92,0X82,0XF8,0X80,0x90};
//#define LED P1^0
//延时
void DelayMS(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
//主程序
void main()
{
//定时器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; / //南北1
P0 = LEDSHOW[a1];
DelayMS(5);
P2 = 0X02; / //南北2
P0 = LEDSHOW[a2];
DelayMS(5);
P2 = 0X04; / //东西1
P0 = LEDSHOW[b1];
DelayMS(5);
P2 = 0X08; / //东西2
P0 = LEDSHOW[b2];
DelayMS(5);
}
if(number>25&&number<=30)//状态2
{ //南北绿闪烁几次转黄灯,东西继续红灯 东西 红黄绿 南北 红黄绿
if(number>25&&number<=28)
{
if(number%2==1)
P1=0xde;
else P1=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;
else P1=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 中断函数
void LED_Flash() interrupt 1
{
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;
}
}