单片机控制交通灯

如题所述

第1个回答  2010-12-02
  LED EQU P2
  ORG 0000H
  LJMP START
  ORG 0030H
  START: MOV SP,#60H
  LCALL S0 ;初始状态(都是红灯)
  LCALL S1 ;南北绿灯,东西红灯
  LCALL S2 ;南北绿灯闪转黄灯,东西红灯
  LCALL S3 ;南北红灯,东西绿灯
  LCALL S4 ;南北红灯,东西绿灯闪转黄灯
  LJMP START
  S0: MOV A,#00100001B ;南北红灯,东西红灯
  MOV LED,A
  MOV R2,#10 ;延时1m秒
  LCALL DELAY
  RET
  S1: MOV A,#10000001B ;南北绿灯,东西红灯
  MOV LED,A
  MOV R2,#50 ;延时5秒
  LCALL DELAY
  RET
  S2: MOV R3,#03H ;南北绿灯闪3次
  FLASH: MOV A,#00000001B ;南北绿灯灭,东西红灯亮
  MOV LED,A
  MOV R2,#03H
  LCALL DELAY
  MOV A,#10000001B ;南北黄灯,东西红灯
  MOV LED,A
  MOV R2,#03H
  LCALL DELAY
  DJNZ R3,FLASH
  MOV A,#01000001B
  MOV LED,A
  MOV R2,#10 ;延时1秒
  LCALL DELAY
  RET
  S3: MOV A,#00100100B ;南北红灯,东西绿灯
  MOV LED,A
  MOV R2,#50 ;延时5秒
  LCALL DELAY
  RET
  S4: MOV R3,#03H ;东西绿灯闪3次
  FLASH1: MOV A,#00100000B ;南北红灯亮,东西绿灯灭
  MOV LED,A
  MOV R2,#03H
  LCALL DELAY
  MOV A,#00100100B ;南北红灯亮,东西绿灯亮
  MOV LED,A
  MOV R2,#03H
  LCALL DELAY
  DJNZ R3,FLASH1
  MOV A,#00100010B ;南北红灯,东西黄灯
  MOV LED,A
  MOV R2,#10 ;延时1秒
  LCALL DELAY
  RET
  DELAY: PUSH 02H ;延时子程序
  PUSH 01H
  PUSH 00H
  DELAY1: MOV R1,#00H
  DELAY2: MOV R0,#0C2H
  DJNZ R0,$
  DJNZ R1,DELAY2 ;延时100ms
  DJNZ R2,DELAY1
  POP 00H
  POP 01H
  POP 02H
  RET
  END

  C51参考程序:
  /* 交通灯实验 */
  //====================声明区========================
  #include<reg51.h> // 定义8051暂存器之标头档
  #define LED P2 //定义指示灯
  void s1(void); //南北绿灯,东西红灯,延时5秒
  void s2(void); //南北绿灯闪5次,南北绿灯灭,南北黄灯亮,延时1秒
  void s3(void); //南北红灯,东西绿灯,延时5秒
  void s4(void); //东西绿灯闪5次,东西绿灯灭,东西黄灯亮,延时1秒
  void delay1ms(int x); //延迟函数声明
  //======================主程序==============================
  main() // 主程序开始
  {
  int i;
  LED=0x21; //初始状态00100001b(都是红灯)
  delay1ms(100); //延时
  while(1)
  {
  for(i=1;i<5;i++)
  {
  switch(i)
  {
  case 1:s1();break; //南北绿灯,东西红灯,延时5秒
  case 2:s2();break; //南北绿灯闪5次,南北绿灯灭,南北黄灯亮,延时1秒
  case 3:s3();break; //南北红灯,东西绿灯,延时5秒
  case 4:s4();break; //东西绿灯闪5次,东西绿灯灭,东西黄灯亮,延时1秒
  }
  }
  }
  } // 主程序结束
  // ================ 南北绿灯,东西红灯,延时5秒函数==============
  void s1(void) //南北绿灯,东西红灯,延时5秒
  {
  LED=0x81; // 南北绿灯,东西红灯(10000001b)
  delay1ms(5000); //延时5秒
  }
  // =========== 南北绿灯闪5次,南北绿灯灭,南北黄灯亮,延时1秒函数 =========
  void s2(void) //南北绿灯闪5次,南北绿灯灭,南北黄灯亮,延时1秒
  {
  int i;
  for(i=0;i<5;i++)
  {
  LED=0x01; //南北绿灯灭,东西红灯亮(00000001b)
  delay1ms(200); //延时20毫秒
  LED=0x81; //南北绿灯亮,东西红灯亮(10000001b)
  delay1ms(200); //延时20毫秒
  }
  LED=0x41; //南北黄灯,东西红灯(01000001b)
  delay1ms(1000); //延时1秒
  }
  // ==============南北红灯,东西绿灯,延时5秒函数================
  void s3(void) //南北红灯,东西绿灯,延时5秒
  {
  LED=0x24; //南北红灯,东西绿灯(00100100b)
  delay1ms(5000); //延时5秒
  }
  // ========== 东西绿灯闪5次,东西绿灯灭,东西黄灯亮,延时1秒函数 =========
  void s4(void) // 东西绿灯闪5次,东西绿灯灭,东西黄灯亮,延时1秒
  {
  int i;
  for(i=0;i<5;i++)
  {
  LED=0x20; //南北红灯亮,东西绿灯灭(00100000b)
  delay1ms(200); //延时20毫秒
  LED=0x24; //南北红灯亮,东西绿灯亮(00100100b)
  delay1ms(200); //延时20毫秒
  }
  LED=0x22; //南北红灯,东西黄灯(00100010b)
  delay1ms(1000); //延时1秒
  }
  // ================= 延迟函数,延迟约x*1ms ======================
  void delay1ms(int x)
  { int i,j; // 声明整数变数i
  for(i=0;i<x;i++) // 计数x次,延迟约*1ms
  for(j=0;j<120;j++); // 计数120次,延迟约1ms
  }本回答被网友采纳
相似回答