单片机控制的交通灯

单片机控制的交通灯,第1张

题目 交通灯控制系统的设计 一、课程设计的目的与要求 1、课程设计目的: (1)进一步理解和消化书本知识,运用所学知识和技能进行简单的设计。 (2)通过课程设计提高应用能力,分析问题和解决问题的能力。 (3)培养查阅资料的习惯,训练和提高自学,独立思考的能力。 2、课程设计要求 交通灯控制系统的设计 1) 掌握在单片机系统中扩展简单I/O接口的方法。 2) 掌握数据输出程序的设计方法。 3) 掌握模拟交通灯控制的实现方法。 4) 掌握外部中断技术的基本使用方法。 5) 掌握中断处理程序的编程方法。 从课程设计的目的出发,通过设计工作的各个环节,达到以下要求: (1)能够正确理解课程设计的题目和意义,全面思考问题。 (2)运用科学合理的方法,认真按时完成。 二、课程设计课题的分析 1、电路的设计 1)原理 要完成本实验,首先必须了解交通灯的亮灭规律。本实验需要用到试验箱上八个发光二极管中的六个,即红、绿、黄各两个。将L1(红)、L2(绿)、L3(黄)作为东西方向的指示灯,将L5(红)、L6(绿)、L7(黄)作为南北方向的指示灯。交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。 各发光二极管的阳极通过保护电阻接到+5V的电源上,阴极接到输入端上,因此使其点亮使相应使相应输入端为低电平。 当有急救车到达时,两个方向上的红灯亮,以便让急救车通过,假设急救车通过路口的时间为10秒,急救车通过后,交通灯恢复中断前的状态。本程序以单次脉冲为中断申请,表示有急救车通过,单次脉冲输出端P-接CPU板上的INT0。 2)、硬件电路图 图1—1 交通灯控制系统的硬件接线图 74LS273的输出00—07接发光二极管L1—L8,74LS273的片选CS273接片选信号CS2,此时74LS273的片选地址为CFA0—CFA7之间任选。 3)、程序流程图 主程序流程 图1—2 主程序软件流程图 中断程序流程图 三、课程设计的结果 1、程序 NAME JIAOTONGGENG OUTPORT EQU 0CFB0H ;端口地址 SAVE EQU 55H ;SAVE保存从端口CFA0输出的数据 CSEG AT 0000H LJMP START CSEG AT 4003H LJMP INT CSEG AT 4100H START: SETB IT0 ;中断程序初始化 SETB EX0 SETB EA MOV A,#11H ;置首显示码,两红灯全亮 MOV SAVE,A ;保存 ACALL DISP ;显示输出 ACALL DE3S ;延时3秒 LLL: MOV A,#12H ;东西路口绿灯亮,南北路口红灯亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延时10秒 MOV A,#10H ;东西路口绿灯灭 MOV SAVE,A ACALL DISP MOV R2,#05H ;东西路口黄灯闪烁5次 TTT: MOV A,#14H MOV SAVE,A ACALL DISP ACALL DE02S ;延时02秒 MOV A,#10H MOV SAVE,A ACALL DISP ACALL DE02S DJNZ R2,TTT MOV A,#11H ;红灯全亮 MOV SAVE,A ACALL DISP ACALL DE02S ;延时02秒 MOV A,#21H ;东西路口红灯亮,南北路口绿灯亮 MOV SAVE,A ACALL DISP ACALL DE10S ;延时10秒 MOV A,#01H ;南北路口绿灯灭 MOV SAVE,A ACALL DISP MOV R2

看你的程序上没有很大的问题,但是你的延时都使用相同子程序,延时时间相同。你可以把延时30秒的子程序和延时5秒的程序分开来写,分别调用。另单片机的引脚一般为吸入电流,建议你将单片机的引脚输出改为0有效就可以直接接负载,电源控制按键判断也作出相应的修改。

ORG 0000H

LJMP MAIN

ORG 000BH ;中断程序入口地址

LJMP TIME_0

ORG 0040H

MAIN:

MOV IE,#82H

MOV TCON , #10H

MOV TH0, #3CH

MOV TL0,#0AFH ;定时器T0初始化

MOV R1,#20 ;定时累积

RED:

MOV R2,#30 ;R2为时间设定

LOOP1:

MOV A,R2

JZ GREEN ;R2为0时转到GREEN处,改变亮灯状态

CALL SHOW ;调用显示子程序,显示30s

MOV P3,#0

SETB P30

LJMP LOOP1

GREEN:

MOV R2,#20

LOOP2:

MOV A,R2

JZ YELLOW ;R2为0时转到YELLOW 处,改变亮灯状态

CALL SHOW ;调用显示子程序,显示20s

MOV P3,#0

SETB P31

LJMP LOOP2

YELLOW:

MOV R2, #3 ;3s时间设定

MOV R0, #6

MOV P3, #00H

SETB P32 ;闪烁位

LOOP3:

MOV A, R2

JZ RED

MOV A, R0

JZ SHAN

dec R0

CALL SHOW

LJMP LOOP3

SHAN:

MOV R0, #6

CPL P32

LJMP LOOP3

SHOW:

MOV A,R2

MOV B,#10

DIV AB ;二进制转十进制

MOV DPTR ,#TABL

MOVC A,@A+DPTR ;查表

MOV P1,#0FFH

MOV P1,A

MOV P2,#00H

SETB P21

CALL DELY

MOV A,B

MOV DPTR, #TABL

MOVC A, @A+DPTR

MOV P1, #0FFH

MOV P1, A

MOV P2, #00H

SETB P22

CALL DELY

RET

DELY: ;延时子程序

D3: MOV R6, #100

D2: MOV R7, #10

D1: DJNZ R7, D1

DJNZ R6, D2

RET

TIME_0:

PUSH ACC ;保护现场

PUSH PSW

MOV TH0, #3CH

MOV TL0, #0AFH ;定时器T0初始化,定时50ms

DJNZ R1, OUT_T0 ;计时1s后做如下工作

MOV R1, #20

DEC R2

OUT_T0:

POP PSW

POP ACC

RETI

TABL:DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H

END

#include<AT89X52H>

#define LED_D  P2

#define LED_S  P1

unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

sfr P1M0=0xB2;

unsigned int m,i,post1,post2;

unsigned int k=0,nums=1,n=1;

void timer1() interrupt 1 using 1

{   

 i++;

 TH0=0XB1;    //初始化

 TL0=0XE0;   //初始化         

 post1=9-(i/50%10);

 post2=2-i/500; 

 m=i/25;

 if(m==60)

  i=0;

}

void initialize()

{

 P0=0XFF ;

 TMOD=0X01;

 TR0=1;

 TH0=0XB1;

 TL0=0XE0; 

}

void show()

{    switch(n)

    { case 1:

         LED_D=table[post1];

         LED_S=0x01;

      break;

      case 3:

         LED_D=table[post2];

         LED_S=0x02;

      break;

    }

 if(n++==4)

    n=1;

   switch(nums)

   {

    case 1:    

    if(m<52)

      P0=0XDE;

    if(m>=52&&m<59) 

    {P0_0=1;

     if(k++>=50000)

       {

        P0_1=!P0_1;

        k=0;

       }

  }

  if(m==59)

     nums=2;

  break;

      case 2:

    if(m<52)

       P0=0XF3;

    if(m>=52&&m<59) 

    {

     P0_3=1;

     if(k++>=50000)

     {

      P0_4=!P0_4;

        k=0;

   }

   }

  if(m==59)

     nums=1;

    break;

  default: break;

 } 

}

void main()

{

   initialize();

   EA=1;

   P1M0=0XF0;

   ET0=1;  

   TR0=1; 

   while(1)

   { 

     show(); 

   }

}

这是带数码管显示的红绿灯,主要用了四位8段的数码管显示时间。如果需要详细的继续追问。

交通路口红绿灯自动控制器电路图 如图所示为交通路口红绿灯自动控制电路。该控制器主要由四块555(IC2~IC5)和一些阻容元件组成的四级单稳态延时电路首尾相连而成。输入的8V电压经78M05稳压后为555提供VDD=+5V的电源电压。 当刚接通电源时,触发脉冲经IC1(CD4011)门电路和R1、C1延时,再经C2、R22微分后加到IC2②脚,触发IC2输出高电平,进入暂稳态,其暂稳态定时时间长短取决于K1的位置,延时td=11RC6,设定时间分别为60秒、45秒、30秒。暂稳态结束时,IC2③脚为低电平,其经C3、R23微分后,下降沿又触发IC3,形成第二级单稳态延时。如此依次触发定时,完成绿色灯亮-**灯亮(8秒、10秒、12秒)-红色灯亮(60秒、45秒、30秒)的循环周期。 本控制器通过四级电路首尾相接,依次延时触发,使交通灯依次出现绿-黄-红(色)信号,指挥行人和车辆在十字路I=1有秩序地通行(绿)-提醒注意(黄)-禁止通行(红)。 看看这个有用吗?

给你一个思路:

假设是单纯的红绿灯,无黄灯的话,设红灯30秒,绿灯30秒。需要两个状态量,

方向Dir(1:东西,0:南北),东西灯颜色LightcolorEW,南北灯颜色LightcolorNS。

此刻,东西方向亮红灯,则Dir=1,LightcolorEW=red,LightcolorNS=green。对相应端口赋值即可。只需要东西方向与南北方向相反。

假设有黄灯,设红灯30秒,绿灯25秒,黄灯5秒。此刻,东西方向亮红灯,则Dir=1,LightcolorEW=red,前25秒LightcolorNS=green,后5秒LightcolorNS=yellow。由于新加入了绿灯转黄灯,则要再加入一个状态量,绿灯结束状态,黄灯根据绿灯结束状态启动,计时结束转红灯。对相应端口赋值即可。只需要东西方向与南北方向相反。

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P3^0; //东西向指示灯

sbit YELLOW_A=P3^1;

sbit GREEN_A=P3^2;

sbit RED_B=P3^3; //南北向指示灯

sbit YELLOW_B=P3^4;

sbit GREEN_B=P3^5;

sbit KEY1=P1^0;

sbit KEY2=P1^1;

sbit KEY3=P1^2;

//延时倍数,闪烁次数, *** 作类型变量

uchar Flash_Count=0,Operation_Type=1,LEDsng,LEDsns,LEDewg,LEDews,discnt;

uint Time_Count=0,time;

uchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

void displaysn()

{

LEDsng=((time-Time_Count)/20)%10;

LEDsns=((time-Time_Count)/20)/10;

LEDewg=0x10;

LEDews=0x10;

}

void displayew()

{

LEDewg=((time-Time_Count)/20)%10;

LEDews=((time-Time_Count)/20)/10;

LEDsng=0x10;

LEDsns=0x10;

}

//定时器0 中断函数

void T0_INT() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

switch(Operation_Type)

{

case 1: //东西向绿灯与南北向红灯亮

if((Time_Count%20)==0)displayew();

RED_A=0;YELLOW_A=0;GREEN_A=1;

RED_B=1;YELLOW_B=0;GREEN_B=0;

if(++Time_Count!=time) return;

Time_Count=0;

Operation_Type=2;

break;

case 2: //东西向黄灯开始闪烁,绿灯关闭

LEDewg=0x0;

LEDews=0x0;

if(++Time_Count!=8) return;

Time_Count=0;

YELLOW_A=~YELLOW_A;GREEN_A=0;

if(++Flash_Count!=6) return; //闪烁

Flash_Count=0;

Operation_Type=3;

break;

case 3: //东西向红灯与南北向绿灯亮

if((Time_Count%20)==0)displaysn();

RED_A=1;YELLOW_A=0;GREEN_A=0;

RED_B=0;YELLOW_B=0;GREEN_B=1;

if(++Time_Count!=time) return;

Time_Count=0;

Operation_Type=4;

break;

case 4: //南北向黄灯开始闪烁,绿灯关闭

LEDsng=0x0;

LEDsns=0x0;

if(++Time_Count!=8) return;

Time_Count=0;

YELLOW_B=~YELLOW_B;GREEN_A=0;

if(++Flash_Count!=6) return; //闪烁

Flash_Count=0;

Operation_Type=1;

break;

}

}

void t1_isr() interrupt 3

{

TR1=0;

TH1=(65536-3000)/256;

TL1=(65536-3000)%256;

TR1=1;

switch(discnt)

{

case 0:

P2=0x02;

P0=ledtab[LEDewg];

break;

case 1:

P2=0x01;

P0=ledtab[LEDews];

break;

case 2:

P2=0x08;

P0=ledtab[LEDsng];

break;

case 3:

P2=0x04;

P0=ledtab[LEDsns];

break;

default:discnt=0;break;

}

discnt++;

discnt&=0x03;

}

void delay()

{

uint i;

for(i=0;i<1000;i++);

}

//主程序

void main()

{

TMOD=0x11; //T0 方式1

EA=1;

ET0=1;

TR0=1;

TH1=(65536-3000)/256;

TL1=(65536-3000)%256;

TR1=1;

ET1=1;

time=120;

Time_Count=100;

Time_Count=0;

Operation_Type=1;

while(1)

{

if(KEY1==0) //按一下加1S

{

delay();

if(KEY1==0)

{

while(KEY1==0);

TR0=0;

time+=20;

LEDsng=(time/20)%10;

LEDsns=(time/20)/10;

LEDewg=0x10;

LEDews=0x10;

}

}

if(KEY2==0) //按一下减1S

{

delay();

if(KEY2==0)

{

while(KEY2==0);

TR0=0;

time-=20;

if(time==0)time=20;

LEDewg=(time/20)%10;

LEDews=(time/20)/10;

LEDsng=0x10;

LEDsns=0x10;

}

}

if(KEY3==0) //启动

{

delay();

if(KEY3==0)

{

while(KEY2==0);

TR0=1;

Time_Count=0;

}

}

}

}

以上就是关于单片机控制的交通灯全部的内容,包括:单片机控制的交通灯、单片机 用汇编语言编写交通红绿灯 只要求红灯30秒,黄灯5秒,绿灯30秒,黄灯5秒,其他不限、单片机交通灯程序每条代码的意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9458906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存