如何用单片机制作交通灯

如题所述

  LED模拟交通灯

  本例中的12只LED分成东西向和南北向两组,各组指示灯均有相向的2只红色、2只黄色与2只绿色的LED,本例中对应的LED单独进行定义,程序运行时模拟了十字路口交通信号灯得切换过程与显示效果。
  本例电路如下图:
  (呵呵 图片插入不进来)
  程序设计调试与实训:
  源程序中用6行sbit对东西和南北向的红、黄、绿指示灯分别进行定义,这样便于对它们进行单独控制。
  本例交通指示灯切换时间设置的较短,这样可在调试的时候较快观察到运行效果,可在调试运行本例后修改代码,使指示灯切换过程更接近于实际的交通指示灯切换过程。

  源程序代码:
  //----------------------------------------------------------------
  // 名称:LED模拟交通灯
  //----------------------------------------------------------------
  // 说明:东西向绿灯亮若干秒后,黄灯闪烁5次后亮红灯,红灯亮后,
  // 南北向由红灯变为绿灯,若干秒后,南北向黄灯闪烁,
  // 闪烁5次后亮红灯,东西向绿灯亮,如此重复。
  //
  //-----------------------------------------------------------------
  #include <reg52.h>
  #define uchar unsigned char
  #define uint unsigned int

  sbit RED_A=P0^0; //东西向指示灯
  sbit YELLOW_A=P0^1;
  sbit GREEN_A=P0^2;
  sbit RED_B=P0^3; //南北向指示灯
  sbit YELLOW_B=P0^4;
  sbit GREEN_B=P0^5;

  uchar Flash_Count = 0;
  Operation_Type = 1; //闪烁次数及操作类型变量
  //--------------------------------------------------------
  //延时
  //--------------------------------------------------------
  void DelayMS(uint x)
  {
  uchar t;
  while(x--)
  {
  for(t=120;t>0;t--);
  }
  }

  //---------------------------------------------------------
  //交通灯交换子程序
  //---------------------------------------------------------
  void Traffic_lignt()
  {
  switch(Operation_Type)
  {
  case 1: //东西向绿灯与南北向红灯亮
  RED_A=1;YELLOW_A=1;GREEN_A=0;
  RED_B=0;YELLOW_B=1;GREEN_B=1;
  DelayMS(2000); // 延时
  Operation_Type = 2; //下一操作
  break;
  case 2: //东西向黄灯开始闪烁,绿灯关闭
  DelayMS(300); //延时
  YELLOW_A=!YELLOW_A; //闪烁5次
  if(++Flash_Count !=10)
  return;
  Flash_Count=0;
  Operation_Type = 3; //下一操作
  break;
  case 3: //东西向红灯与南北向绿灯亮
  RED_A=0;YELLOW_A=1;GREEN_A=1;
  RED_B=1;YELLOW_B=1;GREEN_B=0;
  DelayMS(2000); //延时
  Operation_Type = 4; //下一操作
  break;
  case 4: //南北向黄灯开始闪烁
  DelayMS(300); //延时
  YELLOW_B=!YELLOW_B;
  if(++Flash_Count !=10)
  return; //闪烁5次
  Flash_Count=0;
  Operation_Type = 1; //回到第一种操作
  break;
  }
  }

  //----------------------------------------------------------
  //主程序
  //----------------------------------------------------------
  void main()
  {
  while(1)
  {
  Traffic_lignt();
  }
  }

参考资料:单片机C语言程序设计实训100例

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-10
#include<reg51.h>
void delay0_5s()
{
unsigned char i;
for(i=0;i<0x0a;i++)
{
TH0=0x3c;
TL0=0xb0;
TR0=1;
while(!TF0);
TF0=0;}}
void delay_t(unsigned char t)
{
unsigned char i;
for(i=0;i<t;i++)delay0_5s();}
void int_0() interrupt 0
{while(1){
P1=0xe7;P0=0xd7;delay_t(30);
P1=0xeb;P0=0xe7;delay_t(6);
P1=0xbd;P0=0xf3;delay_t(30);
P1=0xdd;P0=0xf5;delay_t(3);}}
void main()
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=1;
PX1=0;
TMOD=0x01;
while(1){
P1=0xff;P0=0xff;delay_t(2);
P1=0xdb;P0=0xed;delay_t(2);}}
相似回答