基于51单片机的交通灯控制电路设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的交通灯控制电路设计

交通灯

一、功能要求

要求甲车道和乙车道两条交叉道路上的车辆交替运行,每次通行时间都设为25秒,黄灯先亮5秒钟,才能变换运行车道;黄灯亮时,要求每秒钟闪亮一次。

二、电路图

说明:1)每一位数码管位选要分开,对应IO口参照程序中红色部分

2)图示数码管为共阳,没加驱动数码管显示较暗,建议加驱动

三、程序

//TrafficLight.c

#include"reg52.h"

//IO口定义

sbit red_1 =P2^0;//南北方向

sbit red_2 =P2^3;//东西方向

sbit yellow_1 =P2^1;

sbit yellow_2 =P2^4;

sbit green_1 =P2^2;

sbit green_2 =P2^5;

sbit com1_1 =P3^6;//十位南北方向数码管位选

sbit com1_2 =P3^7;//个位南北方向

sbit com2_1 =P3^4;//十位东西方向

sbit com2_2 =P3^5;//个位东西方向

//全局变量

char time=30;//倒计时

unsigned char num1=0,num2=0;//辅助计时unsigned char flag1=0,flag2=0;//黄灯闪标志位unsigned char shi1,shi2,ge1,ge2;//数码管十位个位

const unsigned char ledNum[] =

{// 0 1 2 3 4 5 6 7 8 9 A b c d E F 不显示- o(18)H(19)h(20)C(21)0(22)n(23)

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x8 0,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0x bf,0xa3,0x89,0x8b,0xc6,0xc0,0xab

}; //共阳数码管

//中断优先级别T0>T1,数码管显示中断间隔2ms,计时时间间隔50ms

//计时要求比较精确,间隔长,不应该被打断,故中断优先级要高,使用T0

//数码管中断可以被打断,打断时间较短,不会影响显示,使用T1

//在交通灯中,计时和数码管显示一直进行,故定时器开启后不用停止

void InitInter(void)

{

TMOD=0x11;//设置定时器工作方式为16位计时器

TH0=(65535-45872)/256;//11.0592M晶振,50ms

TL0=(65535-45872)%256;

TH1=(65535-1835)/256;//11.0592M晶振,2ms TL1=(65535-1835)%256;

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=1;

}

void Display(void)

{

static unsigned char i=1;

switch(i)

{

case 1:

com2_2=0;

P0=ledNum[shi1];

com1_1=1;

break;

case 2:

com1_1=0;

P0=ledNum[ge1];

com1_2=1;

break;

case 3:

com1_2=0;

P0=ledNum[shi2];

com2_1=1;

break;

case 4:

com2_1=0;

P0=ledNum[ge2];

com2_2=1;

break; default: ;

}

i++;

if(i>4)i=1;

}

//红灯可以直接变成绿灯,但绿灯必须先变成黄灯再变红灯

void main(void)

{

bit i=0;

InitInter();

while(1)

{

red_1=0;//0为亮

red_2=1;

green_2=0;

time=30;

while(time>5)

{

shi1=time/10;

ge1=time%10;

shi2=(time-5)/10;

ge2=(time-5)%10;

}

green_2=1;

yellow_2=0;

flag2=1;

num2=0;

while(time>0)

{

shi1=time/10;

ge1=time%10; shi2=time/10;

ge2=time%10; }

flag2=0;

yellow_2=1;

red_2=0;

red_1=1;

green_1=0;

time=30;

while(time>5)

{

shi2=time/10;

ge2=time%10; shi1=(time-5)/10;

ge1=(time-5)%10;

}

green_1=1;

yellow_1=0;

flag1=1;

num2=0;

while(time>0)

{

shi2=time/10;

ge2=time%10;

shi1=time/10;

ge1=time%10;

}

flag1=0;

yellow_1=1;

//red_1=0;

//green_2=0;

}

}

void Timer_0(void) interrupt 1//计时{

TH0=(65535-45872)/256;

相关文档
最新文档