利用单片机控制3种颜色灯亮——简易的交通灯控制。

有谁比较精通的,帮我个忙,谢谢了!

  #include <reg51.h>
  #include <intrins.h>
  sbit wei=P2^7;
  sbit duang=P2^6;
  char a,b,c,d,t0,dx,nb,flag,flag1;
  int t;
  unsigned char code table[]={0x3F,0x06,0x5B,0x4F,0x66,
  0x6D,0x7D,0x07,0x7F,0x6F};
  void delay()
  {
  int x=300;
  while(x--);
  }
  void init(void)
  {
  dx=20;
  nb=20;
  a=2;
  b=0;
  c=2;
  d=0;
  P1=0xee;
  EA=1;
  TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  ET0=1;
  TR0=1;
  }
  void time() interrupt 1
  {
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  t++;t0++;
  if(t0==20)
  {
  t0=0;
  dx--;nb--;
  a=nb/10;b=nb%10;
  c=dx/10;d=dx%10;
  if(nb==0&&flag!=1&&flag!=2){flag=1;nb=4;}
  if(dx==0&&flag1!=1&&flag1!=2){dx=20;flag1=1;}
  if(nb==0&&flag==1){nb=20;flag=2;}
  if(dx==0&&flag1==1){dx=4;flag1=2;}
  if(nb==0&&flag==2){nb=20;flag=0;}
  if(dx==0&&flag1==2){dx=20;flag1=0;}
  }
  if(t==400)P1=0xf3;
  if(t==410)P1=0xf7;
  if(t==420)P1=0xf3;
  if(t==430)P1=0xf7;
  if(t==440)P1=0xf3;
  if(t==450)P1=0xf7;
  if(t==460)P1=0xf3;
  if(t==470)P1=0xf7;
  if(t==480)P1=0xf5;
  if(t==800)P1=0xdd;
  if(t==810)P1=0xfd;
  if(t==820)P1=0xdd;
  if(t==830)P1=0xfd;
  if(t==840)P1=0xdd;
  if(t==850)P1=0xfd;
  if(t==860)P1=0xdd;
  if(t==870)P1=0xfd;
  if(t==880){P1=0xee;t=0;}
  }
  void display(char a,char b,char c,char d)
  {
  wei=1;
  P0=0xfe;
  wei=0;
  P0=0xff;
  duang=1;
  P0=table[a];
  duang=0;
  P0=0xff;
  delay();

  wei=1;
  P0=0xfd;
  wei=0;
  P0=0xff;
  duang=1;
  P0=table[b];
  duang=0;
  P0=0xff;
  delay();

  wei=1;
  P0=0xfb;
  wei=0;
  P0=0xff;
  duang=1;
  P0=table[c];
  duang=0;
  P0=0xff;
  delay();

  wei=1;
  P0=0xf7;
  wei=0;
  P0=0xff;
  duang=1;
  P0=table[d];
  duang=0;
  P0=0xff;
  delay();
  }
  void main()
  {
  init();
  while(1)
  {
  display(a,b,c,d);
  }

  }
  这个灯和时间的显示是同步的,因为我是刚学单片机的,可能编得不是很好,因为今晚的网络原因,我上传不了图给你了,如果你要图的,可以到单片机群55932363里找我要,一起学习
温馨提示:答案为网友推荐,仅供参考
第2个回答  2010-04-20
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

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
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断
TR0=1;

P1=0xfc; //红灯亮
red =1;
while(1)
{
P0=Dis_Shiwei;//显示十位
P2=0;
delay(300); //短暂延时
P0=Dis_Gewei; //显示个位
P2=1;
delay(300);
}

}
/******************************************************************/
/* 定时器中断函数 */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
static unsigned char second=60,count; //初值99

TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second--;//秒减1
if(second==0)
{ //这里添加定时到0的代码 ,可以是灯电路,继电器吸合等,或者执行一个程序
if(red)
{
red=0;yellow=1;
second=5;
P1=0xF3;//黄灯亮5秒
}
else if(yellow && !turnred)
{
yellow=0;green=1;
second=50;
P1=0xCF;//绿灯亮50秒
}
else if(green)
{
yellow=1;green=0;
second=5;
P1=0xF3;//黄灯亮5秒
turnred=1;
}
else if(yellow && turnred)
{
red=1;yellow=0;
P1=0xFC;//红灯亮60秒
second=60;
turnred=0;
}

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

}
}
第3个回答  2010-04-27
我博客上有,你可以去参考
相似回答