求单片机交通灯控制系统设计的程序(最后有中文解析)

求单片机交通灯控制系统设计的程序(最后有中文解析),第1张

要求:

1、一路延时60S,

一路延时40S

(演示时为节省时间,一路延时15S,一路延时10S>>

两路时间分别用不同的数码管显示;

--相同的,即可。

--比如:

--东西绿灯、南北红灯,两个方向的数字显示,都是60s倒计时。

--东西红灯、南北绿灯,两个方向的数字显示,都是40s倒计时。

--两路时间虽然不同,数码管显示应该是相同的,完全可以用一组数码管显示。

2紧急通行控制,如某一方向现为红灯,通过按键强行切换为绿灯,而另一路改为红灯,延时若干秒(10S)后,恢复原状态(红灯)继续倒数

--不应恢复原状态。

--比如:

--东西绿灯、南北红灯,两个方向的数字显示,都是60s倒计时。

--在 59s 时,即仅仅剩下 1s 时,被强制转换了红绿灯。

--那么 10s 后,再恢复原状态

--原状态,仅仅有 1s,还恢复它干什么

--这时间,可能,都不够汽车起步用的。

--恢复原来的半截状态,显然不合理。

;交通灯模拟实验程序

GEWEI EQU 21H ;个位数据

SHIWEI EQU 23H ;十位数据

SCANLED EQU 25H

SCANMODE EQU 26H

RED EQU 28H ;定义灯的缓冲区

GREEN EQU 29H

YELLOW EQU 32H

NUMTIM EQU 33H

LED EQU 34H

ORG 000H

JMP START

ORG 0BH

JMP TIMER0 ;定时器0中断入口

ORG 100H

START:MOV SP,#50H

MOV R0,#20H

MOV R5,#20

CLR0:MOV @R0,#00H

INC R0

DJNZ R5,CLR0

MOV TMOD,#01H ;设置定时器

MOV TH0,#HIGH(65536-5000)

MOV TL0,#LOW(65536-5000)

SETB TR0

MOV IE,#10000010B ;端口初始化

MOV P0,#0FFH

MOV P1,#0FFH

MOV P2,#00H

MOV P3,#0FFH

MOV R3,#10

MOV R2,#3

MOV R1,#10

MOV R7,#200

MOV RED,#10

MOV YELLOW,#3

MOV GREEN,#10

MOV NUMTIM,#10

MOV LED,#0FFH

AJMP $

;============================================================= TIMER0:PUSH ACC ;定时器部分,负责交通灯的及时和数码管动态扫描

PUSH PSW

MOV TH0,#HIGH(65536-5000) ;重新赋初值

MOV TL0,#LOW(65536-5000)

DJNZ R7,RET0

MOV R7,#200

MOV A,SCANMODE ;调用扫描

MOV B,#4

DIV AB

MOV A,B

RL A

MOV DPTR,#TAB_SCAN

JMP @A+DPTR

TAB_SCAN: AJMP RED_LIGHT

AJMP YEL_LIGHT

AJMP GRE_LIGHT

AJMP YEL_LIGHT

RET0: MOV A,NUMTIM

LCALL BIN_BCD

MOV SHIWEI,A

MOV GEWEI,B

INC SCANLED

MOV A,SCANLED

MOV B,#4

DIV AB

MOV A,B

RL A

MOV DPTR,#TAB_SCAN0

JMP @A+DPTR

TAB_SCAN0:AJMP SCAN_L1

AJMP SCAN_L2

SCAN_L1: MOV P2,#0

MOV A,SHIWEI

JMP END_SCAN

SCAN_L2: MOV P2,#1

MOV A,GEWEI

JMP END_SCAN

END_SCAN:MOV DPTR,#TABLE

MOVC A,@A+DPTR

MOV P0,A

MOV A,LED

MOV P1,A

POP PSW

POP ACC

RETIRED_LIGHT:MOV LED,#11111100B

MOV NUMTIM,RED

DEC RED

MOV A,RED

CJNE A,#0FFH,RET0

MOV RED,#10

MOV A,SCANMODE

ADD A,#01H

MOV SCANMODE,A

JMP RET0

YEL_LIGHT:MOV LED,#11110011B

MOV NUMTIM,YELLOW

DEC YELLOW

MOV A,YELLOW

CJNE A,#0FFH,RET0

MOV YELLOW,#3

MOV A,SCANMODE

ADD A,#01H

MOV SCANMODE,A

JMP RET0

GRE_LIGHT:MOV LED,#11001111B

MOV NUMTIM,GREEN

DEC GREEN

MOV A,GREEN

CJNE A,#0FFH,RET1

MOV GREEN,#10

MOV A,SCANMODE

ADD A,#01H

MOV SCANMODE,A

RET1:JMP RET0 BIN_BCD:MOV B,#10

DIV AB

RET DELAY: MOV R5,#02

D1: MOV R6,#200

D2: MOV R7,#200

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH;共阴字码表

DB 07H,7FH,6FH,77H,7CH,39H,5EH

DB 79H,71H,76H,73H,3EH,00HEND

引言

可变程序控制器(PLC)是从早期的继电器逻辑控制系统发展而来的。自60年代问世以来,PLC得到了突飞猛进的发展,尤其在数据处理、网络通信及与DCS等集散系统融合方面有了很大的进展,可变程序控制器已经成为工业自动化强有力的工具,得到了广泛的普及和推广应用。

本文以交通信号灯控制系统为例,着重讲述可变程序控制器(PLC)与上位计算机工控组态软件组态王之间的通信。

1、FX-0N-60MR PLC及其编程软件MELSEC-F FX Applications

日本三菱公司的FX0N系列是近年来推出的高性能微型可编程序控制器,外观结构小巧美观、功能强大,系统配置灵活,用户除了可以选用多种基本单元外,还可以选择适当的扩展单元和扩展模块,根据控制要求灵活方便地进行系统配置,组成不同I/O点数和不同功能的控制系统,各种不同的配置都可以得到很好的性能价格比。

FX0N系列有较强的通讯功能,可与内置RS-232C通讯接口的设备通讯。三菱公司FX系列的编程软件MELSEC-F FX Applications是适用于PC机的一种编程软件,可用梯形图、指令表两种编程语言编制程序,程序编制完成之后,利用PLC与计算机专用的F2-232C AB型RS232C电缆传送程序至PLC。

2、组态王V60

组态王是一个集成的人机界面(HMI)系统和监控管理系统,可与可编程控制器(PLC)、智能模块、板卡智能仪表、远程数据采集装置(RTV)等多种外部设备进行通讯。而其软件系统与用户最终使用的现场设备无关,对于不同的硬件设施,用户只需要按照安装向导的提示完成I/O设备的配置工作,为组态王配置相应的通讯设备的硬件驱动程序,并由硬件设备驱动程序完成组态王与I/O设备的通讯。在系统运行的过程中,组态王通过内嵌的设备管理程序完成与I/O设备的实时数据交换。

3、交通信号灯控制系统

交通信号灯控制系统即十字路口红、黄、绿交通信号灯的控制。控制要求如下:按下启动按钮,交通信号灯开始工作,东西方向绿灯亮56S,同时南北方向红灯亮60S,东西方向绿灯亮56S后,闪烁2S,然后过渡到东西方向黄灯,黄灯亮2S;之后东西方向红灯亮60S,南北方向绿灯亮56S后闪烁2S后,随之黄灯亮2S后灭......

I/O分配如下:

输入 输出

启动 X0 东西绿灯 Y1 南北红灯 Y5

停止 X1 东西黄灯 Y2 南北绿灯 Y6

东西红灯 Y3 南北黄灯 Y7

部分控制程序见图1。

4、PLC与上位计算机组态王软件的通讯

PLC与上位计算机的通讯可以利用高级语言编程来实现,但是用户必须熟悉互连的PLC及PLC网络采用的通讯协议,严格的按照通讯协议规定为计算机编写通讯程序,其对用户要求较高,而采用工控组态软件实现PLC与上位计算机之间的通讯,则相对简单因为工控组态软件中一般都提供了相关设备的通讯驱动程序,例如西门子公司的S7系列PLC与工控组态软件WinCC之间可进行连接实现PLC与上位计算机之间的通讯。

下面介绍组态王60与FX-0N-60MR PLC 之间通讯的实现步骤。FX-0N-60MR PLC采用RS232或RS422进行通讯,占用计算机的一个串行口。在不添加扩展卡的情况下可以使用编程口和计算机进行通讯。

第一、设备连接

利用PLC与计算机专用的F2-232CAB型RS232C电缆,将PLC通过编程口与上位计算机串口(COM口)连接,进行串行通讯。串行通讯方式使用”组态王计算机”的串口,I/O设备通过RS-232串行通讯电缆连接到”组态王计算机”的串口。

第二、设备配置

在组态王工程浏览器的工程目录显示区,点击”设备”大纲项下PLC与上位计算机所连串口(COM口),进行参数设置。

FX系列PLC编程口的通讯COM口参数设置:

然后在组态王浏览器目录内容显示区内双击所设COM口对应的”新建”图标,会d出”设备配置向导”对话框。在此对话框中完成与组态王通讯的设备的设置。

利用设备配置向导就可以完成串行通讯方式的I/O设备安装,安装过程简单、方便。在配置过程中,用户需选择I/O设备的生产厂家、设备型号、连接方式,为设备指定一个逻辑设备名,设定设备地址(FX系列PLC在使用编程口进行通讯时,不需要设备地址)

第三、构造数据库

数据库是”组态王”软件的核心部分,在工程管理器中,选择”数据库\数据词典”,双击”新建图标”,d出”变量属性”对话框。定义FX-0N-60MR PLC相应寄存器:

斜体字dddo、dddd、ddd等表示格式中可变部分,d表示十进制数,o表示八进制数,变化范围列于取值范围中。组态王按照寄存器名称来读取下位机相应的数据。组态王中定义的寄存器与下位机所有的寄存器相对应。如定义非法寄存器,将不被承认。如定义的寄存器在所用的下位机具体型号中不存在,将读不出数据。

第四、设计图形界面并建立动画连接

在组态王“画面”上创建十字路口红、黄、绿交通信号灯的控制示意图,见图2,建立启动和停止按钮,并将各个控制信号灯及启动和停止按钮与所建立相应变量关联,进行动画连接。

第五、系统运行

启动组态王运行系统TOUCHVIEW,运行交通信号灯的控制。将PLC开关指向“RUN”状态,按下启动按钮,观察交通信号灯系统的控制结果。实验结果表明,系统运行正常,动画效果良好。

5、结束语

PLC及PLC的多机联用与计算机的联网通信应用越来越多,它综合了计算机和PLC的长处,计算机作为上位机提供良好的人机界面,进行全系统的监控和管理,PLC作为下位机执行可靠有效的分散控制,利用工控组态软件实现PLC与上位计算机通信的方法简单易行,它降低了对用户的要求,大大缩短了设计周期,系统继承性较好,尤其对于大规模复杂控制系统来说,这当优点更为突出。

用电脑进行设计编程

一、接通起动按钮,信号灯开始工作,南北向红灯,东西向绿灯同时亮。

二、东西,南北四个黄灯同时闪烁5次(5秒)后,熄灭。

三、东西红灯亮,南北绿灯亮20秒。

四、东西,南北四个黄灯同时闪烁5次(5秒)后,熄灭。按如下波形图,连续循环。

五、按下停止按钮,所有指示灯全部熄灭。

东西和南北的时间不同步,楼主没有说得很清楚

你把时间流程说清楚我可以把代码写出来

//以下代码经过Keil C51软件调试通过

#include "reg51h" //头文件包含

//宏定义

#define uint unsigned int

#define uchar unsigned char

#define ON 0 //0的时候灯亮

#define OFF 1 //1的时候灯亮

//管脚定义

//南北道 黄灯亮3秒 红灯亮 30秒 黄灯3秒 绿灯38秒

//东西道 黄灯亮3秒 绿灯亮 28秒 黄灯3秒 红灯40秒

sbit PortDX_Yellow = P1^0; //东西方向黄灯

sbit PortDX_Red = P1^1; //东西方向红灯

sbit PortDX_Green = P1^2; //东西方向绿灯

sbit PortNB_Yellow = P1^3; //南北方向黄灯

sbit PortNB_Red = P1^4; //南北方向红灯

sbit PortNB_Green = P1^5; //南北方向绿灯

void delay(uint ms) // 毫秒级延时(AT89C52 @ 110592MHz)

{

uint ti;

while(ms--)

{

for(ti=0;ti<112;ti++){}//112

}

}

/==================== 主函数 ====================/

void main(void)

{

delay(400); //开机延时400ms

while(1)

{

PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮3秒

PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮3秒

delay(3000);

PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北红灯亮28秒

PortDX_Yellow = OFF;PortDX_Red = OFF;PortDX_Green = ON ;//东西绿灯亮28秒

delay(28000);

PortNB_Yellow = OFF;PortNB_Red = ON ;PortNB_Green = OFF;//南北红灯亮2秒

PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮2秒

delay(2000);

PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮1秒

PortDX_Yellow = ON ;PortDX_Red = OFF;PortDX_Green = OFF;//东西黄灯亮1秒

delay(1000);

PortNB_Yellow = ON ;PortNB_Red = OFF;PortNB_Green = OFF;//南北黄灯亮2秒

PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//东西红灯亮2秒

delay(2000);

PortNB_Yellow = OFF;PortNB_Red = OFF;PortNB_Green = ON ;//南北绿灯亮38秒

PortDX_Yellow = OFF;PortDX_Red = ON ;PortDX_Green = OFF;//东西红灯亮38秒

delay(3800);

}

}

/

       十字路口交通灯控制 C 程序

/

#define uchar unsigned char

#define uint unsigned int

#include <reg52h>

/定义控制位/

sbit    Time_Show_LED2=P2^5;//Time_Show_LED2控制位

sbit    Time_Show_LED1=P2^4;//Time_Show_LED1控制位

sbit EW_LED2=P2^3; //EW_LED2控制位

sbit EW_LED1=P2^2; //EW_LED1控制位

sbit SN_LED2=P2^1; //SN_LED2控制位

sbit SN_LED1=P2^0; //SN_LED1控制位

sbit    SN_Yellow=P1^6;//SN黄灯

sbit    EW_Yellow=P1^2;//EW黄灯

sbit    EW_Red=P1^3;//EW红灯

sbit    SN_Red=P1^7;//SN红灯

sbit    EW_ManGreen=P3^0;//EW人行道绿灯

sbit    SN_ManGreen=P3^1;//SN人行道绿灯

sbit    Special_LED=P2^6;//交通正常指示灯

sbit    Busy_LED=P2^7;//交通繁忙指示灯

sbit    Nomor_Button=P3^5;//交通正常按键

sbit    Busy_Btton=P3^6;//交通繁忙按键

sbit    Special_Btton=P3^7;//交通特殊按键 

sbit    Add_Button=P3^3;//时间加

sbit    Reduces_Button=P3^4;//时间减

bit     Flag_SN_Yellow; //SN黄灯标志位

bit     Flag_EW_Yellow;//EW黄灯标志位

char Time_EW;//东西方向倒计时单元

char Time_SN;//南北方向倒计时单元

uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式

uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量

uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段选码

uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};//交通信号灯控制代码

/延时子程序/

void Delay(uchar  a)

 {

  uchar i;

  i=a;

  while(i--){;}

 }

/显示子函数/

void Display(void)

 {

  char h,l;

  h=Time_EW/10;

  l=Time_EW%10;

       P0=table[l];

  EW_LED2=1;

  Delay(2);

  EW_LED2=0;

     P0=table[h];

  EW_LED1=1;

  Delay(2);

  EW_LED1=0;

h=Time_SN/10;

  l=Time_SN%10;

  P0=table[l];

  SN_LED2=1;

  Delay(2);

  SN_LED2=0;

     P0=table[h];

  SN_LED1=1;

  Delay(2);

  SN_LED1=0;

h= EW1/10;

  l= EW1%10;

  P0=table[l];

  Time_Show_LED1=1;

  Delay(2);

        Time_Show_LED1=0;

  P0=table[h];

  Time_Show_LED2=1;

  Delay(2);

     Time_Show_LED2=0;

}

/外部0中断服务程序/

void EXINT0(void)interrupt 0 using 1

 {

  EX0=0; //关中断

if(Add_Button==0) //时间加

       {

            EW1+=5;

            SN1+=5;

              if(EW1>=100)

      {

        EW1=99;

        SN1=79;

               }

            }

if(Reduces_Button==0) //时间减

       {

            EW1-=5;

            SN1-=5;

            if(EW1<=40)

              {

        EW1=40;

                 SN1=20;

               }

    

      }

if(Nomor_Button==0)//测试按键是否按下,按下为正常状态

        {

            EW1=60;

            SN1=40;

   EWL1=19;

   SNL1=19;

   Busy_LED=0;//关繁忙信号灯

   Special_LED =0;//关特殊信号灯

            }

if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态

        {

      EW1=45;

            SN1=30;

   EWL1=14;

   SNL1=14;

   Special_LED=0;//关特殊信号灯

   Busy_LED=1;//开繁忙信号灯

  

        }

if(Special_Btton==0)//测试按键是否按下,按下为特殊状态

        {

      EW1=75;

            SN1=55;

   EWL1=19;

   SNL1=19;

   Busy_LED=0;//关繁忙信号灯

      Special_LED =1;//开特殊信号灯

                 

     }     

  EX0=1;//开中断

 }

/T0中断服务程序/

 void timer0(void)interrupt 1 using 1

{

 static uchar count;

 TH0=(65536-50000)/256;

 TL0=(65536-50000)%256;

 count++;

 

 if(count==10)

 {

   if(Flag_SN_Yellow==1) //测试南北黄灯标志位

   {SN_Yellow=~SN_Yellow;}

   if(Flag_EW_Yellow==1)  //测试东西黄灯标志位

   {EW_Yellow=~EW_Yellow;}

 }

 if(count==20)

 {

 Time_EW--;

 Time_SN--;

 if(Flag_SN_Yellow==1)//测试南北黄灯标志位

     {SN_Yellow=~SN_Yellow;}

 if(Flag_EW_Yellow==1)//测试东西黄灯标志位

     {EW_Yellow=~EW_Yellow;}

 count=0;

 }

 

}

/主程序开始/

void main(void)

{

 Busy_LED=0;

 Special_LED=0;

 IT0=1; //INT0负跳变触发 

    TMOD=0x01;//定时器工作于方式1

 TH0=(65536-50000)/256;//定时器赋初值

 TL0=(65536-50000)%256;

 EA=1; //CPU开中断总允许

 ET0=1;//开定时中断

 EX0=1;//开外部INTO中断

    TR0=1;//启动定时

while(1)

{    /S0状态/

    EW_ManGreen=0; //EW人行道禁止

             SN_ManGreen=1;//SN人行道通行

                Flag_EW_Yellow=0;    //EW关黄灯显示信号

    Time_EW=EW; 

    Time_SN=SN;  

    while(Time_SN>=5)

       {P1=S[0];  //SN通行,EW红灯

           Display();}

    /S1状态/

       P1=0x00;

    while(Time_SN>=0)

      {Flag_SN_Yellow=1;  //SN开黄灯信号位

       EW_Red=1;      //SN黄灯亮,等待左拐信号,EW红灯

   

        Display();

    }

    /S2状态/

       Flag_SN_Yellow=0; //SN关黄灯显示信号

    Time_SN=SNL;

    while(Time_SN>=5)

    {P1=S[2];//SN左拐绿灯亮,EW红灯

     Display();}

/S3状态/

    P1=0x00;

    while(Time_SN>=0)

      {Flag_SN_Yellow=1; //SN开黄灯信号位

       EW_Red=1;      //SN黄灯亮,等待停止信号,EW红灯

       

       Display();}

      /赋值/

    EW=EW1;

    SN=SN1;

    EWL=EWL1;

    SNL=SNL1;

    /S4状态/

    EW_ManGreen=~EW_ManGreen;//EW人行道通行

             SN_ManGreen=~SN_ManGreen;//SN人行道禁止

    Flag_SN_Yellow=0;  //SN关黄灯显示信号

    Time_EW=SN;

    Time_SN=EW;

       while(Time_EW>=5)

       {P1=S[4];  //EW通行,SN红灯

     Display();}

    /S5状态/

    P1=0X00;

    while(Time_EW>=0)

      {Flag_EW_Yellow=1;//EW开黄灯信号位

       SN_Red=1;//EW黄灯亮,等待左拐信号,SN红灯 

       Display();}

    /S6状态/

    Flag_EW_Yellow=0;     //EW关黄灯显示信号

    Time_EW=EWL;

    while(Time_EW>=5)

    {P1=S[6];//EW左拐绿灯亮,SN红灯

     Display();}

/S7状态/

    P1=0X00;

    while(Time_EW>=0)

      {Flag_EW_Yellow=1; //EN开黄灯信号位

       SN_Red=1;//EW黄灯亮,等待停止信号,SN红灯 

       Display();}

   

        /赋值/

       EW=EW1;

    SN=SN1;

    EWL=EWL1;

    SNL=SNL1;

   }

}

以上就是关于求单片机交通灯控制系统设计的程序(最后有中文解析)全部的内容,包括:求单片机交通灯控制系统设计的程序(最后有中文解析)、设计一个交通灯控制电路程序(单片机)、求 基于PLC的智能交通信号灯系统设计 毕业设计论文及FX2N-32MT程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存