如何用单片机制作交通灯

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-06-30
用单片机做交通灯,这么做

  基于单片机的交通灯设计
  时间:2010-12-08 21:43:12 来源: 作者:
  一、 系统功能要求:
  1. 设计任务在一十字路口设置交通灯,并用单片机对其进行合理的控制。
  时间方向 控制要求
  白天 东西 绿灯 黄灯 红灯 南北 红灯 绿灯 黄灯
  晚上 东西 黄灯 南北 红灯
  2.总体设计方案现在流行的一种设计为两主干线相交的十字路。本设计采用一主干道(南北方向),一从干道(东西方向)的路口,即主干道的通行时间为从干道的2倍。在正常情况下,两干道的交通灯按图1进行转换,并以倒计数的方式将剩余时间显示在每个干道对应的两位LED上;另发挥部分为当出现紧急情况时,路口的交通灯全为红灯,紧急情况解除时,恢复到原来的状态。
  二、 总体设计方案提示:
  1.假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1东西绿灯通车,南北红灯。过一段时间转状态。
  2.东西绿灯灭,黄灯闪烁几次,南北仍然红灯。再转状态。
  3.南北绿灯通车,东西红灯。过一段时间转状态。
  4.南北绿灯灭,闪几次黄灯,延时几秒,东西仍然红灯。最后循环至状态1。
  三.硬件设计
  电路原理图如下:


  四、软件设计
  1、 流程图


  2、程序设计
  ORG 0000H
  MOV P0,#00H ;确保P0为低电位
  lJMP MAIN0
  ORG 0030H
  MAIN0: MOV 30H,#08H
  MOV R6,#00H
  MOV R7,#00H
  MOV DPTR,#TABLE ;取数码管的译码
  MOV TMOD,#01H ;设计定时方式及时间
  MOV TL0,#0CDH
  MOV TH0,#0BH
  SETB TR0
  MOV IE,#00H
  MAIN: MOV P1,#0F3H ;南北绿灯,东西红灯
  MOV R6,#1EH ;红灯30s倒计时
  MOV R7,#19H ;绿灯25s倒计时
  MAIN1:CALL DELAY ;1S延时子程序
  JB P0.1,REL1 ;判断是否有东西方向按钮按下
  CJNE R7,#00H,MAIN1 ;判断绿灯25s是否倒计完
  MOV P1,#0F5H ;南北黄灯,东西红灯
  MAIN2:CALL DELAY
  MOV R7,#00H ;红灯继续倒计时,黄灯闪烁,保持0s
  CPL P1.1 ;黄灯闪烁
  CJNE R6,#00H,MAIN2 ;判断红灯是否倒计时完
  MOV P1,#0DEH ;南北红灯,东西绿灯
  MOV R7,#1EH
  MOV R6,#19H
  MAIN3:CALL DELAY
  JB P0.0,REL2
  CJNE R6,#00H,MAIN3
  MOV P1,#0EEH
  MAIN4:CALL DELAY
  MOV R6,#00H
  CPL P1.4
  CJNE R7,#00H,MAIN4
  JMP MAIN
  REL1:MOV P1,#0F5H ;东西方向按钮按下,南北方向强制由绿灯变成黄灯警告
  MOV R6,#05H
  MOV R7,#00H
  JMP MAIN2
  REL2:MOV P1,#0EEH ;南北方向按钮按下,东西方向强制由绿灯变成黄灯警告
  MOV R7,#05H
  MOV R6,#00H
  JMP MAIN4
  ;1s延时子程序
  DELAY:MOV A,R6 ;进行南北方向倒计时时间的十进制调整
  MOV B,#0AH
  DIV AB
  MOVC A,@A+DPTR ;找寻相应的数码管代码
  MOV P2,#01H
  MOV P3,A ;输出个位
  MOV R4,#4 ;降低动态显示频率
  LOOP2:MOV R3,#125
  LOOP3:DJNZ R3,LOOP3
  DJNZ R4,LOOP2
  MOV A,B
  MOVC A,@A+DPTR
  MOV P2,#02H ;输出十位
  MOV P3,A
  MOV R4,#4
  LOOP4:MOV R3,#125
  LOOP5:DJNZ R3,LOOP5
  DJNZ R4,LOOP4
  MOV A,R7 ;进行东西方向倒计时时间的十进制调整
  MOV B,#0AH
  DIV AB
  MOVC A,@A+DPTR
  MOV P2,#04H
  MOV P3,A
  MOV R4,#4
  LOOP6:MOV R3,#125
  LOOP7:DJNZ R3,LOOP7
  DJNZ R4,LOOP6
  MOV A,B
  MOVC A,@A+DPTR
  MOV P2,#08H
  MOV P3,A
  MOV R4,#4
  LOOP8:MOV R3,#125
  LOOP9:DJNZ R3,LOOP9
  DJNZ R4,LOOP8
  JBC TF0,LOOP ;判断是否计满125ms
  AJMP DELAY
  LOOP:MOV TL0,#0CDH ;计满125ms重新给定时器赋值
  MOV TH0,#0BH
  MOV A,30H
  DEC A
  MOV 30H,A
  JNZ DELAY ;判断是否计满8次125ms,即1s
  DEC R6 ;计满1s,东西倒计时减1,南北倒计时减1
  DEC R7
  MOV 30H,#08H ;重新1s次数,重新计时
  RET
  TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H ;相应数值的数码管代码
  DB 92H,82H,0F8H,80H,90H
  END

你们实验箱是什么样的?可以将LED连接到单片机的任意I/O口吗?如果可以的话给你一个例子电路图如下程序如下:#include #define RED 0#define YELLOW 1#define GREEN 2sbit P2_0 = P2^0;sbit P2_1 = P2^1;sbit P2_2 = P2^2;sbit P2_3 = P2^3;sbit P2_4 = P2^4;sbit P2_5 = P2^5;#define E2W_LED_RED_ON P2_3 = 0 //东西方向红灯亮#define E2W_LED_RED_OFF P2_3 = 1#define E2W_LED_YELLOW_ON P2_4 = 0#define E2W_LED_YELLOW_OFF P2_4 = 1#define E2W_LED_GREEN_ON P2_5 = 0#define E2W_LED_GREEN_OFF P2_5 = 1#define S2N_LED_RED_ON P2_0 = 0 //南北方向红灯亮#define S2N_LED_RED_OFF P2_0 = 1#define S2N_LED_YELLOW_ON P2_1 = 0#define S2N_LED_YELLOW_OFF P2_1 = 1#define S2N_LED_GREEN_ON P2_2 = 0#define S2N_LED_GREEN_OFF P2_2 = 1unsigned char Status_E2W; //东西方向的交通灯状态unsigned char Status_S2N; //南北方向的交通灯状态unsigned int T10sCnt=0;unsigned int T3sCnt=0;void InitTimer1(void) //定时器1定时50ms{ TMOD = 0x10; TH1 = 0x3C; TL1 = 0xB0; EA = 1; ET1 = 1; TR1 = 1;}void main(){ Status_E2W = GREEN; Status_S2N = RED; E2W_LED_GREEN_ON; S2N_LED_RED_ON; InitTimer1(); while(1) { } }void Timer1Interrupt(void) interrupt 3{ TH1 = 0x3C; TL1 = 0xB0;if(Status_E2W == GREEN){ if(++T10sCnt >= 200)//10s时间到 { T10sCnt = 0; Status_E2W = YELLOW; //东西方向变为黄灯状态 E2W_LED_GREEN_OFF;//东西方向绿灯关 E2W_LED_YELLOW_ON;//东西方向黄灯亮 S2N_LED_RED_OFF;//南北方向红灯关 S2N_LED_YELLOW_ON;//南北方向黄灯亮 }}else if(Status_E2W == YELLOW){ if(++T3sCnt >= 60) //3s时间到 { T3sCnt = 0; Status_E2W = RED;//东西方向变为红灯状态 Status_S2N = GREEN;//南北方向 变为绿灯状态 E2W_LED_YELLOW_OFF; //东西方向黄灯关 E2W_LED_RED_ON;//东西方向绿灯亮 S2N_LED_YELLOW_OFF;//南北方向黄灯关 S2N_LED_GREEN_ON;//南北方向绿灯亮 }}else if(Status_S2N == GREEN){ if(++T10sCnt >= 200)//10s时间到 { T10sCnt = 0; Status_S2N = YELLOW; //南北方向变为黄灯状态 S2N_LED_GREEN_OFF;//南北方向绿灯关 S2N_LED_YELLOW_ON; //南北方向黄灯亮 E2W_LED_RED_OFF;//东西方向红灯关 E2W_LED_YELLOW_ON;//东西方向黄灯亮 }}else if(Status_S2N == YELLOW){ if(++T3sCnt >= 60) //3s时间到 { T3sCnt = 0; Status_S2N = RED;//南北方向变为红灯状态 Status_E2W = GREEN; //东西方向变为绿灯状态 S2N_LED_YELLOW_OFF; //南北方向黄灯关 S2N_LED_RED_ON; //南北方向红灯亮 E2W_LED_GREEN_ON; //东西方向绿灯亮 E2W_LED_YELLOW_OFF; //东西方向黄灯关 }}}

  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();
  }
  }

#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);}}

  • 单片机交通灯设计
    答:SECOND1 EQU 30H ;东西路口计时寄存器 SECOND2 EQU 31H ;南北路口计时寄存器 DBUF EQU 40H ;显示码缓冲区1 TEMP EQU 44H ;显示码缓冲区2 LED_G1 BIT P2.1 ;东西路口绿灯 LED_Y1 BIT P2.2 ;东西路口黄灯 LED_R1 BIT P2.3 ;东西路口红灯 LED_G2 BIT...
  • 用单片机设计制作一个模拟的十字路口交通信号灯控制系统。
    答:在日常生活中,交通信号灯的使用,使交通得以有效管理,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。交通灯控制系统由80C51单片机、键盘、LED显示、交通灯延时组成。系统除具有基本交通灯功能外,还具有时间设置、LED信息显示功能,市交通实现有效控制。 关键字:交通灯;单片机;自动控制;LED Abstract In daily...
  • 如何用单片机制作交通灯
    答:LED模拟交通灯 本例中的12只LED分成东西向和南北向两组,各组指示灯均有相向的2只红色、2只黄色与2只绿色的LED,本例中对应的LED单独进行定义,程序运行时模拟了十字路口交通信号灯得切换过程与显示效果。本例电路如下图:(呵呵 图片插入不进来)程序设计调试与实训:源程序中用6行sbit对东西和南北向...
  • 单片机的交通灯课程设计,希望大神能帮我!
    答:include<reg51.h> define uint unsigned int define uchar unsigned char define red (~0x01)define yellow (~0x02)define green (~0x04)define left (~0x08)define nbred (~0x10)define nbyellow (~0x20)define nbgreen(~0x40)define nbleft (~0x80)uint num2;uchar dx_js,nb_js;uchar...
  • 求一个用汇编语言编写单片机简易交通灯程序。求高手帮下忙谢谢了...
    答:;--- ;程序实现功能 ;西南北路口直行与转弯交替通行,数码管显示直行通行倒计时,红绿黄灯显示包括人行道在内的道路交通状态。;某一方向道路拥挤时,可以人工控制调节东西南北方向通行时间。;紧急情况时,各路口交通灯显示红灯,数码管保持数据不变。;工作寄存器及存储单元分配 ;1.工作寄存器 ;R2设置为定...
  • 单片机交通灯课程设计
    答:/ 十字路口交通灯控制 C 程序 / defineucharunsigned char defineuintunsigned int include<reg52.h> /***定义控制位***/ sbit Time_Show_LED2=P2^5;//Time_Show_LED2控制位 sbit Time_Show_LED1=P2^4;//Time_Show_LED1控制位 sbitEW_LED2=P2^3;//EW_LED2控制位 sbitEW_LED1...
  • 单片机交通灯的汇编程序
    答:TTT: MOV A,#14H ;东西路口黄灯亮;南北路口红灯亮 ACALL DISP ACALL DE02S ;延时0.2秒 MOV A,#10H ;东西路口黄灯灭;南北路口红灯亮 ACALL DISP ACALL DE02S ;延时0.2秒 DJNZ R2,TTT ;返回TTT,使东西路口;黄灯闪烁五次 MOV A,#11H ;两个...
  • 单片机交通灯的设计
    答:4.2.3 系统工作原理 (1)开关键盘输入交通灯初始时间,通过8051单片机P1输入到系统 (2) 由8051单片机的定时器每秒钟通过P0口向8255的数据口送信息,由8255的PA 口显示红、绿、黄灯的燃亮情况;由8255的PC口显示每个灯的燃亮时间。(3)8051通过 设置 各个信号等的燃亮时间、通过8031设置,绿、...
  • 有人可以帮我设计一个关于单片机的交通灯的程序吗,不需要太复杂_百度知 ...
    答:while(x--) for(i=0;i<120;i++);}//交通灯切换void Traffic_Light(){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(...
  • 求用C语言编写的交通灯程序,C51单片机控制,无左转右转
    答://以下代码经过Keil C51软件调试通过 include "reg51.h" //头文件包含 //宏定义 define uint unsigned int define uchar unsigned char define ON 0 //0的时候灯亮 define OFF 1 //1的时候灯亮 //管脚定义 //南北道 黄灯亮3秒 红灯亮 30秒 黄灯3秒 绿灯38秒 //东西道 黄灯亮3秒 绿灯...