交通信号灯程序调试步骤

交通信号灯程序调试步骤
交通信号灯程序调试步骤

交通信号灯调试

一、线路板的检测和调试

1.硬件调试

硬件调试是利用基本测试仪器(万用表、示波器等),检查用户系统硬件中存在的故障。其中硬件调试可分为静态调试与动态调试两步进行

1.1静态调试

静态调试是在用户系统未工作时的一种硬件检测。

第一步:目测:

检查外部的各种元件或者是电路是否有断点。

第二步:用万用表测试:

先用万用表测试目测中有疑问的连接点,再监测电源和地线是否正确、可靠连接已经他们之间是否有短路现象,发现问题后及时修改,以免通电试验后造成线路板和元器件的毁坏。

第三步:通电检测:

给焊接好的线路板通电,通电后先目测有无异常现象(冒烟,火花现象),然后用手背测试大功率器件和集成电路等有无温升,若出现以上现象,立即断电;

检测所有有插座的器件的电源和地是否符合要求;

在本项目中需要测试的有:

U1-40=5V,U1-31=5V,U1-9=0V(S1没按下),U1-9=5V(S1按下),还有SB1—SB4 4个按键分别是按下时=0V,弹起时=5V;

利用导线分别把LED、蜂鸣器、数码管接到相应的低电平,测试线路和元器件是否正常工作。

1.2动态调试

动态调试是在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障、器件连接逻辑错误等的一种硬件检查。动态调试的一般方法是由近及远、由分到合。由分到合是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关的器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上。当各块电路无故障后,将各电路逐块加入系统中,

在对各块电路功能及各电路间可能存在的相互联系进行调试。由分到合的调试既告完成。由近及远是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试。调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。

2软件调试

在本项目中,我们首先将教材《单片机应用技术》中的第二页的“信号灯的闪烁控制”的程序录入,并烧录到芯片中去,然后通电试验,这是合格的线路板的状态时所有发光二极管闪烁,按下复位按键S1,系统复位。

下面我详细介绍下程序录入、烧录的整个过程,在这个过程中需要一个编译软件和一个烧录器,在这儿我们的编译软件采用的是万利电子的“MedWin V2.39中文版”烧录器采用的是致远电子“EasyPRO 80B”。

2.1 编写程序

双击桌面的“MedWin V2.39中文版”图标,弹出对话框:

在这儿,我们不是选用的万利电子的仿真器,所以我们选择“模拟仿真”选项后,单击“模拟仿真”就会进入MedWin V2.39中文版的操作界面,在此时如果是第一次使用这个软件,他会首先弹出一个对话框:

这个对话框的意思是提示你的文件的保存的路径,和文件名的注意事项,如果不需要修改点击“确定”,后进入MedWin V2.39中文版的操作界面,如图:执行菜单命令【文件】/【新建】,出现如图所示的选择类型对话框;

在选择合适的路径和合适的文件名后,如下图:

单击【打开】按钮或按【Enter】键确认,就进入程序的录入界面,如图:在这儿就可以录入教材《单片机应用技术》中的第二页的“信号灯的闪烁控制”的程序了。录入结束后,执行菜单命令【文件】/【保存】,后保存下录入的程序(在以后所有的时候,在多保存下,放置意外出现时,因没有保存造成程序的丢失)。

在录入结束后要进行汇编,才能把源程序转换成由机器语言构成的目标程序,执行菜单命令【项目管理】/【编译/汇编】(或Ctrl+F7),即可完成对当前源程序的“编译/汇编”。

程序经“编译/汇编”后,观察屏幕下方的消息窗口,会出现纠错信息,提

示是否存在错误、错误出现的位置及错误的类型和数量等,可根据信息提示对源程序的错误进行纠正,再重新进行“编译/汇编”直至错误信息数量为“0”。

执行菜单命令【项目管理】/【输出Intel Hex文件】,生产相应的目标程序,再将目标程序代码写入到单片机芯片内部的程序存储器中。

2.2 烧录程序

双击桌面的“EASYPRO PROGRAMMER”图标,弹出对话框:

这个对话框表示烧录器没有连接或者没有安装USB驱动程序(安装驱动程序,将C:\EasyPROs\UsbDriver\UsbDriver.EXE。运行后,重新练级一次USB接口即可)。

再双击桌面的图标后,弹出对话框:

第一步:选择合适的芯片

单击界面左边的“选择”按键,弹出对话框:

选择的顺序是右-左-中,首先选择右边的类型中的“MCU”,然后选择左边的厂商中的“ATMEL-AT89SXX”,最后选择中间器件的“AT89S52”。

单击【选择】按钮或按【Enter】键确认,就回到原来的操作界面,这时候我们发现在界面的下方的芯片名称一栏已经改成为“AT89S52”了;

第二步:导入我们编写好的程序

单击左边的“打开”按键,弹出对话框如下:

选择我们刚才生产的“*.Hex”文件后,单击【打开】按钮或按【Enter】键确认,就回到原来的操作界面,这时候我们发现在界面的打开的文件一栏已经改成为我们上一步输出的文件的路径了;

第三步:烧录程序

单击上方的“操作一键通”按键,弹出对话框如下:

单击【运行】按钮或按【Enter】键确认,就开始进行烧录,在烧录结束后界面如下:

若出现下图则表示芯片没有插好或者插反,烧录器没有正确连接,检查无误后,再次烧录,知道正确位置后,将芯片从烧录器中拿出,插入到我们已经焊接好的线路板的插座中。

2.3 测试

程序录入好之后,将芯片安插到线路板中,通电后,所有的发光管闪烁,按下复位按键,程序重新运行,表示你的硬件无误;否则,表示你的硬件焊接有

误,对照原理图,自己检查,直至无误为止。

二、程序的编写和调试

交通信号灯,也是按照一定的时序点亮、熄灭信号灯,因此也可以看成是一种彩灯控制器,下表中列出了交通信号灯的时序,把它编制成一个表格,按照时

序查表,输出,就可以实现交通信号灯的设计。

1、当单片机开始工作,东西方向为绿灯,南北方向为红灯。当任意方向绿

灯变化为红灯时,该方向的黄灯同时闪烁6次。

LED的工作原理:如原理图所示,当我们控制的单片机的P1口为高电平时,相当于将LED的负极接+5V,LED两端的电压差为0V,这时候LED不能导通,所

以它也不能发光;反之,当我们控制单片机的P1口为低电平的时候,LED的两

端就有了正向电压差,这时候LED导通,所以他发光。电阻的作用限流,保证该

支路的电流不会对LED和单片机造成损害。

根据LED的工作原理和本项目的要求,我们将LED的变化制成表格如下:

我们已经将本项目的步骤一的LED的变化制作成表格了,下面我们就按照表格中的步骤编先绘制程序的流程图:

程序流程图

我们按照程序流程图可以轻松的开始写下我们的程序了:

注意事项: 1、写程序的时候格式一定要注意,主程序和子程序要分开;

2、各个程序一定要加以注释,方便我们以后的调试;

3、主要在调用子程序或者循环的时候,跳转的位置和一些常用的变量的赋值的问题。

到此为止,只要我们按照老师的要求,焊接和录入都没有问题了,现在本项目的第一步就已经完成了,而我们这儿的延时是用的程序的延时,在精度要求不高的情况是可以的,在要求时间比较准确的地方就不适合了,而89S52给我们提供了2个精准的内部的定时器和计数器,下一章我们将要用到这些了。

2、利用89S52内部的定时器和计数器来控制两个方向的信号灯的亮灭时间,其中东西方向变化时间为15S,南北方向变化时间为30s,当时间少于6s时,变为黄灯闪烁,每秒闪烁一次。

2.1 定时器和计数器简介

89S51单片机内部有两个16位定时器/计数器,即定时/计数器T'0和定时/计数器T1。它们都具有定时和计数功能,可用于定时或延时控制,对外部事件进行检测、计数等。

定时/计数器 T0 由特殊功能寄存器TH0、TL0(字节地址分别为8CH和8AH)构成,TH0为高8位,TL0为低8位。定时/计数器T1由特殊功能寄存器TH1、TL1(字节地址分别为 8DH 和 8BH)构成,TH1为高8位,TL1为低8位。其内部还有一个 8 位的定时器方式寄存器 TMOD 和一个 8位的定时器控制寄存器TCON。TMOD 主要是用于选定定时/计数器的工作模式与工作方式,TCON 主要是用于控制定时/计数器的启动和停止。这些寄存器之间是通过内部总线和控制逻辑电路连接起来的。

定时/计数器从硬件电路上来说,就是一个16位的加法计数器,按照其计数脉冲的来源不同,分成两种工作模式:定时与计数。

当定时/计数器工作在定时方式时,输入的时钟脉冲是由晶体振荡器的输出经12 分频后得到的,所以定时器也可看作是对单片机机器周期的个数的计数器,当晶体振荡器确定后,机器周期的时间也就确定了,这样就实现了定时功能。以12M 的晶振为例,一个机器周期就是1μs,这是在此晶振周期下最小的定时时间。

当定时/计数器工作在计数方式时,外部事件是通过引脚T0(P3.4)和T1(P3.5)输入的,外部脉冲的下降沿触发计数。

定时/计数器结构图

2.2定时/计数器相关寄存器

51 系列单片机的定时/计数器是一种可编程部件,在定时/计数器开始工作

之前,CPU 必须将一些命令(称为控制字)写入该定时/计数器,这个过程称为定时/计数器的初始化。在初始化程序中,要将工作方式控制字写入定时方式寄存器 TMOD,工作状态控制字(或相关位)写入控制寄存器 TCON。

2.2.1定时方式寄存器 TMOD

特殊功能寄存器 TMOD 为定时/计数器的方式控制寄存器,占用的字节地址为 89H ,不可以进行位寻址,如果要定义定时/计数器的工作方式,需要采用字节操作指令赋值。该寄存器中每位的定义如下所示。其中高 4 位用于定时/计数器 T1,低 4 位用于定时器/计数T0。

下面介绍与定时器/计数T0 相关的TMOD的 4低位。

(1)GATE——门控位。

(GATE)=0时,用软件使运行控制位 TR0 (定时/计数器控制寄存器 TCON.4)置1来启动定时/计数器运行;

(GATE)=1时,由TR0和外部中断引脚(P3.2)共同启动定时/计数器运行,只有当二者同时为1时才进行计数操作。

(2)C/T——定时、计数模式选择位。

(C/T)=1 时,为计数方式;计数器对外部输入引脚 T0(P3.4)的外部脉冲的下降沿计数。

(C/T)=0时,为定时方式。

(3)M1、M0——工作方式选择位,可通过软件设置选择定时/计数器四种工作方式,如表所示。

2.2.2定时器控制寄存器 TCON

TCON 的字节地址为 88H,可进行位寻址(位地址为 88H-8FH),其具体各位定义如下。

其中低 4位与外部中断有关,在下一个任务中会详细介绍,高 4 位的功能如下:

TF0,TF1——分别为定时/计数器 T0、T1的计数溢出标志位。

当计数器计数溢出时,该位置 1。编程在使用查询方式时,此位作为状态位供 CPU 查询,查询后由软件清 0;使用中断方式时,此位作为中断请求标志位,中断响应后由硬件自动清 0。

TR0,TR1——分别为定时器 T0、T1的运行控制位,可由软件置 1 或清 0。

(TR0)或(TR1)=1,启动定时/计数器工作

(TR0)或(TR1)=0,停止定时/计数器工作

2.2.3 使用定时器的3个步骤:

a、设置工作方式;

b、设置定时器的初始值;

c、开定时器,判断定时时间到否。

在本任务中,只使用定时器T1,工作方式1。

首先绘制定时器的程序流程图:

定时器流程图

这是一个1S的定时器的延时程序,可根据题目要求的时间的不同设置不同的循环次数,我们本题要求中需要的是0.5S的延时,同学们考虑下自己编写一个0.5S的延时吧。

2.3另外设置一紧急按键,SB4为紧急按键,当紧急按键按下时,为特殊情况,此时为所用信号闪烁,报警器长鸣,40S后自动退出,若再次按下紧急按键,回复正常;

在这儿我们用到的是两个单片机的主要功能:中断、按键扫描。

2.3.1 中断的介绍:

中断是指中央处理器CPU正在处理某件事情的时候,外部发生了某一事件请求CPU迅速去处理,CPU暂时停止当前的工作,转入处理所发生的事件,处理完以后,再回到原来被停止的地方继续原来的工作。这样过程称为中断。

实现这种功能的部件称为中断系统(中断结构)。产生中断的请求源称为中断源。

当CPU正在处理一个中断源请求的时候,若又发生了另一个优先级比它高的中断源请求,如果CPU能够暂时中止对原来中断源的处理程序,就转而去处理优先级更高的中断请求,待处理完以后,再继续执行原来的低级中断处理程序,这样的过程称为中断嵌套,这样的中断系统称为多级中断系统。没有中断嵌套功能的中断系统称为单级中断系统。

AT89S52单片机中断系统

2.3.2 中断源

AT89S52有5个中断源:两个外部中断源、,三个内部中断源,它们是定时

器/计数器T0、T1的溢出中断源和串行口的发送接收中断源,AT89C52等单片

机增加了一个定时器T2的中断。这些中断源分别锁存在TCON、SCON、T2CON的

相应位中。

INT0、INT1、(P3.2、P3.3)上输入的两个外部中断源和它们的触发方式控

制位锁存在特殊功能寄存器TCON的低四位,TCON的高4位为T0、T1的运行控

制位和溢出标志位:

D7 D6 D5 D4 D3 D2 D1 D0 TF1 TF0 IE1 IT1 IE0 IT0 IE1:外部中断1请求源(,P3.3)标志。IEl=l,外部中断1正在向CPU

请求中断,当CPU响应该中断时由硬件清“0’IEl(边沿触发方式)。

IT1:外部中断源1触发方式控制位。

ITl=0,外部中断l程控为电平触发方式,当 (P3.3)输入低电平时,置位

IE1。

IE0:外部中断0请求源(,P3.2)标志。IE0=l外部中断0向CPU请求中断,当CPU响应外部中断时,由硬件清“0’IE0(边沿触发方式)。

IT0:外部中断0触发方式控制位。IT0=0,外部中断0程控为电平触发方式,

IT0=1,外部中断0为边沿触发方式。其功能和IT1类似。

2.3.3 中断控制

2.3.3.1中断使能控制

AT89S52对中断源的开放或屏蔽,每一个中断源是否被允许中断,是由内部

的中断允许寄存器IE(IE为特殊功能寄存器,它的字节地址为A8H)控制的,其

格式如下:

D7 D6 D5 D4 D3 D2 D1 D0 EA ES ET1 EX1 ET0 EX0 EA :CPU的中断开放标志。

EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。

ES :串行口中断允许位。

ES=1,允许串行口中断,ES=0 ,禁止串行口中断。

ET1:定时器/计数器T1的溢出中断允许位。

ETI=1,允许T1中断,ETl=0禁止T1中断。

EX1:外部中断1的中断允许位。

EXl=1,允许外部中断l中断,EX1=0,禁止外部中断1中断。

ET0:定时器/计数器T0的溢出中断允许位。

ET0=1,允许T0中断,ET0=0,禁止T0中断。

EX0:外部中断0的中断允许位。

EX0=1,允许中断,EX0=0,禁止中断。

2.3.3.2中断优先级控制

AT89S52有两个中断优先级,每一中断请求源可编程为高优先级中断或低优先级中断,实现二级中断嵌套。一个正在被执行的低优先级中断服务程序能被高优先级中断所中断,但不能被另一个同级的或低优先级中断源所中断。AT89C51的片内有一个中断优先级寄存器IP(IP为特殊功能寄存器,它的字节地址为B8H),其格式如下:

D7 D6 D5 D4 D3 D2 D1 D0 / / / PS PT1 PX1 PT0 PX0 PS :串行口中断优先级控制位。

PS=1,串行口中断定义为高优先级中断,

PS=0,串行口中断定义为低优先级中断。

PT1:定时器T1中断优先级控制位。

PT1=1,定时器T1定义为高优先级中断,PT1=0,定时器TI中断定义为低优先级中断。

PX1:外部中断1中断优先级控制位。

PX1=1,外部中断1定义为高优先级中断,PX1=0,外部中断1定义为低优先级中断。

PT0:定时器0中断优先级控制位。

PT0=1,定时器T0中断定义为高优先级中断,PT0=0,定时器T0中断定

义为低优先级中断。

PX0:外部中断0中断优先级控制位。

PX0=1,外部中断0定义为高优先级中断,PX0=0,外部中断0定义为低优先级中断。

2.3.3中断源的入口地址

中断源入口地址

外部中断0 0003H

定时器T0 000BH

外部中断1 0013H

定时器Tl 001BH

串行口中断0023H

2.3.4设置中断的步骤

a、设置中断入口地址

b、设置中断优先级(第5步需要)

c、开相应的中断

d、中断子程序

2.3.5按键的工作原理

单片机不能直接检测人按键的动作,我们需要将按键的动作转化成电信号,这样单片机才可以识别按键的动作,这个转换过程由按键来实现,按键就是一个输入设备。按键是一个开关,它的导通和断开可以很容易转换为电平的变化,而电平的变化就可以用单片机识别。

如上图左图所示,在按键松开的状态下P3.3口的电平为高电平,单片机读为“1”,在按键按下的时候,P3.3口的电平为低电平,单片机读为“0”,电平的变化标识了按键按下和松开的状态,在单片机就可以通过该口的信号是“0”还是“1”来判断。

在程序中我们需要注意的是P3.3口的电平的电平变化,来判断按键的状态。整个工作原理很简单,但需要注意的是,如上图右图所示,由于按键的机械特性,它在按下的时候会产生“抖动”。这种“抖动”会产生一个很窄的脉冲信号,这样会引起我们对按键的状态误判。所以我们在程序中必须考虑去除“抖动”。方

法很简单,就是当我们检测到P3.3口的电平变低(有按键按下)时,延时一段时间,然后再去检测P3.3口的电平,如果仍旧为低,则表示确实有按键按下,如果为高,则表示为误动作。

另外,考虑到有时候我们会用到复合按键(双击、长按键)等功能,我们一般在确认按键不是误动作后,会增加一个判断按键是否弹起的程序,就是在确认按键可靠按下后,再去检测P3.3口的电平是否为高,如果为高,则表示按键已经弹起,可以执行相应的程序,如果还是为低,则表示按键还没有弹起,应继续等待。

蜂鸣器在这儿我们是通过一个PNP的三极管9012来控制的,我们用的是9012来做开关管,提高单片机的驱动能力,如图所示,当单片机的P2.0口输出低电平时,三极管导通,蜂鸣器报警,反之,蜂鸣器关断。

好了,说了这么写了,按照程序先写下程序的方框图,在这儿我们直接写的是中断子程序的方框图,如下:

我们一般是把一个大的程序分成好几个子程序来写,以方便我们的调试,在这一个步骤中,我也建议分为3个步骤来写:

a、进中断,LED闪烁,蜂鸣器报警;

b、延时40S退出中断;

c、按键退出中断。

到此位置我们的紧急按键已经调试结束了,可是我们在2、3步骤中涉及了很多的时间,虽然我们用单片机内部的定时器,制作的比较准确,可我们怎么更加直观的来显示出时间来呢,下面进入第四部分。

2.4采用2位数码管显示倒计时时间,出现黄灯或者紧急情况时,数码管闪烁;

先简单介绍下数码管

2.4.1 七段LED数码显示器

七段LED数码管显示器能够显示十进制或十六进制数字及某些简单字符。但控制简单,使用方便,在单片机系统中应用较多。其结构如下页图所示。

上图中的a~g七个笔划(段)及小数点dp均为发光二极管。数码管显示

器根据公共端的连接方式,可以分为共阴极数码管(将所有发光二极管的阴极连在一起)和共阳极数码管(将所有发光二极管的阳极连在一起)。

单片机系统扩展LED数码管时多用共阳LED。共阳数码管每个段笔画是用低电平(“0”)点亮的,要求驱动功率很小;而共阴数码管段笔画是用高电平(“0”)点亮的,要求驱动功率较大。通常每个段笔画要串一个数百欧姆的降压电阻。

七段LED字形码如下表所。

LED工作时需要一定的工作电流,才能正常发光。单个LED实际上是一个压降为1.8~2.2V的发光二极管,流过LED的电流大小决定了它的发光强度,R 为限流电阻。适当减小限流电阻可以增加LED的工作电流,使LED的显示效果更好。但工作电流过大,会对驱动器件、LED造成损害。通常每个段笔画要串一个合适的电阻,使流过的电流为1mA~10mA。

2.4.2 LED数码管的显示与驱动

LED数码管显示器的工作方式:静态和动态两种显示方式。

(1)静态显示方式

静态显示方式的各数码管在显示过程中持续得到送显信号,与各数码管接口的I/O口线是专用的。其特点是显示稳定,无闪烁,用元器件多,占I/O线多,无须扫描。系统运行过程中,在需要更新显示内容时,CPU才去执行显示更新子程序,节省CPU时间,提高CPU的工作效率,编程简单

(2)动态显示方式

动态显示方式是指一位一位地轮流点亮每位显示器,与各数码管接口的I/O 口线是共用的。其特点是有闪烁,用元器件少,占I/O线少,必须扫描,花费CPU时间,编程复杂。

在这儿我们采用的是静态显示方式,P0和P2口分别控制2位数码管的段码,位码我们直接通过一个限流电阻接到了VCC上面,只需要在不同时时刻往不同的IO口送我们需要显示的数字即可。

在本项目中,我们驱动数码管分别是用的P0、P2口,只需要给这两个口送我们需要显示的数字就可以了。

假设我们要显示“10”,对应上面的段码表格,查表后写出程序如下:

DISPLAY:

MOV P0,#0C0H

MOV P2,#0F9H

RET

就可以通过数码管显示出“10”了,要是显示为“01”,就表示我们的个位和十位的数送错了,调整下P0、P2的数值就可以了

我们在这儿显示的是一个两位数,那么他就有十位

将相应的数字所对应的段码取出后,送到相应的89S52的查表指令:

指向字形表首址

查表取得字形码

而根据我们一贯要求,将本步骤也分为3个小步骤:

a 、显示“20”;

b 、定时减“ 1”;

这儿需要考虑的是我们的延时是0.5S的延时,那么我们要是在每个延时里面执行减1的话,就不能实现1S减1的倒计时了;

c 、各个方向的倒计时的数码管显示(注意调用显示子程序的时间);

d 、数码管的闪烁

载入主程序。

在这儿我们就不一一的写出各个步骤的程序了。

相关主题
相关文档
最新文档