单片机第4章 定时与中断_第1页
单片机第4章 定时与中断_第2页
单片机第4章 定时与中断_第3页
单片机第4章 定时与中断_第4页
单片机第4章 定时与中断_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SingleChipMicrocomputer第四章80C51

的定时与中断系统定时器的组成、工作原理及控制单片机的中断系统定时器的工作方式及应用本章内容CPUTCON(88H)TH1TL1TH0TL0INT1(P3.3)INT0(P3.2)中断T1(P3.5)定时器1定时器0溢出启动(8DH)(8BH)(8CH)(8AH)启动内部总线溢出工作方式工作方式T0(P3.4)TMOD(89H)1、单片机定时器/计数器组成一、80C51单片机的定时器/计数器定时器1(16位)定时器0(16位)控制寄存器方式寄存器定时/计数器的结构组成:80C51定时/计数器由定时器0、定时器1、定时器方式寄存器TMOD和定时器控制寄存器TCON四部分组成定时器0(T0)和定时器1(T1):(1)80C51单片机内部有两个16位的可编程定时/计数器,称为定时器0(简称T0)和定时器1(简称T1),可编程选择其作为定时器用或作为计数器用。(2)16位的定时/计数器分别由两个8位寄存器组成,即:T0由TH0和TL0构成,T1由TH1和TL1构成,TL0、TL1、TH0、TH1的访问地址依次为8AH

8DH。每个寄存器均可单独访问,这些寄存器是用于存放定时初值或计数初值的。

定时器0或定时器1用作计数器时,对芯片引脚T0(P3.4)或T1(P3.5)上输入的脉冲计数,每输入一个脉冲,加法计数器加1;作定时功能时。定时器/计数器的定时功能也是通过计数实现的,它的计数脉冲是由单片机的片内振荡器输出经12分频后产生的信号,即为对机器周期计数。

T机器=12T时钟=121/fosc2、定时器/计数器的功能

门控位。当GATE=0时,软件控制位TR0或TR1置1即可启动定时器;当GATE=1时,软件控制位TR0或TR1须置1,同时还须(P3.2)或(P3.3)为高电平方可启动定时器,常用于测量信号的脉宽。3、定时器/计数器工作方式控制寄存器(TMOD)M0

M1M0M1D0D1D2

D3D4D5D6

D7定时器T1定时器T0注:TMOD不能位寻址,只能用字节指令(MOVTMOD,#DATA)设置,其中高4位定义定时器1、低4位定义定时器0的工作方式。

功能选择位,当设置为定时器工作方式该位为“0”;当设置为计数器工作方式该位为“1”。M1M0工作方式功能说明

00方式013位计数器

01方式116位计数器

10方式2自动重装8位计数器

11方式3定时器0:分成两个8位计数器定时器1:停止计数4、定时器/计数器控制寄存器(TCON)TF1/TF0:T1/T0的溢出中断标志。T1/T0被启动计数后,从初值做加1计数,计满溢出后由硬件置位TF1/TF0。在中断允许时向CPU发出中断请求,当进入中断服务程序后,由硬件复位。TR1/TR0:T1/T0的运行控制位。由软件置1或清0来启动或关闭定时器1。IT0IE0IT1IE1TR0TF0TR1TF1D0D1D2D3D4D5D6D7定时器控制位

中断控制

1).定时/计数器的初始化步骤

由于定时/计数器的功能是由软件编程确定的,所以,一般在使用定时器/计数前都要对其进行初始化。初始化骤如下:

(1)确定定时/计数器的工作方式,确定方式控制字,并写入TMOD。

(2)预置定时初值或计数初值,根据定时时间或计数次数,计算定时初值或计数初值,并写入TH0、TL0或TH1、TL1。

(3)根据需要开启定时/计数器的中断,直接对IE寄存器中的相应位(EA、EX0、EX1、ET0、ET1)赋值。

(4)启动定时/计数器工作,将TCON中的TR1或TR0置1。5、定时器/计数器的初始化2).定时或计数初值的计算定时/计数器的初值因工作方式的不同而不同,其定时或计数初值的计算见表4-2。注:对表4-2作如下说明:●表中T表示定时时间,T机表示机器周期(T机=12×1/fosc);●计数初值公式中的计数值为脉冲个数;●在方式3中只讨论T0。T0被分为两个独立的8位计数器TL0和TH0。而TL0可定时亦可计数;而TH0只能用作简单的内部定时,不能用作对外部脉冲进行计数。

【例4-1】:定时器1(T1)采用方式1来定时,要求每50ms溢出一次,如采用12MHz晶振,则计数周期T机=1

s,求定时初值X。解:根据定时初值X的计算公式可得:

【例4-2】:要求定时器1(T1)采用方式0、方式1和方式2来计100个脉冲的计数初值X。解:根据计数初值X的计算公式可得:方式0:X=213-计数值=8192-100=8092=1F9CH方式1:X=216-计数值

=65536-100=65436=FF9CH方式2:X=28-计数值=256-100=156=9CH3).定时或计数初值的装入现以【例4-2】的计数初值X为例,来介绍定时/计数器在不同工作方式下初值的装入方法。①方式0是13位定时/计数器,若采用定时/计数器T1,则计数初值X的高八位装入TH1,而低五位装入TL1的低五位(TL1的高三位无效,可填补0)。所以要装入1F9CH初值,应按照如下方法进行。

1F9CH=0001

111110011100B把13位中的高八位11111100B装入TH1,而把13位中的低五位xxx11100B装入TL1(xxx用“0”填入)。用指令来装入计数初值为:

MOVTH1,#0FCH;#FCH→TH1MOVTL1,#1CH;#1CH→TL1②方式1是16位定时/计数器,若采用定时/计数器T1,则计数初值X的高八位装入TH1,而低八位装入TL1,用指令来装入计数初值为:

MOVTH1,#0FFH;#0FFH→TH1MOVTL1,#9CH;#9CH→TL1③方式2是自动重装入初值8位定时/计数器,只要装入一次,以后就自动装入初值。若采用定时/计数器T1,则计数初值X既要装入TH1,也要装入TL1,用指令来装入计数初值为:

MOVTH1,#9CH;#9CH→TH1MOVTL1,#9CH;#9CH→TL1工作方式0(M1M0=00)特点:13位的计数器结构(由TH和TL的低五位构成)计数范围:1~213定时时间:(8192-初值)*T机器周期6、定时器/计数器的工作方式工作方式0的逻辑结构图及工作过程01启动(1)开始计数写入初始值:MOVTH0,#DATA1MOVTL0,#DATA2N次计数1例1工作方式1(M1M0=01)特点:16位的计数器结构(由TH和TL的全部构成)计数范围:1~216定时时间:(65536-初值)*T机器周期工作方式1的逻辑结构图及工作过程01启动(1)开始计数写入初始值:MOVTH0,#DATA1MOVTL0,#DATA2N次计数1例2工作方式2(M1M0=10)特点:为8位的计数器结构(由TL的全部构成,TH作为预置寄存器)计数范围:1~28定时时间:(256-初值)*T机器周期在计数溢出后不需要由软件向计数器赋初始值,而改由TH完成。工作方式2的逻辑结构图例3工作方式3(M1M0=11)特点:定时器T0被分解为两个独立的8位计数器(TL0和TH0).TL0占用原T0的控制位、引脚和中断,TH0占用T1的控制位和中断。计数范围:1~28定时时间:(256-初值)*T机器周期工作方式3的逻辑结构图例1:用定时器1、方式0实现1s定时。

(fosc=12MHz)分析:定时器1、方式0,则TMOD=0000××××B

由于T机器=12T时钟=121/fosc=1us,而方式0的最大定时时间为8.192ms,所以可选择:5ms再循环200次。由于计数值=5ms/1us=5000,所以初始值=213-计数值=3192=0110001111000B∴TH1=TL1=

0110001111000×××B=63HB=18H参考程序:DELAY_t1_0:MOVR3,#200;5ms循环次数

MOVTMOD,#00H;设置定时器1方式0MOVTH1,#63H;置初始值

MOVTL1,#18HSETBTR1;启动T1LP1:JBCTF1,LP2;5ms到转LP2SJMPLP1;没有到循环

LP2:MOVTH1,#63H;重置初始值

MOVTL1,#18HDJNZR3,LP1;1s到?

RET例2:用定时器0、方式1实现1s定时。

(fosc=12MHz)分析:定时器0、方式1,则TMOD=××××0001B

由于T机器=12T时钟=121/fosc=1us,而方式1的最大定时时间为65.536ms,所以可选择:50ms再循环20次。由于计数值=50ms/1us=50000,所以初始值=216-计数值=15536=3CB0H∴TH0=3CH;

TL0=0B0H。参考程序:DELAY_t0_1:MOVR3,#20;50ms循环次数

MOVTMOD,#01H;设置定时器0方式1MOVTH0,#3CH;置初始值

MOVTL0,#0B0HSETBTR0;启动T0LP3:JBCTF0,LP4;50ms到?到转LP4SJMPLP3;没有到循环

LP4:MOVTH0,#3CH;重置初始值

MOVTL0,#0B0HDJNZR3,LP3;1s到?

RET例3:用定时器1、方式2实现1s定时。

(fosc=12MHz)分析:定时器1、方式2,则TMOD=0010××××B

由于T机器=12T时钟=121/fosc=1us,而方式2的最大定时时间为0.256ms,所以可选择:0.25ms(250us)再循环100*40次。由于计数值=0.25ms/1us=250,所以初始值=28-计数值=6∴TH1=TL1=06H。

参考程序:DELAY_t1_2:MOVR4,#40;25ms循环次数

MOVR5,#100;250us循环次数

MOVTMOD,#20H;设置定时器1方式2MOVTH1,#06H;置初始值

MOVTL1,#06HSETBTR1;启动T1LP5:JBCTF1,LP6;250us到?

SJMPLP5LP6:DJNZR5,LP5;25ms到?

MOVR5,#100DJNZR4,LP5;1s到?

RET例4:用T0方式2定时,并由P1.0输出周期为2s的方波.(设fosc=6Mhz)分析:要由P1.0输出2s方波,可由T0每定时1s,使P1.0反相一次.初始化设置:TMOD:00000010B初始值:∵fosc=6Mhz∴T=2us

方式2的最大定时为:512us取用500us,再循环2000次即可.

(100*20)

∴初始值=28-500/2=6参考程序1:

org0start:movr1,#20

movr2,#100

mov

tmod,#02h

movth0,#06h

movtl0.#06h

setbtr0lp1:jbctf0,lp2

sjmplp1

lp2:djnzr2,lp1

movr2,#100

djnzr1,#lp1

movr1,#20

cplP1.0

sjmplp1endorg0start:movp1,#0hnext:

cplP1.0calltimer0_2

sjmpnexttimer0_2:

movr1,#20

movr2,#100

mov

tmod,#02h

movth0,#06h

movtl0,#06h

setbtr0lp1:jbctf0,lp2

sjmplp1lp2:djnzr2,lp1

movr2,#100

djnzr1,lp1retend[例3]如图4-7所示,P1口中接有八个发光二极管,编程使八个管轮流点亮,每个管亮100ms,采用定时T0方式1,设晶振为6MHz。分析:利用T0完成100ms的定时,当P1口线输出高电平“1”时,发光二极管亮,每隔100ms“1”左移一次,采用定时方式1,先计算定时初值:

仿真链接程序如下:

ORG0100HMOVA,#01H;置第一个LED亮

LOOP0:MOVP1,A

MOVTMOD,#01H;T0工作于方式1MOVTH0,#3CH;置定时器初值

MOVTL0,#0B0H;定时100msSETBTR0;启动T0LOOP1:JBCTF0,LOOP2;100ms到转L002,并清TF0SJMPLOOP1LOOP2:RLASJMPLOOP0//例4:用定时器T0查询方式控制P2口8位LED闪烁。要求:T0工作于方式1,LED的闪烁周期为100ms,即亮50ms,熄灭50ms。解:定时器0、方式1,则TMOD=××××0001B

由于T机器=12T时钟=121/fosc=1us,而方式1的最大定时时间为65.536ms,所以可选择:50ms。由于计数值=50ms/1us=50000,所以初始值=216-计数值=15536=3CB0H∴TH0=(65536-50000)/256;

TL0=(65536-50000)%256。#include<reg51.h>//包含51单片机寄存器定义的头文件/**************************************************************函数功能:主函数**************************************************************/voidmain(void){ TMOD=0x01;//使用定时器T0的模式1 TH0=(65536-50000)/256;//定时器T0的高8位赋初值

TL0=(65536-50000)%256;//定时器T0的高8位赋初值

TR0=1;//启动定时器T0 P2=0xff;//先熄灭P2口的灯

while(1)//无限循环

{ while(TF0==0)//查询标志位是否溢出

;//空操作

TF0=0;//若计时时间到,TF0=1,需要软件将其清0 P2=~P2;//将P2按位取反,实现LED的闪烁

TH0=(65536-50000)/256;//定时器T0的高8位赋初值

TL0=(65536-50000)%256;//定时器T0的高8位赋初值

}}//例5:用定时器T1查询方式控制P3.7的蜂鸣器发出1KHz音频。解:定时器1、方式1,则TMOD=0001××××B

只要让P3.7的电平信号每隔音频的半个周期取反一次即可发出1KHz音频。

#include<reg51.h>//包含51单片机寄存器定义的头文件sbitsound=P3^7;//将sound位定义为P3.7引脚/**************************************************************函数功能:主函数**************************************************************/voidmain(void){ TMOD=0x10;//使用定时器T1的模式1 TH1=(65536-1000)/256;//定时器T1的高8位赋初值

TL1=(65536-1000)%256;//定时器T1的高8位赋初值

TR1=1;//启动定时器T1 while(1)//无限循环等待查询

{ while(TF1==0)//查询标志位是否溢出

; TF1=0;//若计时时间到,TF0=1,需要软件将其清0 sound=~sound;//将P3.7引脚输出电平取反

TH1=(65536-1000)/256;//定时器T0的高8位赋初值

TL1=(65536-1000)%256;//定时器T0的高8位赋初值

}}二、MCS-51单片机的中断系统

CPU在执行程序的过程中,由于某种外界的原因,必须尽快终止CPU当前的程序执行,而去执行相应的处理程序,待处理结束后,再回来继续执行开始被终止的程序。这种程序在执行过程中由于外界的原因而被中间打断的情况称为“中断”。1、中断的概念2、中断的作用可以实现CPU与外部设备的并行工作,提高CPU利用效率。可以实现CPU对外部事件的实时处理,进行实时控制。实现多项任务的实时切换。3、80C51单片机的中断源定时中断:由单片机的定时器/计数器的溢出标志触发的中断,80C51单片机有T0和T1两个定时中断。80C51单片机具有多中断控制,它由以下几部分组成:外中断:由外部信号触发的中断,80C51有2个外部中断(/INT0)和(/INT1)。串行口中断:为单片机的串行数据传输设置的中断,80C51单片机有1个串行中断。

4、中断系统内部结构示意图中断允许控制寄存器中断优先级控制寄存器/INT0T0/INT1T1TX/RXIE---中断允许控制寄存器5、中断控制寄存器EX0ET0EX1ET1ES--------EAD0D1D2D3D4D5D6D7总中断允许控制位。EA=1,开放所有中断。EA=0,禁止所有中断。串行口中断允许位。ES=1,允许串行口中断ES=0,禁止串行口中断定时器1中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。外部中断1中断允许位。EX1=1,允许外部中断1中断EX1=0,禁止外部中断1中断定时器0中断允许位。ET0=1,允许定时器0中断;ET0=0,禁止定时器0中断。外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。IP---中断优先级控制寄存器PX0PT0PX1PT1PS------------D0D1D2D3D4D5D6D75、中断控制寄存器串行口中断优先控制位PS=1,设定串行口为高优先级中断PS=0,设定串行口为低优先级中断。定时器T1中断优先控制位PT1=1,设定定时器T1中断为高优先级中断;PT1=0,设定定时器T1中断为低优先级中断。外部中断1中断优先控制位PX1=1,设定外部中断1为高优先级中断;PX1=0,设定外部中断1为低优先级中断。定时器T0中断优先控制位PT0=1,设定定时器T0中断为高优先级中断;PT0=0,设定定时器T0中断为低优先级中断。外部中断0中断优先控制位PX0=1,设定外部中断0为高优先级中断;PX0=0,设定外部中断0为低优先级中断。

注意:当系统复位后,所有中断源均设定为低优先级中断。即:IP=×××00000BTCON--定时器/计数器控制寄存器IT0IE0IT1IE1TR0TF0TR1TF1D0D1D2D3D4D5D6D75、中断控制寄存器

定时器IT1/IT0:外中断1/0触发方式控制位。当ITi=0时,外部中断1/0为电平触发方式。当ITi=1时,外部中断1/0为脉冲触发方式。IE1/IE0:外部中断1/0标志。IEi=1,外部中断1/0向CPU申请中断。SCON--串行口控制寄存器RI

TIRB8TB8RENSM2SM1SM0D0D1D2D3D4D5D6D75、中断控制寄存器通信TI:串行发送中断标志CPU将数据写入发送缓冲器SBUF时,就启动发送,每发送完一个串行帧,硬件将使TI置位。RI:串行接收中断标志在串行口允许接收时,每接收完一个串行帧,硬件将使RI置位。

ORG0000H AJMPMAIN

ORG000BH AJMPINTT0

ORG0100HMAIN:MOVR0,#08H…

…INTT0:…RETIEND…0000H0001H0002H0003H000BH0100H…000CH0101H0102HAJMPMAINAJMPINTT07808T0溢出中断,TF0=1···SPINTT0AJMPCPU响应该中断(PC)(PC)+1保护断点中断处理

执行主程序中断返回AJMPINTT0(PC)(PC)+16、中断处理过程(以T0中断为例)80C51中断入口地址分配外部中断0---------0003H外部中断1---------0013H定时器T0溢出中断------000BH定时器T1溢出中断------001BH串行通信中断--------0023H7、中断控制程序设计例1:在P1.0上产生周期为1s的方波。设晶振频率

12MHz。分析:由于周期为1s,所以每500ms将P1.0反相,即可。选用定时器0、方式1,则TMOD=××××0001B

由于T机器=12T时钟=121/fosc=1us,而方式1的最大定时时间为65.536ms,所以可选择:50ms再循环10次。

由于:

计数值=50ms/1us=50000,所以初始值=216-计数值=15536=3CB0H∴TH0=3CH;

TL0=0B0H。

ORG0000HAJMPMAINORG000BH;T0中断入口地址

AJMPINTT0MAIN:MOVR0,#10MOVTMOD,#01H;定时器T0,方式1MOVTH0,#3CH;置初始值

MOVTL0,#0B0HMOVIE,#82H;开中断,EA=1,ET0=1SETBTR0;启动T0WAIT:SJMPWAITINTT0:MOVTH0,#3CH;置初始值

MOVTL0,#0B0HDJNZR0,NEXT;50ms到?

CPLP1.0NEXT:RETIEND参考程序://实例:用定时器T0的中断控制1位LED闪烁#include<reg51.h>//包含51单片机寄存器定义的头文件sbitD1=P2^0;//将D1位定义为P2.0引脚/**************************************************************函数功能:主函数**************************************************************/voidmain(void){EA=1;//开总中断ET0=1;//定时器T0中断允许TMOD=0x01;//使用定时器T0的模式2TH0=(65536-46083)/256;//定时器T0的高8位赋初值TL0=(65536-46083)%256;//定时器T0的高8位赋初值TR0=1;//启动定时器T0while(1)//无限循环等待中断

;//空操作}/************************************************************函数功能:定时器T0的中断服务程序************************************************************/voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数

//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器

{D1=~D1;//按位取反操作,将P2.0引脚输出电平取反

TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值

TL0=(65536-46083)%256;//定时器T0的高8位重新赋初值

}例2:定时/中断的综合应用。用定时器T0、方式2实现1s定时,控制LDE1~LDE8的循环点亮,同时用一开关实现暂停-继续控制功能。

(fosc=6MHz)分析:由于T机器=12T时钟=121/fosc=2us,而方式2的最大定时时间为0.512ms,所以可选择:0.5ms再循环2000次。由于计数值=0.5ms/2us=250,所以初始值=28-计数值=6∴TH0=TL0=06H。org0ajmpstartorg0003hajmpint_int0;p3.2引入外部脉冲org000bhajmpint_t0;t0中断wei

equ20h.0;标志位start:setb

wei

movr1,#20;50ms循环次数

movr2,#100;500us循环次数

movtmod,#02h;T0方式2

movth0,#6;置初始值

movtl0,#6

setbet0;开T0中断

setbit0;int0为电平触发

setbex0;开int0中断

setbea;开CPU中断

setbtr0;启动T0

mova,#0feh;置初始输出值

movp1,a

sjmp$参考程序:int_t0:djnzr2,next;50ms到?

movr2,#100

djnzr1,next;1s到?

movr1,#20

rla;输出数据左移一位

movp1,anext:retiint_int0:

jb

wei,lp1;当int0有中断请求时,判断

setb

wei

setbtr0

sjmplp2lp1:clrtr0;暂停

clr

weilp2:retiend参考程序(续):外部中断源的扩展单片机仅有两个外部中断输入端.可用两种方法扩展:1.定时器T0,T1。(工作在计数方式下)

2.中断和查询结合。

1.用定时器作外部中断源例将定时器T0扩展为外部中断源。解:将定时器T0设定为方式2(自动恢复计数初值),TH0和TF0的初值均设置为FFH,允许T0中断,CPU开放中断,源程序如下:

MOV TMOD,#06H MOV TH0,#0FFH MOV TL0,#0FFH SETB TR0 SETB ET0 SETB EA …T0引脚每输入一个负跳变,TF0都会置1,向CPU请求中断

T0脚相当于边沿触发的外部中断源输入线。2.中断和查询相结合图:一个外中断扩展成多个外中断的原理图中断服务程序如下:

ORG 0003H ;外部中断0入口

AJMP INT0 ;转向中断服务程序入口

INT0:PUSH PSW ;保护现场

PUSH ACCJBP1.0,EXT0;中断源查询并转相应中断服务程序

JB P1.1,EXT1JB P1.2,EXT2JB P1.3,EXT3EXIT:POP ACC ;恢复现场

POP PSWRETI

EXT0:

;EXINT0中断服务程序

AJMP EXITEXT1:

;EXINT1中断服务程序

AJMP EXITEXT2:

;EXINT2中断服务程序

AJMP EXITEXT3:

;EXINT3中断服务程序

AJMP EXIT

同样,外部中断1也可作相应的扩展。中断系统的应用中断系统的初始化实质上是针对4个与中断有关的特殊功能寄存器TCON、SCON、IE和IP进行控制和管理,具体步骤如下:

1、开CPU中断总开关(EA);

2、设置中断允许寄存器IE中相应的位,确定各个中断源是否允许中断;

3、对多级中断设置中断优先级寄存器IP中相应的位,确定各中断源的优先级别;

4、设置定时器控制寄存器TCON中相应的位,确定外部中断是边沿触发还是电平触发的触发方式。[例10]:用89S51单片机控制一个交通信号灯系统,晶振采用12MHz。设设A车道与B车道交叉组成十字路口,A是主道,B是支道。设计要求如下:

1、用发光二极管模拟交通信号灯,用按键开关模拟车辆检测信号;

2、正常情况下,A、B两车道轮流放行,A车道放行50s,其中5s用于警告;B车道放行30s,其中5s用于警告。

3、在交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。在B车道放行期间,若A车道有车而B车道无车,按下开关K1使A车道放行15s;在A车道放行期间,若B车道有车而A车道无车,按下开关K2使B车道放行15s。

4、有紧急车辆通过时,按下K3开关使A、B车道均为红灯,禁行20s。解:设计步骤如下:

一、总体设计思想根据设计要求,制定总体设计思想如下:

1、正常情况下运行主程序,采用0.5秒延时子程序的反复调用来实现各种定时时间;

2、一道有车而另一道无车时,采用外部中断1执行中断服务程序,并设置该中断为低优先级中断;

3、有紧急车辆通过时,采用外部中断0执行中断服务程序,并设置该中断为高优先级中断,实现二级中断嵌套。二、硬件设计用12只发光二极管模拟交通信号灯,以89S51单片机的P1口控制这12只发光二极管,由于单片机带负载能力有限,因此,在P1口与发光二极管之间用74LS07作驱动电路,P1口输出低电平时,信号灯亮;输出高电平时,信号灯灭。在正常情况和交通繁忙时,A、B两车道的六只信号灯的控制状态有五种形式,即P1口控制功能及相应控制码如表4-2所示。控制状态P1口控制码P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0未用未用B道绿灯B道黄灯B道红灯A道绿灯A道黄灯A道红灯A道放行,B道禁止F3H11110011A道警告,B道禁止F5H11110101A道禁止,B道放行DEH11011110A道禁止,B道警告EEH11101110A道禁止,B道禁止F6H11110110表4-2交通信号灯与控制状态的对应关系

分别以按键K1、K2模拟A、B道的车辆检测信号,开关K1按下时,B车道放行;开关K2按下时,A车道放行;开关K1和K2的控制信号经异或取反后,产生中断请求信号(低电平有效),通过外部中断1向CPU发出中断请求;因此产生外部中断1中断的条件应是:,可用集成块74LS266(如无74LS266,可用74LS86与74LS04组合)来实现。采用中断加查询扩展法,可以判断出要求放行的是A车道(按下开关K1)还是B车道(按下开关K2)。以按键K0模拟紧急车辆通过开关,当K0为高电平时属正常情况,当K0为低电平时,属紧急车辆通过的情况,直接将K0信号接至(P3.2)脚即可实现外部中断0中断。综上所述,可设计出硬件电路如图4-15。图4-15交通灯模拟控制电路图三、软件设计

1、主程序采用查询方式定时,由R2寄存器确定调用0.5秒延时子程序的次数,从而获取交通灯的各种时间。子程序采用定时器1方式1查询式定时,定时器定时50ms,R3寄存器确定50ms循环10次,从而获取0.5秒的延时时间。有车车道放行中

2、有车车道放行的中断服务程序首先要保护现场,因需用到延时子程序和P1口,故需保护的寄存器有R3、P1、TH1和TL1,保护现场时还需关中断,以防止高优先级中断(紧急车辆通过所产生的中断)出现导致程序混乱。

3、开中断,由软件查询P3.0和P3.1口,判别哪一道有车,再根据查询情况执行相应的服务。待交通灯信号出现后,保持15秒的延时,然后,关中断,恢复现场,再开中断,返回主程序。

4、紧急车辆出现时的中断服务程序也需保护现场,但无需关中断(因其为高优先级中断),然后执行相应的服务,待交通灯信号出现后延时15秒,确保紧急车辆通过交叉路口,然后,恢复现场,返回主程序。程序设计如下:

ORG0000H LJMPMAIN ;转向主程序

ORG0003H LJMPINT0 ;转向紧急车辆中断服务程序

ORG0013H LJMPINT1 ;转向有车车道中断服务程序

ORG0200HMAIN:MOVSP,#30HSETBPX0 ;置外部中断0为高优先级中断

MOVTCON,#00H ;置外部中断0、1为电平触发

MOVTMOD,#10H;置定时器1为方式1MOVIE,#85H ;开CPU中断,开外中断0、1中断

LOOP:MOVP1,#0F3H;A道绿灯放行,B道红灯禁止

MOVR1,#90 ;置0.5秒循环次数(0.5×90=45S)

DIP1:ACALLDELAY;调用0.5秒延时子程序DJNZR1,DIP1;45秒不到继续循环

MOVR1,#06 ;置A绿灯闪烁循环次数

WAN1:CPLP1.2 ;A绿灯闪烁

ACALLDELAYDJNZR1,WAN1 ;闪烁次数未到继续循环

MOVP1,#0F5H;A黄灯警告,B红灯禁止

MOV R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论