您当前的位置:五五电子网电子知识应用领域交通控制指示交通灯单片机汇编语言的编程 正文
交通灯单片机汇编语言的编程

交通灯单片机汇编语言的编程

点击数:7726 次   录入时间:03-04 11:43:57   整理:http://www.55dianzi.com   交通控制指示

  一、交通灯项目的任务分析
  
  假设一个十字路口为东西南北走向,各设置红、黄、绿3种信号灯,南北方向由P1.0~P1.2口控制,其中P1.0口为红灯,P1.1口为黄灯,P1.2口为绿灯。东西方向由P1.3~P1.5口控制,其中P1.3口为红灯,P1.4口为黄灯,P1.5口为绿灯。

  本交通灯控制系统由三项任务组成:

  1.交通灯正常情况
  
  ①南北绿灯,东西红灯,20s。

  ②南北黄灯,东西红灯,3s。

  ③东西绿灯,南北红灯,10s。

  ④东西黄灯,南北红灯,3s。然后循环。

  2.数码管倒计时显示
  
  交通灯亮时,数码管显示亮灯时间。数码管采用动态显示,P0口连接数码管的段码,P2口  连接数码管的位码。

  3.交通灯紧急情况
  
  当有救护车、消防车等特殊车辆通过时,用按键控制两个方向均亮红灯,同时蜂鸣器发出报警声。等救护车和消防车通过后,交通灯再恢复正常情况。按键接P3.2口,蜂鸣器接P3.3口。

  交通灯外围器件与单片机I/O口的连接如下图所示。

交通灯外围器件与单片机I/O口的连接

  二、三项任务的独立编程
  
  1.交通灯正常情况
  
  这个任务最简单,通行时间可以通过调用延时程序实现。程序流程如下图所示。

  南北通20s,东西通l0s,黄灯3s,软件延时。

  四种亮灯情况顺序完成,然后就是循环。

  2.数码管倒计时显示
  
  一般情况下,通行时间不超过100s,所以用两位数码管显示计时时间足够了。单独写数码管倒计时程序也不困难,下面是一个倒计时60s的程序思路:

  60秒倒计时,循环计数。用定时器中断产生秒信号。

  这个程序大体由三部分组成,如下图所示。

  首先定义一个秒存储单元:MIAOEQU30H。程序开始时给它赋初值:MOVMIAO,#60。然后,我们在1s定时中断子程序中加入一个减1指令,再进行判断,语句如下:

  这样就可以得到一个60s倒计时程序。

  3.交通灯紧急情况
  
  紧急情况更容易实现,它就是产生双向红灯信号和报警声。程序流程如下图所示。

  到目前为止,这三个任务都可以单独实现了。下面我们就看看怎样让这些任务协调工作,来完成交通灯项目的吧。

  三、交通灯项目的子程序化、模块化的编程方法
  
  首先,要把上面的三个程序子程序化,以方便主程序调用。这就好像我们把三个有独立功能的程序分别打包包装起来,等到想用的时候随时都可以拎出来使用一样。各种不同功能的程序子程序化后,我们就可以很方便地把这些功能组合起来,从而使单片机应用系统的功能更加强大。

  我们先看第一个任务,交通灯正常情况有四种状态,我们在子程序化时要把这些状态区分开来,在这里我们考虑使用散转语句。另外,用软件延时会影响CPU的响应时间,所以改为定时器延时,延时时间我们要统一考虑,所以在这里就不出现了。改造后的交通灯正常情况的子程序如下:

  四个具体的子程序在这里从略,这样交通灯正常情况的程序我们就可以随时调用了。

  第二个任务是数码管的1s倒计时显示程序,这个程序的子程序化部分主要是在它的显示程序部分,而其他部分可以进行统一整合,数码管显示程序的子程序化我们只需要让它显示一遍,以后在主程序中调用就可以了。数码管显示部分的子程序格式如下:XIANSHI::数码显示秒数子程序从略。

  第三个任务是交通灯紧急情况,这个任务是需要外界触发响应的,所以我们使用了外部中断子程序。我们要把紧急情况下的双向红灯,报警声都封装在外部中断程序里面,因为紧急情况解除,交通灯还要回到正常情况。而这里的报警声程序,我们也可以把它写成子程序进行调用。紧急情况子程序如下:

  到此为止,我们完成了三个分立程序的子程序化工作,接着我们就要对这些子程序进行有序的整合,以便完成交通灯项目的目标要求。

  整体思路是这样的:程序大致可分为主程序和子程序两部分。主程序里又可分为两部分,第一部分是单片机的初始化设置,如定义你所使用的存储器单元,使用定时器要进行定时器设置,使用中断妻进行中断设置,堆栈指针的设置及各项任务的初始状态等等。第二部分是主程序的主体部分,它要完成项目中的各项任务。一般我们把它写成一个循环语句,而各种任务我们只需要在这个循环语句里进行调用就可以了。如我们的交通灯项目,它的主要任务就是交通灯的四种亮灯状态及数码管的倒计时显示。我们首先要初始化一种亮灯状态,然后在循环语句里调用数码管倒计时显示子程序,接下来我们就检测倒计时时间是否到0,如果没到0,程序继续循环进行,如果到0,我们就调用散转子程序,程序执行下一种亮灯状态,这样一直循环下去,完成亮灯状态及数码管显示。

  子程序部分包含了单片机的各种功能程序,它们之间相互独立,排列顺序也不分先后,主要是供主程序调用,如我们这里的数码管显示子程序与延时子程序。中断服务是单片机的特殊功能程序,中断产生是随机的,它不为主程序所调用,所以我们的任务三一一交通灯紧急情况就是应用外部中断服务程序来实现的。只要外界有触发信号(按键接P3.2口),CPU就会终止主程序的工作,转而执行中断服务程序,直到中断结束。

  下面是交通灯项目程序的整体思路说明,希望这个说明有助于理解交通灯项目程序,有助于理解子程序化、模块化的编程方法。我们先看主程序的结构。

  从主程序中我们可以看出来,主程序由两部分组成,第一部分是对单片机进行统一的初始化设置。第二部分则是一个循环语句,各种任务都包含在这个循环语句里。如我们这个项目里的任务一、任务二,因为任务三是由外界触发响应的,所以我们把它放到了外部中断子程序里。这就是主程序的结构,而余下的部分就是我们所需要调用的子程序了,让我们看看到底有哪些需要调用的子程序吧。

  这就是交通灯项目程序的整体结构,而原程序与这个结构则是一致的。




本文关键字:单片机  交通灯  交通控制指示应用领域 - 交通控制指示

《交通灯单片机汇编语言的编程》相关文章>>>