微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机实现交通灯控制系统的双模式

单片机实现交通灯控制系统的双模式

时间:09-09 来源:互联网 点击:

发技术不断发展,从普遍使用汇编语言到逐渐使用高级语言,单片机的开发软件也在不断发展,Keil 软件是目前最流行开发MCS-51 系列单片机程序的软件。

Keil 提供了包括C 编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVison)将这些部分连在一起。

因此该系统的软件部分在Keil 环境下进行程序的编程,下面主要介绍程序中的主要子程序和一些重要部分:初始函数主要是对定时/计数器和一些参数初值的设定:

#include

#define uint unsigned int

#define uchar unsigned char

uint aa,num,MODEL1,numa,HMODE1;

uchar shi,ge,gtime,rtime;

… …

sbit dula=P1^0; // 段选

sbit wela=P1^1; // 位选

sbit LED1=P1^2; // 东西(红灯)

sbit LED2=P1^5; // 南北(红灯)

sbit LED3=P1^6; // 南北(黄灯)

sbit LED4=P1^3; // 东西(黄灯)

sbit LED5=P1^7; // 南北(绿灯)

sbit LED6=P1^4; // 东西(绿灯)

sbit KEY1=P3^5;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar table1[]={0xbf,0x7f};

void delay(uchar z) // 延时函数

{ uchar x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--); }

void init()

{ TMOD=0x01; // 选择方式一,16 位计数器

TH0=15536/256;

TL0=15536%256; // 定时器高、低位,置入初值

EA=1; // 中断允许总控制位

ET0=1; // 定时器0 中断允许控制位

TR0=1; // 定时器0 运行控制位

aa=0;

gtime=60;

rtime=40;

num=1;

numa=1;

MODEL1=1;

HMODE1=0;}

定时的函数及原理:

当单片机工作于定时状态时,定时/计数器对机器周期进行计数,每个机器周期包括12个振荡周期,以晶振频率为12MHZ 为例,则:

1 个机器周期=12/晶振频率=12/12000000=0.001ms定时时间为:TC=XTP。其中,TP 为机器周期,TC 为定时时间。

则应装入计数/定时器的初值为:

(注:M=2n , TP 为机器周期,TC 为定时时间)

对于方式1,一次最大的定时时间为:T=(216-0)×0.001=65.536ms ,为了便于计算,设定每次最大定时时间为50ms,计算应装入的初值:N = 65536 − 50000 = 15536

显示子函数:

通过单片机对锁存器进行位选,段选的控制,使数码管显示需要的数字。

void display(shi,ge)

{ dula=1;

P0=table[shi];

dula=0;

wela=1;

P0=table1[0];

wela=0;

delay(5);

P0=0xff; // 对数码管消影

dula=1;

P0=table[ge];

dula=0;

wela=1;

P0=table1[1];

wela=0;

delay(5);

P0=0xff;}

模式一函数:

void mod1()

{ if(num==1>ime>5) // 东西道红灯亮,南北道绿灯亮,最后5 秒切换成黄灯

{ LED5=0;

LED1=0; }

if(num==2) // 东西道绿灯亮,南北道红灯亮

{ LED2=0;

LED6=0;

LED5=1;

LED3=1;

LED1=1; }

if(num==1>ime==5) // 东西道红灯亮,南北道黄灯亮5 秒

{ LED5=1;

LED2=1;

LED3=0; }

shi=gtime/10;

ge=gtime%10;

if(aa==20) // 50ms×20=1s, 即过1s 数码管数字减1

{ aa=0;

gtime--; }

display(shi,ge);

if(gtime==0num!=2)

{ gtime=60;

num=2; }

if(gtime==0num==2)

{ num=1;

gtime=60;

LED2=1;

LED6=1; } }

模式二函数:

如同模式一,只是参数有变化。如将gtime=60 换成rtime=40;num=1 换成numa=1;仅此而已。

主函数:

void main()

{ init();

while(1)

/* 模式一,平常模式,红绿灯切换时间为60 秒*/

{ if(MODEL1==1||HMODE1==0) // 按键或红外控制切换模式

{ mod1(); }

/* 通过按键切换工作模式*/

if(KEY1==0)

{ delay(5); //按键消抖

while(KEY1==0)

{ MODEL1++;

rtime=40;

if(MODEL1==3)

{ MODEL1=1;

gtime=60; }

while(!KEY1); } }

… …

/*模式二,上下班高峰期模式。红绿灯切换时间为40 秒*/

if(MODEL1==2||HMODE1==1)

{ mod2(); }

} }

void timer0() interrupt 1

{ TH0=15536/256;

TL0=15536%256;

aa++; }

4 系统的仿真

结合软硬件,通过proteus 仿真,此系统可安全、可靠的运行。仿真图的部分截图如图5 所示。

图5 交通灯控制系统运行示意图

5 结论

该系统完全可以完成设计的要求。具有一定的实用价值,同时,该系统还有诸多开发前景,具备一定的扩展能力,如:根据图像识别,判断车辆数是否增加,以此来判断该运行哪种模式,有待进一步开发。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top