基于单片机的交通灯信号控制器设计.docx

上传人:b****6 文档编号:15694925 上传时间:2023-07-06 格式:DOCX 页数:16 大小:198.28KB
下载 相关 举报
基于单片机的交通灯信号控制器设计.docx_第1页
第1页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第2页
第2页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第3页
第3页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第4页
第4页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第5页
第5页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第6页
第6页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第7页
第7页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第8页
第8页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第9页
第9页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第10页
第10页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第11页
第11页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第12页
第12页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第13页
第13页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第14页
第14页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第15页
第15页 / 共16页
基于单片机的交通灯信号控制器设计.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的交通灯信号控制器设计.docx

《基于单片机的交通灯信号控制器设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯信号控制器设计.docx(16页珍藏版)》请在冰点文库上搜索。

基于单片机的交通灯信号控制器设计.docx

基于单片机的交通灯信号控制器设计

基于单片机的交通灯信号控制器设计(含源程序和电路图)

设计一个基于单片机的交通灯信号控制器。

已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管,在南北方向也有两个数码管。

要求交通灯按照表1进行显示和定时切换,并要求在数码管上分别倒计时显示东西、南北方向各状态的剩余时间。

表1交通灯的状态切换表

南北方向

东西方向

序号

状态

序号

状态

1

绿灯亮25秒,红、黄灯灭

1

红灯亮30秒,绿、黄灯灭

2

黄灯亮5秒,红、绿灯灭

3

红灯亮30秒,绿、黄灯灭

2

绿灯亮25秒,红、黄灯灭

3

黄灯亮25秒,红、绿灯灭

回到状态1

回到状态1

3.2.1模块1:

系统设计

(1)任务分析与整体设计思路

试题要求实现的功能主要包括计时功能、动态扫描以及状态的切换等几部分。

计时功能:

要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时1秒中的功能。

当计时每到1秒钟后,东西、南北信号灯各状态的暂存剩余时间的变量减1。

当暂存剩余时间的变量减到0时,切换到下一个状态,同时将下一个状态的初始的倒计时值装载到计时变量中。

开始下一个状态,如此循环重复执行。

动态扫描:

需要使用4个数码管分别显示东西、南北的倒计时数字,将暂存各状态剩余时间的数字从变量中提取出“十位”和“个位”,用动态扫描的方式在数码管中显示。

整个程序依据定时器的溢出数来计时,每计时1S则相应状态的剩余时间减1,一直减到0时触发下一个状态的开始。

  

(2)单片机型号及所需外围器件型号,单片机硬件电路原理图

图3-5交通灯硬件电路原理图

选用MCS51系列AT89S51单片机作为微控制器,选择两个四联的共阴极数码管组成8位显示模块,由于AT89S51单片机驱动能力有限,采用两片74HC244实现总线的驱动,一个74HC244完成共阴极数码管位控线的控制和驱动,另一个74HC244完成数码管的7段码输出,在7段码输出口上各串联一个100欧姆的电阻对7段数码管限流。

用P3口的P3.0-P3.5完成发光二极管的控制,实现交通灯信号的显示,每个发光二极管串联500欧姆电阻起限流作用。

硬件电路原理图如图3-5所示。

(3)程序设计思路,单片机资源分配以及程序流程

①单片机资源分配

单片机P3口的P3.0-P3.1引脚用作输出,控制发光二极管的显示。

在计时模块中,需要定义两个数组变量(init_sn[3],init_ew[3])来存储东西、南北两个方向在不同状态中倒计时的初始值,题目中每个方向的交通灯共有3种显示状态,因此数组元素个数为3。

还需要定义两个变量(cnt_sn,cnt_ew)暂存东西、南北两个方向的倒计时剩余时间。

   在状态的切换中,为了明确当前处于哪种状态,东西、南北方向各设置一个状态变量(state_val_sn,state_val_ew),当倒计时的剩余时间到零时,状态变量增1,表示启动下一个状态,当该变量增到3时变为0,回到序号为1的状态。

 ②程序设计思路

在设计中,由于没有键盘功能,因此只涉及定时计数和动态扫描功能。

主程序将变量初始化之

后,设置单片机定时器和中断特殊功能寄存器的初始值,将定时器T1的工作方式设置为8位自动

装载模式,定时器每隔250us产生一次溢出。

在初始化变量与寄存器后,主程序进入一个循环结构,在循环中只做动态扫描的工作,根据东西、南北两向的剩余时时间进行动态扫描显示。

   计时以及状态的切换通过定时器的中断服务程序来实现,在中断服务程序中,每计时到一秒时,则各方向当前状态的剩余时间减1,一直减到0时触发下一个状态的开始,改变交通灯的指示。

 ③程序流程

(4)软硬件调试方案

    软件调试方案:

伟福软件中,在“文件\新建文件”中,新建C语言源程序文件,编写相应的程序。

在“文件\新建项目”的菜单中,新建项目并将C语言源程序文件包括在项目文件中。

 在“项目\编译”菜单中将C源文件编译,检查语法错误及逻辑错误。

在编译成功后,产生以“*.hex”和“*.bin”后缀的目标文件。

硬件调试方案:

在设计平台中,将单片机的P3.0-P3.5分别与独立式键盘的相应位通过插线连接起来。

在伟福中将程序文件编译成目标文件后,运行“MCU下载程序”,选择相应的flash数据文件,点击“编程”按钮,将程序文件下载到单片机的Flash中。

然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成试题的内容。

3.2.2 程序设计(仅供参考的C语言源程序)

//晶振:

11.0592M T1-250微秒溢出一次

/*变量的定义:

 show_val_sn,show_val_ew:

 显示的值0-59

 state_val_sn,state_val_ew:

状态值南北方向0-绿灯亮;1-黄灯亮;2-红灯亮

 T1_cnt:

   定时器计数溢出数

 cnt_sn,cnt_ew:

  倒计时的数值

 init_sn[3],init_ew[3]倒计时

 led_seg_code:

数码管7段码

*/

#include"reg51.h"

sbitSN_green=P3^2;//南北方向绿灯

sbitSN_yellow=P3^1;//南北方向黄灯

sbitSN_red=P3^0;//南北方向红灯

sbitEW_green=P3^5;//东西方向绿灯

sbitEW_yellow=P3^4;//东西方向黄灯

sbitEW_red=P3^3;//东西方向红灯

unsignedchardatacnt_sn,cnt_ew;

unsignedint dataT1_cnt;

unsignedchardatastate_val_sn,state_val_ew;

charcodeled_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

charcodeinit_sn[3]={24,4,29};

charcodeinit_ew[3]={29,24,4};

//------------------------

voiddelay(unsignedinti)//延时

{ while(--i); }

//------------------------

voidled_show(unsignedintu,unsignedintv)

{unsignedchari;

 i=u%10;      //暂存个位

 P0=led_seg_code[i];

 P2=0xbf;

 delay(100); //延时

 i=u%100/10;  //暂存十位

 P0=led_seg_code[i];

 P2=0x7f;

 delay(100); //延时

 i=v%10;      //暂存个位

 P0=led_seg_code[i];

 P2=0xfe;

 delay(100); //延时

 i=v%100/10;  //暂存十位

 P0=led_seg_code[i];

 P2=0xfd;

 delay(100); //延时

}

//-------------------------

void timer1()interrupt3    //T1中断

{T1_cnt++;

 if(T1_cnt>3999)     //如果计数>3999,计时1s

 { T1_cnt=0;

    if(cnt_sn!

=0)//南北方向计时

    {cnt_sn--;}

    else

    {state_val_sn++;

      if(state_val_sn>2)state_val_sn=0;

      cnt_sn=init_sn[state_val_sn]; 

      switch(state_val_sn)//根据状态值,刷新各信号灯的状态

       {case0:

SN_green=0;//南北方向绿灯

                 SN_yellow=1;//南北方向黄灯

                 SN_red=1;//南北方向红灯

                 break;

         case1:

SN_green=1;//南北方向绿灯

                 SN_yellow=0;//南北方向黄灯

                SN_red=1;//南北方向红灯

                break;

         case2:

SN_green=1;//南北方向绿灯

                SN_yellow=1;//南北方向黄灯

                SN_red=0;//南北方向红灯

                break;

       }    

    }

    if(cnt_ew!

=0)//东西方向计时

    {cnt_ew--;}

    else

    {state_val_ew++;

      if(state_val_ew>2)state_val_ew=0;

      cnt_ew=init_ew[state_val_ew];

      switch(state_val_ew)//根据状态值,刷新各信号灯的状态

      {case0:

EW_green=1;//东西方向绿灯

                EW_yellow=1;//东西方向黄灯

                EW_red=0;//东西方向红灯

                break;

        case1:

EW_green=0;//东西方向绿灯

                EW_yellow=1;//东西方向黄灯

                EW_red=1;//东西方向红灯

                break;

        case2:

EW_green=1;//东西方向绿灯

                EW_yellow=0;//东西方向黄灯

                EW_red=1;//东西方向红灯

                break;

       }

    }

 }

}

//-------------------------

main()

{//初始化各变量

 cnt_sn=init_sn[0];

 cnt_ew=init_ew[0];

 T1_cnt=0;

 state_val_sn=0;//启动后,默认工作在序号为1的状态

 state_val_ew=0;

//初始化各灯的状态

 SN_green=0;//南北方向绿灯亮

 SN_yellow=1;//南北方向黄灯灭

 SN_red=1;//南北方向红灯灭

 EW_green=1;//东西方向绿灯灭

 EW_yellow=1;//东西方向黄灯灭

 EW_red=0;//东西方向红灯亮

//初始化51的寄存器

 TMOD=0x20;//用T1计时8位自动装载定时模式

 TH1=0x19;//0x4b;//500微秒溢出一次;  250=(256-x)*12/11.0592->x=230.4

 TL1=0x19;

 EA=1;    //开中断

 ET1=1;

 TR1=1;   //开定时器T1

while

(1)

{ led_show(cnt_sn,cnt_ew);}}

//主程序结束

SECOND1EQU30H;东西路口计时寄存器

SECOND2EQU31H;南北路口计时寄存器

DBUFEQU40H;显示码缓冲区1

TEMPEQU44H;显示码缓冲区2

LED_G1BITP2.1;东西路口绿灯

LED_Y1BITP2.2;东西路口黄灯

LED_R1BITP2.3;东西路口红灯

LED_G2BITP2.4;南北路口绿灯

LED_Y2BITP2.5;南北路口黄灯

LED_R2BITP2.6;南北路口红灯

ORG0000H

LJMPSTART

ORG0100H

START:

MOVTMOD,#01H;置T0为工作方式1

MOVTH0,#3CH;置T0定时初值50ms

MOVTL0,#0B0H

CLRTF0

SETBTR0;启动T0

CLRA

MOVP1,A;关闭不相关的LED

;***************************************************

LOOP:

MOVR2,#20;置1s计数初值,50ms*20=1s

MOVR3,#20;红灯亮20s

MOVSECOND1,#25;东西路口计时显示初值25s

MOVSECOND2,#25;南北路口计时显示初值25s

LCALLDISPLAY

LCALLSTATE1;调用状态1

WAIT1:

JNBTF0,WAIT1;查询50ms到否

CLRTF0

MOVTH0,#3CH;恢复T0定时初值50ms

MOVTL0,#0B0H

DJNZR2,WAIT1;判断1s到否?

未到继续状态1

MOVR2,#20;置50ms计数初值

DECSECOND1;东西路口显示时间减1s

DECSECOND2;南北路口显示时间减1s

LCALLDISPLAY

DJNZR3,WAIT1;状态1维持20s

;*******************************************

MOVR2,#5;置50ms计数初值5*4=20

MOVR3,#3;绿灯闪3s

MOVR4,#4;闪烁间隔200ms

MOVSECOND1,#5;东西路口计时显示初值5s

MOVSECOND2,#5;南北路口计时显示初值5s

LCALLDISPLAY

WAIT2:

LCALLSTATE2;调用状态2

JNBTF0,WAIT2;查询50ms到否

CLRTF0

MOVTH0,#3CH;恢复T0定时初值50ms

MOVTL0,#0B0H

DJNZR4,WAIT2;判断200ms到否?

未到继续状态2

CPLLED_G1;东西绿灯闪

MOVR4,#4;闪烁间隔200ms

DJNZR2,WAIT2;判1s到否?

未到继续状态2

MOVR2,#5;置50ms计数初值

DECSECOND1;东西路口显示时间减1s

DECSECOND2;南北路口显示时间减1s

LCALLDISPLAY

DJNZR3,WAIT2;状态2维持3s

;****************************************

MOVR2,#20;置50ms计数初值

MOVR3,#2;黄灯闪2s

MOVSECOND1,#2;东西路口计时显示初值2s

MOVSECOND2,#2;南北路口计时显示初值2s

LCALLDISPLAY

WAIT3:

LCALLSTATE3;调用状态3

JNBTF0,WAIT3;查询100ms到否

CLRTF0

MOVTH0,#3CH;恢复T0定时初值100ms

MOVTL0,#0B0H

DJNZR2,WAIT3;判断1s到否?

未到继续状态3

MOVR2,#20;置100ms计数初值

DECSECOND1;东西路口显示时间减1s

DECSECOND2;南北路口显示时间减1s

LCALLDISPLAY

DJNZR3,WAIT3;状态3维持2s

;*******************************************

MOVR2,#20;置50ms计数初值

MOVR3,#20;红灯闪20s

MOVSECOND1,#25;东西路口计时显示初值25s

MOVSECOND2,#25;南北路口计时显示初值25s

LCALLDISPLAY

WAIT4:

LCALLSTATE4;调用状态4

JNBTF0,WAIT4;查询100ms到否

CLRTF0

MOVTH0,#3CH;恢复T0定时初值100ms

MOVTL0,#0B0H

DJNZR2,WAIT4;判断1s到否?

未到继续状态4

MOVR2,#20;置100ms计数初值

DECSECOND1;东西路口显示时间减1s

DECSECOND2;南北路口显示时间减1s

LCALLDISPLAY

DJNZR3,WAIT4;状态4维持20s

;*******************************************

MOVR2,#5;置50ms计数初值

MOVR4,#4;红灯闪20ms

MOVR3,#3;绿灯闪3s

MOVSECOND1,#5;东西路口计时显示初值5s

MOVSECOND2,#5;南北路口计时显示初值5s

LCALLDISPLAY

WAIT5:

LCALLSTATE5;调用状态5

JNBTF0,WAIT5;查询100ms到否

CLRTF0

MOVTH0,#3CH;恢复T0定时初值100ms

MOVTL0,#0B0H

DJNZR4,WAIT5;判断200ms到否?

未到继续状态5

CPLLED_G2;南北绿灯闪

MOVR4,#4;闪烁200ms

DJNZR2,WAIT5;判断1s到否?

未到继续状态5

MOVR2,#5;置100ms计数初值

DECSECOND1;东西路口显示时间减1s

DECSECOND2;南北路口显示时间减1s

LCALLDISPLAY

DJNZR3,WAIT5;状态5维持3s

;****************************************

MOVR2,#20;置50ms计数初值

MOVR3,#2;红灯闪2s

MOVSECOND1,#2;东西路口计时显示初值2s

MOVSECOND2,#2;南北路口计时显示初值2s

LCALLDISPLAY

WAIT6:

LCALLSTATE6;调用状态6

JNBTF0,WAIT6;查询100ms到否

CLRTF0

MOVTH0,#3CH;恢复T0定时初值100ms

MOVTL0,#0B0H

DJNZR2,WAIT6;判断1s到否?

未到继续状态6

MOVR2,#20;置100ms计数初值

DECSECOND1;东西路口显示时间减1s

DECSECOND2;南北路口显示时间减1s

LCALLDISPLAY

DJNZR3,WAIT6;状态6维持2s

LJMPLOOP;大循环

;**********************************************

STATE1:

;状态1

SETBLED_G1;东西路口绿灯亮

CLRLED_Y1

CLRLED_R1

CLRLED_G2

CLRLED_Y2

SETBLED_R2;南北路口红灯亮

RET

STATE2:

;状态2

CLRLED_Y1

CLRLED_R1

CLRLED_G2

CLRLED_Y2

SETBLED_R2;南北路口红灯亮

RET

STATE3:

;状态3

CLRLED_G1

CLRLED_R1

CLRLED_G2

CLRLED_Y2

SETBLED_R2;南北路口红灯亮

SETBLED_Y1;东西路口绿灯亮

RET

STATE4:

;状态4

CLRLED_G1

CLRLED_Y1

SETBLED_R1;东西路口红灯亮

SETBLED_G2;南北路口绿灯亮

CLRLED_Y2

CLRLED_R2

RET

STATE5:

;状态5

CLRLED_G1

CLRLED_Y1

SETBLED_R1;东西路口红灯亮

CLRLED_Y2

CLRLED_R2

RET

STATE6:

;状态6

CLRLED_G1

CLRLED_Y1

SETBLED_R1;东西路口红灯亮

CLRLED_G2

CLRLED_R2

SETBLED_Y2;南北路口红灯亮

RET

DISPLAY:

;数码显示

MOVA,SECOND1;东西路口计时寄存器

MOVB,#10;16进制数拆成两个10进制数

DIVAB

MOVDBUF+3,A

MOVA,B

MOVDBUF+2,A

MOVA,SECOND2;南北路口计时寄存器

MOVB,#10;16进制数拆成两个10进制数

DIVAB

MOVDBUF+1,A

MOVA,B

MOVDBUF,A

MOVR0,#DBUF

MOVR1,#TEMP

MOVR7,#4

DP10:

MOVDPTR,#LEDMAP

MOVA,@R0

MOVCA,@A+DPTR

MOV@R1,A

INCR0

INCR1

DJNZR7,DP10

MOVR0,#TEMP

MOVR1,#4

DP12:

MOVR7,#8

MOVA,@R0

DP13:

RLCA

MOVP3.0,C

CLRP3.1

SETBP3.1

DJNZR7,DP13

INCR0

DJNZR1,DP12

RET

LEDMAP:

DB3FH,06H,5BH,4FH,66H,6DH;0,1,2,3,4,5

DB7DH,07H,7FH,6FH,77H,7CH;6,7,8,9,A,B

DB58H,5EH,7BH,71H,0,40H;C,D,E,F,,-

END

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 计算机软件及应用

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2