PLC的编程不同于电脑中软件编程,它需要对具体的输入/输出端口信号进行处理和 *** 作(或者说对一个字节的每一个 bit 进行处理和 *** 作)。
南北方向:
南北绿(8s),东西红(8s)
南北黄(21s),东西红(21s)
南北红(101s),东西绿(8s),东西黄(21s)
东西方向:
东西红(101s),南北绿(8s),南北黄(21s)
东西绿(8s),南北红(8s)
东西黄(21s),南北红(21s)
中央处理单元
中央处理器(CPU)是PLC的控制中枢,也是PLC的核心部件,其性能决定了PLC的性能。中央处理器由控制器、运算器和寄存器组成,这些电路都集中在一块芯片上,通过地址总线、控制总线与存储器的输入/输出接口电路相连。中央处理器的作用是处理和运行用户程序,进行逻辑和数学运算,控制整个系统使之协调。
基于单片机的交通灯设计
时间: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 P01,REL1 ;判断是否有东西方向按钮按下
CJNE R7,#00H,MAIN1 ;判断绿灯25s是否倒计完
MOV P1,#0F5H ;南北黄灯,东西红灯
MAIN2:CALL DELAY
MOV R7,#00H ;红灯继续倒计时,黄灯闪烁,保持0s
CPL P11 ;黄灯闪烁
CJNE R6,#00H,MAIN2 ;判断红灯是否倒计时完
MOV P1,#0DEH ;南北红灯,东西绿灯
MOV R7,#1EH
MOV R6,#19H
MAIN3:CALL DELAY
JB P00,REL2
CJNE R6,#00H,MAIN3
MOV P1,#0EEH
MAIN4:CALL DELAY
MOV R6,#00H
CPL P14
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
要求:
1、一路延时60S,
一路延时40S
(演示时为节省时间,一路延时15S,一路延时10S>>
两路时间分别用不同的数码管显示;
--相同的,即可。
--比如:
--东西绿灯、南北红灯,两个方向的数字显示,都是60s倒计时。
--东西红灯、南北绿灯,两个方向的数字显示,都是40s倒计时。
--两路时间虽然不同,数码管显示应该是相同的,完全可以用一组数码管显示。
2紧急通行控制,如某一方向现为红灯,通过按键强行切换为绿灯,而另一路改为红灯,延时若干秒(10S)后,恢复原状态(红灯)继续倒数
--不应恢复原状态。
--比如:
--东西绿灯、南北红灯,两个方向的数字显示,都是60s倒计时。
--在 59s 时,即仅仅剩下 1s 时,被强制转换了红绿灯。
--那么 10s 后,再恢复原状态
--原状态,仅仅有 1s,还恢复它干什么
--这时间,可能,都不够汽车起步用的。
--恢复原来的半截状态,显然不合理。
简单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
我实训是做了这个项目,发给你看看,功能主要和交通灯的差不多,还可以显示具体的时间,跳转的时候,时间是倒计时的,当到0以后,下面灯转换
#include<reg51h>
unsigned int shi,ge,js;
void delay(unsigned char i);
sbit P2_0=P2^0;
sbit P2_1=P2^1;
unsigned int i=0;
unsigned char key_press();
unsigned char key_scan();
unsigned int m=0;m2=0;n1=6;n2=2;
void TIMERO_1();
void TIMERO_0();
unsigned char led[4]={0xee,0xdb,0xf5,0xdb};
unsigned char code tabe[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x00};
unsigned char num;
unsigned char key_scan()
{ unsigned char hang,lie,key;
P3=0x0f;
if(P3!=0x0f)
delay(100);
if(P3!=0x0f)
{
switch(P3&0x0f)
{
case 0x0e:hang=0;break;
case 0x0d:hang=1;break;
case 0x0b:hang=2;break;
//case 0x07:hang=3;break;
}
P3=0xf0;
switch(P3&0xf0)
{
case 0xe0:lie=0;break;
case 0xd0:lie=1;break;
case 0xb0:lie=2;break;
case 0x70:lie=3;break;
}
while(P3!=0xf0);
key=hang4+lie;
}
// else
// key=12;
return (key);
}
unsigned char key_press()
{
unsigned char temp,key_flag;
P3=0x0f;
delay(100);
temp=P3;
if (temp!=0x0f)
{
key_flag=1;
}
else
{
key_flag=0;
}
return key_flag;
}
void TIMERO_0() interrupt 1
{
TH0=0X3C;
TL0=0XB0;
m++;
if(m==20)
{
m=0;
n1--;
shi=n1/10;
ge=n1%10;
}
if(n1==0)
{i=i+1;
n2=3;
TR1=1;
TR0=0;
}
//if(ge==0)
//{ge=2;}
}
void TIMERO_1() interrupt 3
{
TH1=0X3C;
TL1=0XB0;
m2++;
if(m2==20)
{
m2=0;
n2--;
shi=n2/10;
ge=n2%10;
}
if(n2==0)
{
i=i+1;
n1=js;
TR0=1;
TR1=0;
if(i== 4)
{
i=0;
}
//if(ge==0)
//{ge=js;}
}
}
void display(unsigned char a,b,c,d,e,f)
{
P2_1=1;
P2_0=0;
P0=0x20;
P2_0=1;
P2_1=0;
P0=tabe[a];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0X10;
P2_0=1;
P2_1=0;
P0=tabe[b];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0x08;
P2_0=1;
P2_1=0;
P0=tabe[c];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0x04;
P2_0=1;
P2_1=0;
P0=tabe[d];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0x02;
P2_0=1;
P2_1=0;
P0=tabe[e];
delay(10);
P0=0x00;
P2_1=1;
P2_0=0;
P0=0x01;
P2_0=1;
P2_1=0;
P0=tabe[f];
delay(10);
P0=0x00;
delay(10);
}
void main()
{
TMOD=0X11;
TH0=0X3C;
TL0=0XB0;
TH1=0X3C;
TL1=0XB0;
ET1=1;
ET0=1;
EA=1;
P1=0XFF;
while(1)
{
P0=0;
if(key_press())
{ num=key_scan();
if(num<=9)
{
shi=ge;
ge=num;
js=shi10+ge;
n1=js;
}
if(num==10)
{
TR0=0;
TR1=0;
shi=ge;
ge=num;
}
if(num==11)
{
TR0=1;
i=0;
js=shi10+ge;
}
}
P1=led[i];
display(12,12,12,12,shi,ge);
}
}
void delay(unsigned char i )
{
unsigned char j, k;
for(k=0;k<i;k++);
for(j=0;j<255;j++);
}
按照你的要求编写的红绿灯程序,你看看吧,比较简单。
完整的程序如下:
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);
}
}
}
}
以上就是关于红绿灯的plc简单编程是什么全部的内容,包括:红绿灯的plc简单编程是什么、用单片机做交通灯,这么做、求单片机交通灯控制系统设计的程序(最后有中文解析)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)