十字路口交通信号灯控制程序设计

十字路口交通信号灯控制程序设计,第1张

通灯显示控制

一、前言

(1)通过8255A实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用

(2)进一步学习微处理器的编程技术

二、8255的工作原理:

8255有三种方式可以选择:

方式0:基本输入/输出方式;

方式1:带选通的输入/输出方式

方式2:双向传输方式。

8255为总线兼容型,可以与CPU的总线直接接口。其中,口地址取决于片选CS和A1、A0

如图所示,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。编程时六个灯按交通灯变化规律燃灭。

交通灯变化要求:

(1)、南北路口的绿灯,东西路口的红灯同时亮30秒左右;

(2)、南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮;

(3)、南北路口的红灯,东西路口的绿灯同时亮30秒左右;

(4)、南北路口的红灯继续亮,同时东西路口的黄灯闪烁若干次;

(5)、转(1)重复。

1硬件原理图如图

2硬件线路连接

4流程图

按上面所述过程得出5程序

DATA SEGMENT

PC DB

MESS DB 'ENTER ANY KEY CAN EXIT TO DOS!',0DH,0AH,'$'

DATA ENDS

STACK SEGMENT STACK

STA DW 200 DUP()

TOP EQU LENGTH STA

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START:

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AH,09H

MOV DX,OFFSET MESS

INT 21H

MOV DX,28BH

MOV AL,10000001B

OUT DX,AL

MOV DX,28AH

IN AL,DX

MOV PC,AL

MOV DX,28BH

MOV AL,10000000B

OUT DX,AL

MOV DX,28AH

MOV AL,PC

MOV DX,28AH

MOV AL,00000000B

OUT DX,AL

LLL: MOV DX,28AH

MOV AL,00100100B ;1绿2红

OUT DX,AL

CALL DONE2

CALL DONE2

MOV DX,28AH

MOV AL,01000100B ; ;1黄2红

OUT DX,AL

CALL DONE2

MOV DX,28AH

MOV AL,10000001B ;1红2绿

OUT DX,AL

CALL DONE2

CALL DONE2

MOV DX,28AH

MOV AL,10000010B ;1红2黄

OUT DX,AL

CALL DONE 2

MOV AH,06H

MOV DL,0FFH

INT 21H

JNZ PPP

JMP LLL

PPP: MOV AX,4C00H

INT 21H

DONE1 PROC NEAR

PUSH CX

MOV CX,0FFFFH

CC: LOOP CC

POP CX

RET

DONE1 ENDP

DONE2 PROC NEAR

PUSH AX

PUSH CX

MOV CX,0FFFH

UU: CALL DONE1

LOOP UU

POP CX

POP AX

RET

DONE10 ENDP

CODE ENDS

END START

有些东西发不上来 要的Q我

简单I/O实验(交通灯控制)

一实验要求

以74LS273作为输出口,控制4个双色LED灯(可发红,绿,黄光),模拟交通灯管理。

二实验目的

1学习在单片机系统中扩展简单I/O接口的方法。

2学习数据输出程序的设计方法。

3学习模拟交通灯控制的方法。

4学习双色灯的使用。

三实验电路及连线

四实验说明

1因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化规律。假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1南北绿灯通车,东西红灯。过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时几秒,东西仍然红灯。再转状态3,东西绿灯通车,南北红灯。过一段时间转状态4,东西绿灯闪几次转亮黄灯,延时几秒,南北仍然红灯。最后循环至状态1。

2双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,公用负端。当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。

五实验程序框图

程序框图:

源代码:

ORG 0000H

LJMP START

ORG 0040H

START:

MOV SP,#60H

LCALL STATUS0 ;初始状态(都是红灯)

CIRCLE: LCALL STATUS1 ;南北绿灯,东西红灯

LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯

LCALL STATUS3 ;南北红灯,东西绿灯

LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯

LJMP CIRCLE

STATUS0: ;南北红灯,东西红灯

MOV DPTR,#8300H

MOV A,#0FH

MOVX @DPTR,A

MOV R2,#10 ;延时1秒

LCALL DELAY

RET

STATUS1: ;南北绿灯,东西红灯

MOV DPTR,#08300H

MOV A,#5AH ;南北绿灯,东西红灯

MOVX @DPTR,A

MOV R2,#50 ;延时5秒

LCALL DELAY

RET

STATUS2: ;南北绿灯闪转黄灯,东西红灯

MOV DPTR,#8300H

MOV R3,#03H ;绿灯闪3次

FLASH: MOV A,#5FH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

MOV A,#5AH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

DJNZ R3,FLASH

MOV A,#0AH ;南北黄灯,东西红灯

MOVX @DPTR,A

MOV R2,#10 ;延时1秒

LCALL DELAY

RET

STATUS3: ;南北红灯,东西绿灯

MOV DPTR,#8300H

MOV A,#0A5H

MOVX @DPTR,A

MOV R2,#50 ;延时5秒

LCALL DELAY

RET

STATUS4: ;南北红灯,东西绿灯闪转黄灯

MOV DPTR,#8300H

MOV R3,#03H ;绿灯闪3次

FLASH1: MOV A,#0AFH

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

MOV A,#0A5H

MOVX @DPTR,A

MOV R2,#03H

LCALL DELAY

DJNZ R3,FLASH1

MOV A,#05H ;南北红灯,东西黄灯

MOVX @DPTR,A

MOV R2,#10 ;延时1秒

LCALL DELAY

NOP

RET

DELAY: ;延时子程序

PUSH 2

PUSH 1

PUSH 0

DELAY1: MOV 1,#00H

DELAY2: MOV 0,#0B2H

DJNZ 0,$

DJNZ 1,DELAY2 ;延时 100 mS

DJNZ 2,DELAY1

POP 0

POP 1

POP 2

RET

END

time(){

Threadsleep(3000);

}

redLight()

{

systemoutprintln("绿灯灭");

systemoutprintln("红灯亮");

time();

yellowLight();

}

yellowLight()

{

systemoutprintln("红灯灭");

systemoutprintln("黄灯亮");

time();

greenLight();

}

greenLight()

{

systemoutprintln("黄灯灭");

systemoutprintln("绿灯亮");

time();

redLight();

}

Proteus仿真原理图:

程序如下:

#include <reg51h>

#define uchar unsigned char

#define uint  unsigned int

uchar data buf[4];

uchar data sec_dx=20;//东西数默认

uchar data sec_nb=30;//南北默认值

uchar data set_timedx=20;

uchar data set_timenb=30;

int n;

uchar data b;//定时器中断次数

sbit  k1=P1^6;//定义5组开关

sbit  k2=P1^7;

sbit  k3=P2^7;

sbit  k4=P3^0;

sbit  k5=P3^1;

sbit Yellow_nb=P2^5;       //南北黄灯标志

sbit Yellow_dx=P2^2;       //东西黄灯标志

sbit Green_nb=P2^4;

sbit Green_dx=P2^1;

sbit Buzz=P3^7;

bit Buzzer_Indicate;

bit time=0;//灯状态循环标志

bit   set=1;//调时方向切换键标志

uchar code table[11]={       //共阴极字型码

0x3f,  //--0

0x06,  //--1

0x5b,  //--2

0x4f,  //--3

0x66,  //--4

0x6d,  //--5

0x7d,  //--6

0x07,  //--7

0x7f,  //--8

0x6f,  //--9

0x00   //--NULL

};

//函数的声明部分

void delay(int ms);//延时子程序

void key();//按键扫描子程序

void key_to1();//键处理子程序

void key_to2();

void key_to3();

void display();//显示子程序

void logo();   //开机LOGO

void Buzzer();

//主程序

void main()

{

TMOD=0X01;

TH0=0XD8;

TL0=0XF0;

EA=1;

ET0=1;

TR0=1;

EX0=1;

EX1=1;

logo();

P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯

sec_nb=sec_dx+5;

while(1)

{     

key(); //调用按键扫描程序

display(); //调用显示程序

Buzzer();

}   

}

//函数的定义部分

void key()    //按键扫描子程序

{

if(k1!=1)

{

delay(10);

if(k1!=1)

{

while(k1!=1)

{

key_to1();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k2!=1)

{

delay(10);

if(k2!=1)

{

while(k2!=1)

{

key_to2();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k3!=1)

{

TR0=1;   //启动定时器

Buzzer_Indicate=0;

sec_nb=set_timenb;  //从中断回复,仍显示设置过的数值

sec_dx=set_timedx;

if(time==0)

{ P2=0X99;sec_nb=sec_dx+5; }

else { P2=0xC3;sec_dx=sec_nb+5; }

}     

if(k4!=1)

{

delay(5);

if(k4!=1)

{

while(k4!=1);

set=!set;

}

}

if(k5!=1)

{

delay(5);

if(k5!=1)

{

while(k5!=1)

key_to3();

}

}

}

void display() //显示子程序

{

buf[1]=sec_dx/10; //第1位 东西秒十位

buf[2]=sec_dx%10; //第2位 东西秒个位

buf[3]=sec_nb/10; //第3位 南北秒十位

buf[0]=sec_nb%10; //第4位 南北秒个位

P1=0xff;                                // 初始灯为灭的

P0=0x00;

P1=0xfe;                              //片选LCD1

P0=table[buf[1]];

delay(1);

P1=0xff;

P0=0x00;

P1=0xfd;                           //片选LCD2

P0=table[buf[2]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xfb;              //片选LCD3

P0=table[buf[3]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xf7;

P0=table[buf[0]];               //片选LCD4

delay(1);

}

void time0(void) interrupt 1 using 1  //定时中断子程序

{

b++;

if(b==19)                        // 定时器中断次数

{      b=0;

sec_dx--;

sec_nb--;

if(sec_nb<=5&&time==0)  //东西黄灯闪

{  Green_dx=0;Yellow_dx=!Yellow_dx;}               

if(sec_dx<=5&&time==1)  //南北黄灯闪

{  Green_nb=0;Yellow_nb=!Yellow_nb;}            

if(sec_dx==0&&sec_nb==5)

sec_dx=5;

if(sec_nb==0&&sec_dx==5)

sec_nb=5;

if(time==0&&sec_nb==0)

{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}

if(time==1&&sec_dx==0)

{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}

}

}

void key_to1()    //键盘处理子程序之+

{

TR0=0;          //关定时器

if(set==0)

set_timenb++;    //南北加1S

else

set_timedx++;    //东西加1S

if(set_timenb==100)

set_timenb=1;

if(    set_timedx==100)

set_timedx=1;   //加到100置1

sec_nb=set_timenb ;    //设置的数值赋给东西南北

sec_dx=set_timedx;

}

void key_to2()       //键盘处理子程序之-

{

TR0=0;         //关定时器

if(set==0)

set_timenb--;  //南北减1S

else

set_timedx--;  //东西减1S

if(set_timenb==0)

set_timenb=99;

if(    set_timedx==0 )

set_timedx=99;   //减到1重置99

sec_nb=set_timenb ;    //设置的数值赋给东西南北

sec_dx=set_timedx;

}

void key_to3()   //键盘处理之紧急车通行

{

TR0=0;

P2=0Xc9;

sec_dx=00;

sec_nb=00;

Buzzer_Indicate=1;

}

void int0(void) interrupt 0 using 1  //只允许东西通行

{

TR0=0;

P2=0Xc3;

Buzzer_Indicate=0;

sec_dx=00;

sec_nb=00;

}

void int1(void) interrupt 2 using 1       //只允许南北通行

{

TR0=0;

P2=0X99;

Buzzer_Indicate=0;

sec_nb=00;

sec_dx=00;

}

void logo()//开机的Logo  "- - - -"

{ for(n=0;n<50;n++)

{

P0=0x40;

P1=0xfe;

delay(1);

P1=0xfd;

delay(1);

P1=0Xfb;

delay(1);

P1=0Xf7;

delay(1);

P1 = 0xff;

}

}

void Buzzer()

{

if(Buzzer_Indicate==1)

Buzz=!Buzz;

else Buzz=0;

}

void delay(int ms)            //延时子程序

{

uint j,k;

for(j=0;j<ms;j++)

for(k=0;k<124;k++);

}

思路:

红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。

东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。

三、硬件电路设计

此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。

四、软件程序(C语言)

以下是整个设计的软件程序,直接可以编译成。Hex代码。通过以上电路,下载到单片机,可直接运行。

////

//程序名:十字路口交通灯控制

//编写人:黄庭剑

//初写时间:2009年1月2日

//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换

//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器

//完成时间:2009年1月6日

////

#include<stdioh>

#include<reg51h>

#include<intrinsh>

sfr p0   = 0x80;

sfr p1   = 0x90;

sfr p2   = 0xA0;

sfr p3   = 0xb0;      //这部分内容其实在“#include<reg51h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51h里面的内容。其实两者是一样的。

sbit  sw      = p0^0;

sbit   OE    =P0^6;

sbit   LE    =P0^7;  //74LS373锁存器控制端定义

char  display[]={ 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 }; //p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;

//函数声明 begin

void  delay1(int count);

void  delay_long(int  number1,int number2);

void    people_car_drive();

//函数声明end

////延时子程序

void  delay1(int  count)

{ int  i;

for(i=count;i>0;i--)

{ ;}

}

void  delay_long(int  number1,int number2)

{

int a,b;

for(a=number1;a>0;a--)

{

for(b=number2;b>0;b--)

{ _nop_();     }

}

}

////延时子程序

void   people_car_drive()

{

int   p_1=2,i,j=9,p_2=6;    ////行人通行时,延时20秒

p2=0x09;                     //南北红灯亮

p3=0x24;                     //东西绿灯亮

while(p_1-->0)

{ LE=1;

OE=0;

if(p_1==0){OE=1;}            //当十位数减到0时,只显示个位数

p1=display[p_1];

delay1(1000);

LE=0;

j=9;

for(i=10;i>0;i--)

{

if(p_1==0&&j==3)break;     //减到3时退出循环,让其黄灯闪烁显示

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;

}

}

////

p2=0x12;                  //南北黄灯闪烁三秒,以提醒行人注意

p3=0x12;

p1=display[3];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

//以下是车辆通行时延时60秒//

p2=0x24;                 //南北绿灯亮

p3=0x09;                 //东西红灯亮

while(p_2-->0)

{ LE=1;

OE=0;

if(p_2==0){OE=1;}       //当十位数减到0时,只显示个位数

p1=display[p_2];

delay1(1000);

LE=0;

j=9;

for(i=10;i>0;i--)

{

if(p_2==0&&j==3)break;  //减到2时退出循环

p1=display[j--];

delay_long(16000,2);

if(sw==1)return;

}

}

p2=0x12;                //南北黄灯闪烁三秒,以提醒行人注意

p3=0x12;

p1=display[3];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[2];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);

p2=0x12;

p3=0x12;

p1=display[1];

delay_long(8000,1);

p2=0x00;

p3=0x00;

delay_long(14000,1);    //南北黄灯闪烁三秒完毕

}

void  main()               //主函数入口处

{

p0=0x01;

p1=0x00;

p2=0x00;

p3=0x00;               //初始化各端口

{ while(1)

{

if(sw==0)

{  people_car_drive();}

else

{

p2=0x00;

p3=0x00;                    //关闭所有交通灯

}

}

}

}

详情访问:>

按照你的要求编写的红绿灯程序,你看看吧,比较简单。

完整的程序如下:

import javaawt;

import javaawtevent;

import javaxswing;

import javaawtGraphics;

public class TrafficLight extends JFrame{

JRadioButton jrbYellow,jrbGreen,jrbRed;

int flag=0;

jpNewPanel jpNewPanel;

public static void main(String[] args){

TrafficLight frame=new TrafficLight();

framesetSize(500,200);

framesetLocationRelativeTo(null);

framesetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

framesetTitle("TrafficLight");

framesetVisible(true);

}

public TrafficLight(){

jpNewPanel=new jpNewPanel();

add(jpNewPanel,BorderLayoutCENTER);

JPanel jpRadioButtons=new JPanel();

jpRadioButtonssetLayout(new GridLayout(1,3));

jpRadioButtonsadd(jrbYellow=new JRadioButton("Yellow"));

jpRadioButtonsadd(jrbGreen=new JRadioButton("Green"));

jpRadioButtonsadd(jrbRed=new JRadioButton("Red"));

add(jpRadioButtons,BorderLayoutSOUTH);

ButtonGroup group=new ButtonGroup();

groupadd(jrbYellow);

groupadd(jrbGreen);

groupadd(jrbRed);

jrbYellowaddActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

flag=2;

jpNewPanelrepaint();

}

});

jrbGreenaddActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

flag=1;

jpNewPanelrepaint();

}

});

jrbRedaddActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

flag=3;

jpNewPanelrepaint();

}

});

}

class jpNewPanel extends JPanel{

protected void paintComponent(Graphics g){

superpaintComponent(g);

gdrawRect(0,0,40,100);

gdrawOval(10,10,20,20);

gdrawOval(10,40,20,20);

gdrawOval(10,70,20,20);

if(flag==1){

gsetColor(ColorGREEN);

gfillOval(10, 70, 20, 20);

}

else if(flag==2){

gsetColor(ColorYELLOW);

gfillOval(10, 40, 20, 20);

}

else if(flag==3){

gsetColor(ColorRED);

gfillOval(10, 10, 20, 20);

}

}

}

}

以上就是关于十字路口交通信号灯控制程序设计全部的内容,包括:十字路口交通信号灯控制程序设计、交通信号灯控制程序设计、使用顺序控制结构,编写出实现红黄绿三种颜色信号灯循环显示程序(要求循环间隔时间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存