单片机实现交通灯控制系统的双模式
发技术不断发展,从普遍使用汇编语言到逐渐使用高级语言,单片机的开发软件也在不断发展,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 结论
该系统完全可以完成设计的要求。具有一定的实用价值,同时,该系统还有诸多开发前景,具备一定的扩展能力,如:根据图像识别,判断车辆数是否增加,以此来判断该运行哪种模式,有待进一步开发。
- 如何缩短嵌入式系统开发之路(04-14)
- 对Linux内核中进程上下文和中断上下文的理解(04-27)
- 嵌入式应用中的四类1-Wire主机电路设计(08-03)
- 基于C/S架构的通用计算机在线考试系统的实现(08-12)
- 嵌入式WEB服务器在太阳能发电站监测系统中的设计应用(09-08)
- 嵌入式系统教学模式探讨(06-06)