用AT89S52的P1口做输出口,控制六个发光二极管亮灭,模拟交通灯控制

用AT89S52的P1口做输出口,控制六个发光二极管亮灭,模拟交通灯控制,第1张

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P1^3; //东西向指示灯

sbit YELLOW_A=P1^1;

sbit GREEN_A=P1^2;

sbit RED_B=P1^6; //南北向指示灯

sbit YELLOW_B=P1^4;

sbit GREEN_B=P1^5;

sbit KEY1=P3^0;

sbit KEY2=P3^1;

sbit KEY3=P3^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!=10) 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!=10) 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=100;

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;

}

}

}

}

通灯显示控制

一、前言

(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我

十字路口有四条支道,每道支道上停着等着开往其它三条支道的车辆,每一个时间片段内只允许一条支道上的车辆行驶。

程序整体框架设计上可以采取事件驱动方式比较简单,即程序的主循环体每执行一次表示经历了一个时间片段,在这段时间内要计算四条支道上又增加了几辆车,有几辆车离开了十字路口,注意每随机产生一辆车时至少要包括它在哪条支道上出现要开往哪条支道等,或者反过来在这个时间片断内某条支道上出现了几辆开往特定支道的车辆。

不清楚你要模拟到何种程度,车辆在过十字路的时间可否忽略不计?车辆排队的长度是否也要考虑?不会说要用图形界面形象地演示吧?

如果你的模型足够简单,十字路口被简化成两条相交的直线,那么你只需要一组简单的对象(如12个整型变量)足以表征状态!当然可以还需要几个变量用于统计历史数据。

然而现实世界是足够复杂的,举个简单的案例:某个支道上已经排了很长的车队,交通灯指示当前这个支道上的辆车可以通行了,等你前面的车都开过了十字路口,终于轮到你的时候,时间已到红灯已亮!更为复杂的是交通灯的控制为了避免这种情况可能就不是等时间间隔地轮换了。车辆开开停停不是匀速运动,这点你也该很清楚的。

另外提醒你“车辆的随机出现”,不要以为只有一种均匀分布的随机数产生方式!通过一些公式可以换算出泊松分布什么的

记住这是一个很有意思的算法设计课题,不要受OOP思潮的毒害,动不动就想到类什么的,我们要关心的是框架设计和流程控制。把它当作是几何题来理解更是可笑至极!

程序流程上还可以设计得更复杂些,就是用多线程去模拟多辆车,用事件去模拟交通灯,如果你愿意程序可以采取时间驱动的方式运作,更为接近现实世界。

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

完整的程序如下:

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

}

}

}

}

晚上随手写,也未调试,权当看看

程序有不严谨地方还得调试修改

#include <REGX51H>

#define STATUS_1S 1

#define STATUS_2S 2

#define STATUS_3S 3

#define STATUS_4S 4

#define STATUS_5S 5

#define STATUS_15S 15

#define STATUS_28S 28

#define STATUS_29S 29

#define STATUS_30S 30

unsigned char flag,status,status_temp=1,status_temp_;

sbit K1 = P0^0;

sbit K2  = P0^1;

sbit RLED = P0^2;

sbit YLED = P0^3;

sbit GLED = P0^4;

void Init(void)

{

ET0=1;

TR0=1;

RLED=0;  //亮

YLED=0;

GLED=0;

while(status_temp)

{

switch (status)

{

case STATUS_1S: //1S

{

RLED=1; //灭,闪一次

YLED=1;

GLED=1;

} break;

case STATUS_2S: //1S

{

RLED=0; //亮,闪一次

YLED=0;

GLED=0;

} break;

case STATUS_3S: //1S

{

RLED=1;    //灭

YLED=1;

GLED=1;

status_temp=0;

} break;

}

}

status_temp=1;

ET0=0;

TR0=0;

}

void Init_Timer0(void)

{

TMOD=0x01;

// ET0=1;

// TR0=1;

EA=1;

TH0=0X3C;

TL0=0XB0;    // 未计算,偷楼上的

}

void M_Start(void)

{

TH0=0X3C;

TL0=0XB0;

ET0=1;

TR0=1;

RLED=0;  //红亮

while(status_temp)

{

switch (status)

{

case STATUS_1S:

{

if(status_temp_==1)

{

YLED=0;

}

} break;

case STATUS_2S:

{

if(status_temp_==1)

{

YLED=1;

}

} break;

case STATUS_3S:

{

if(status_temp_==1)

{

YLED=0;

status_temp_=0;

}

} break;

case STATUS_15S: //15S灭,绿亮

{

RLED=1;

GLED=0;

} break;

case STATUS_28S:

{

GLED=1;

} break;

case STATUS_29S:

{

GLED=0;

} break;

case STATUS_30S:

{

GLED=1;

status=0;

status_temp_=1;

} break;

}

}

ET0=0;

TR0=0;

status=0;

status_temp=1;

YLED=1;

}

void M_End(void)

{

TH0=0X3C;

TL0=0XB0;

ET0=1;

TR0=1;

RLED=0;  //亮 1次

YLED=0;

GLED=0;

while(status_temp)

{

switch (status)

{

case STATUS_1S: //1S

{

RLED=1; //灭一次

YLED=1;

GLED=1;

} break;

case STATUS_2S: //1S

{

RLED=0; //亮二次

YLED=0;

GLED=0;

} break;

case STATUS_3S: //1S

{

RLED=1;    ////灭二次

YLED=1;

GLED=1;

} break;

case STATUS_4S: //1S

{

RLED=0;    ////亮三次

YLED=0;

GLED=0;

} break;

case STATUS_5S: //1S

{

RLED=1;    ////灭三次

YLED=1;

GLED=1;

status_temp=0;

} break;

}

}

status_temp=1;

ET0=0;

TR0=0;

}

main()

{

Init();//单片机初始化

Init_Timer0();//定时器初始化

while(1)

{

if(K1==0)

M_Start();//模拟开始

if(K2==0)

M_End();//模拟结束

}

}

void interrupt_time0() interrupt 1   //核对头文件,一致就好

{

TH0=0X3C;

TL0=0XB0;

flag++;

if(flag==20)

{

status++;

flag=0;

}

}

以上就是关于用AT89S52的P1口做输出口,控制六个发光二极管亮灭,模拟交通灯控制全部的内容,包括:用AT89S52的P1口做输出口,控制六个发光二极管亮灭,模拟交通灯控制、十字路口交通信号灯控制程序设计、程序题关于模拟十字路口的车辆通行情况的程序,用c++等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存