51单片机用C语言实现交通灯(红绿灯)源程序

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

51单片机用C语言实现交通灯(红绿灯)源程序

2009-10-29 23:00

交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改。源程序如下:

/*

1、程序目的:使用定时器学习倒计时红绿灯原理主要程序和倒计时一样

2、硬件要求:数码管、晶振12M

*/

#include

bit red,green,yellow,turnred; //定义红、黄、绿及转红标志

code unsigned char tab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//共阴数码管 0-9

unsigned char Dis_Shiwei;//定义十位

unsigned char Dis_Gewei; //定义个位

void delay(unsigned int cnt) //用于动态扫描数码管的延时程序{

while(--cnt);

}

main()

{

TMOD |=0x01;//定时器设置 10ms in 12M crystal定时器0,工作方式1,16位定时器

TH0=0xd8; //65535-10000=55535=D8F0(十六进制)

TL0=0xf0;

IE= 0x82; //中断控制,EA=1开总中断,ET0=1:定时器0中断允许

TR0=1; //开定时器0中断

P1=0xfc;//红灯亮,根据红黄绿接灯的顺序。

red =1;

while(1)

{

P0=Dis_Shiwei;//显示十位,这里实现用8位数码管,即左1位

P2=0;

delay(300);//短暂延时

P0=Dis_Gewei; //显示个位,左数,2位

P2=1;

delay(300);

}

}

/********************************/

/* 定时中断 */

/********************************/

void tim(void) interrupt 1 using 1

{

static unsigned char second=60,count; //初值60

TH0=0xd8;//重新赋值,10毫秒定时

TL0=0xf0;

count++;

if (count==100)

{

count=0;

second--;//秒减1

if(second==0)

{ //这里添加定时到0的代码,可以是灯电路,继电器吸合等,或者执行一个程序 if(red) //红灭,先转黄

{

red=0;yellow=1;

second=4;

P1=0xF3;//黄灯亮4秒,黄灯为过渡灯,再根据情况转绿或转红

}

else if(yellow && !turnred)

{

yellow=0;green=1;

second=25;

P1=0xCF;//绿灯亮25秒,

}

else if(green)

{

yellow=1;green=0;

second=4;

P1=0xF3;//黄灯亮4秒

turnred=1;

}

else if(yellow && turnred) //绿灯灭,转黄灯,后红灯,turnred=1时

{

red=1;yellow=0;

P1=0xFC;//红灯亮60秒

second=60;

turnred=0; //接下来是转黄,绿。

}

}

Dis_Shiwei=tab[second/10];//十位显示值处理 Dis_Gewei=tab[second%10]; //个位显示处理

相关文档
最新文档