89C51单片机定时计数器中断.docx

上传人:b****1 文档编号:2443163 上传时间:2023-05-03 格式:DOCX 页数:22 大小:25.17KB
下载 相关 举报
89C51单片机定时计数器中断.docx_第1页
第1页 / 共22页
89C51单片机定时计数器中断.docx_第2页
第2页 / 共22页
89C51单片机定时计数器中断.docx_第3页
第3页 / 共22页
89C51单片机定时计数器中断.docx_第4页
第4页 / 共22页
89C51单片机定时计数器中断.docx_第5页
第5页 / 共22页
89C51单片机定时计数器中断.docx_第6页
第6页 / 共22页
89C51单片机定时计数器中断.docx_第7页
第7页 / 共22页
89C51单片机定时计数器中断.docx_第8页
第8页 / 共22页
89C51单片机定时计数器中断.docx_第9页
第9页 / 共22页
89C51单片机定时计数器中断.docx_第10页
第10页 / 共22页
89C51单片机定时计数器中断.docx_第11页
第11页 / 共22页
89C51单片机定时计数器中断.docx_第12页
第12页 / 共22页
89C51单片机定时计数器中断.docx_第13页
第13页 / 共22页
89C51单片机定时计数器中断.docx_第14页
第14页 / 共22页
89C51单片机定时计数器中断.docx_第15页
第15页 / 共22页
89C51单片机定时计数器中断.docx_第16页
第16页 / 共22页
89C51单片机定时计数器中断.docx_第17页
第17页 / 共22页
89C51单片机定时计数器中断.docx_第18页
第18页 / 共22页
89C51单片机定时计数器中断.docx_第19页
第19页 / 共22页
89C51单片机定时计数器中断.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

89C51单片机定时计数器中断.docx

《89C51单片机定时计数器中断.docx》由会员分享,可在线阅读,更多相关《89C51单片机定时计数器中断.docx(22页珍藏版)》请在冰点文库上搜索。

89C51单片机定时计数器中断.docx

89C51单片机定时计数器中断

89C51单片机定时/计数器中断

一、汇编语言 编写51单片机定时/计数中断响应程序

     ORG0000H

     LJMPMAIN

     ORG000Bh

     LJMPZD0

     ORG0040H

MAIN:

MOVTH0,#0d8h

     MOVTL0,#0e8h

     MOVA,#0FEh

     SETBEA

     SETBET0

     SETBTR0

     SJMP$

ZD0:

 MOVP2,A

     MOVTH0,#0d8h

     MOVTL0,#0f0h

     incr3

     CJNEr3,#99D,ddd

     movr3,#00h

     incr4

     CJNEr4,#9D,ddd

     movr4,#00h

     RLA

 DDD:

reti

     end           

二、C语言编写51单片机定时/计数中断响应程序

#include"reg51.h"

intms,i,k,n,m,temp=0x01;

voiddelay(ms)

{

 while(ms--)

   for(i=0;i<120;i++);

}

voidmain()

{

   TMOD=0x01;

   EA=1;

   ET0=1;

   TR0=1;

   while

(1);   

}

voidtimer0()interrupt1

{

  TH0=(65536-10000-6)/256;

  TL0=(65536-10000-6)%256;

  k++;

  if(k==100)

    {

      k=0;

      m++;

    }

   if(m==8)m=0;

   P2=temp<

                          //如果改成temp=temp<

 }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

 定时器中断c语言解析interrupt     x     using     y   

interrupt表示中断优先级,using表示所用工作寄存器组。

interrupt     x     using     y   

  跟在interrupt后面的x 值是中断号,就是说这个函数对应第几个中断端口,一般在51中,x对应的中断如下:

  

    0     外部中断0     

    1     定时器0   

    2     外部中断1   

    3     定时器1   

    4     串行中断   

    其它的根据相应的单片机有自己的含义,实际上c在编译的时候就是把你这个函数的入口地址放到这个对应中断的跳转地址   

    using     y     这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个     r0     --     r7寄存器,如果你的中断函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈,返回时也不会弹出来节省代码和时间

外部中断INT0

voidintsvr0(void)interrupt0using1

定时/计数器T0

voidtimer0(void)interrupt1using1

外部中断INT1

voidintsvr1(void)interrupt2using1

定时/计数器T1

voidtimer1(void)interrupt3using1

串口中断

voidserial0(void)interrupt4using1

一,中断的概念

中断:

当计算机执行正常程序时,系统中出现某些急需处理的异常情况和特殊请求.

中断的执行:

当CPU正在执行某一程序时,若有中断响应,则CPU转而执行中断服务程序,当中断服务程序执行完毕后,CPU自动返回原来的程序继续执行.

中断服务程序的语句写法与函数的写法完全相同,所以,中断服务程序也是函数,只在函数头部有不同(后续).

中断服务程序的执行与函数的执行不同:

函数的执行是有固定位置的,是通过函数的调用来完成的;而中断服务程序的执行是不固定位置的,只要有中断响应,在一定条件下都会去响应中断,即执行中断服务程序.

二,中断源

中断源:

任何引起计算机中断的事件,一般一台机器允许有许多个中断源.

8051系列单片机至少有5个可能的中断(8052有6个,其它系列成员最多可达15个).下面以5个中断源为例.

8051单片机的五个中断源是:

外部中断请求0,由INT0(P3.2)输入;

外部中断请求1,由INT1(P3.3)输入;

片内定时器/计数器0溢出中断请求;

片内定时器/计数器1溢出中断请求;

片内串行口发送/接收中断请求. 

三,与中断有关的寄存器

1,定时/计数器控制寄存器TCON

TF1TR1TF0TR0IE1IT1IE0IT0

D7D6D5D4D3D2D1D0

.IT0,IT1:

外部中断0,1触发方式选择位,由软件设置;

1→下降沿触发方式,INT0/INT1管脚上高到低的负跳变可引起中断;

0→电平触发方式,INT0/INT1管脚上低电平可引起中断.

.IE0,IE1:

外部中断0,1请求标志位;

当外部中断0,l依据触发方式满足条件,产生中断请求时由硬件置位(IE0/IE1=1);当CPU响应中断时由硬件清除(IE0/IE1=0).

.TR0,TR1:

启动定时/计数器0,1.

.TF0,TF1:

定时器/计数器0,1(T/C0,T/C1)溢出中断请求标志;

当T/C0,1计数溢出时由硬件置位(TF0/TF1=l);

当CPU响应中断由硬件清除(TFO/TF1=0).

三,与中断有关的寄存器

2,串行口控制寄存器SCON

TIRI

D7D6D5D4D3D2D1D0

.RI:

串行口接收中断请求标志位;

当串行口接收完一帧数据后请求中断,由硬件置位(RI=1)

RI必须由软件清"0".

.TI:

串行口发送中断请求标志位.

当串行口发送完一帧数据后请求中断,由硬件置位(TI=1)

TI必须由软件清"0". 

三,与中断有关的寄存器

3,中断允许寄存器IE

EAET2ESET1EX1ET0EX0

D7D6D5D4D3D2D1D0

.EX0,EX1:

外部中断0,1的中断允许位;

l→外部中断0,1开中断;0→外部中断0,1关中断.

.ET0,ET1:

定时器/计数器0,1(T/C0,T/C1)溢出中断允许位;

1→T/C0,T/Cl开中断;0→T/C0,T/Cl关中断.

.ES:

串行口中断允许位;

1→串行口开中断;0→串行口关中断.

.ET2:

定时器/计数器2(T/C2)溢出中断允许位;

1→T/C2开中断;0→T/C2关中断.

.EA:

CPU开/关中断控制位.

1→CPU开中断.0→CPU关中断.

8051复位时,IE被清"0",此时CPU关中断,各中断源的中断也都屏蔽

三,与中断有关的寄存器

4,中断优先级寄存器IP

PSPT1PX1PT0PX0

D7D6D5D4D3D2D1D0

.PX0,PX1:

外部中断0,1中断优先级控制位;

1→高优先级;0→低优先级.

.PT0,PT1:

定时器/计数器0,1中断优先级控制位;

1→高优先级;0→低优先级.

.PS:

串行口中断优先级控制位;

1→高优先级;0→低优先级.

8051复位时,IP被清"0",5个中断源都在同一优先级,其内部优先级的顺序从高到低为:

外部中断0(IE0)

定时器/计数器0(TF0)

外部中断1(IE1)

定时器/计数器1(TF1)

串行口中断(RI+TI)

四,中断响应

8051的CPU在每个机器周期采样各中断源的中断请求标志位,如果没有下述阻止条件,将在下一个机器周期响应被激活了的最高级中断请求:

1.CPU正在处理同级或更高级的中断;

2.现行机器周期不是所执行指令的最后一个机器周期;

3.正在执行的是RETI或是访问IE或IP的指令.

CPU在中断响应后完成如下的操作:

1.硬件清除相应的中断请求标志;

2.执行一条硬件子程序,保护断点,并转向中断服务程序人口

3.结束中断时执行RETI指令,恢复断点,返回主程序.

8051的CPU在响应中断请求时,由硬件自动形成转向与该中断源对应的服务程序入口地址,这种方法为硬件向量中断法.

五,中断服务程序的入口地址

编号中断源人口地址

0外部中断00003H

1定时器/计数器0000BH

2外部中断10013H

3定时器/计数器1001BH

4串行口中断0023H

各中断服务程序入口地址仅间隔8个字节,编译器在这些地址放入无条件转移指令跳转到服务程序的实际地址.

六,中断服务程序的语法规则

中断服务程序的语法规则如下:

函数的返回值函数名([参数])interruptn[usingm]

{

函数体;

}

对中断程序而言,函数的返回值和参数一般为void.

interruptn中n的取值为0~31的常数,不允许用表达式,表示中断向量的编号.

usingm中m的取值为0~3的常数,不允许用表达式,表示内部RAM中的工作寄存器.

七,中断说明

中断不允许用于外部函数,它对函数目标代码影响如下z

·当调用函数时,SFR中的ACC,B,DPH,DPL和PSW(当需要时)入钱;

.如果不使用寄存器组切换,甚至中断函数所需的所有工作寄存器都入钱;

.函数退出前,所有的寄存器内容出钱;

·函数由8051的指令"RETI"终止.

中断服务程序使用的任何程序也使用同一寄存器组.

八,中断例子

#include〈reg51.h〉

unsignedcharstatus;

bitflag;

voidservice_int()interrupt2using2

{

flag=1;

status=P1;

voidmain(void)

{

IP=0x04;IE=0x84;

for(;;){

if(flag){

switch(status){

case0:

break;

case1:

break;

case2:

break;

case3:

break;

default:

;}

flag=0;

}

}

}

习题

试设计满足下列要求的电路图:

1单片机采用89C51,时钟11.0592MHz;

2有4个指示灯表示状态;

3外接12位A/D芯片AD574;

4有4*4的键盘;

5有字符型LCD(画成插座形式,12Pin插座,管脚接法见书P253);

6有串行接口与计算机连接;

7设置8位二进制的地址,地址范围可表示为0~255;

8外接EEPROM.

定时器/计数器(T/C)

8051系列单片机至少有两个16位内部定时器/计数器,8052有三个定时器/计数器,其中有两个是基本定时器/计数器是定时器/计数器.它们既可以编程为定时器使用,也可以编程为计数器使用.

若是计数内部晶振驱动时钟,它是定时器;若是计数,8051的输入管脚的脉冲信号,它是计数器.

当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数率=1/12fosc.例当晶振为12MHz时,计数率=1000kHz,即每1μs计数值加1.

当T/C工作在计数器时,计数脉冲来自外部脉冲输入管脚T0(P3.4)或T1(P3.5),当T0或T1脚上负跳变时计数值加1.识别管脚上的负跳变需两个机器周期,即24个振荡周期.所以T0或T1脚输入的可计数外部脉冲的最高频率为1/24fosc,当晶振为12MHZ时,最高计数率为500kHz,高于此频率将计数出错.

一,与T/C有关的SFR

1,计数寄存器Th和TL

T/C是16位的,计数寄存器由TH高8位和TL低8位构成.

在特殊功能寄存器(SFR)中,

对应T/C0为TH0和TL0;

对应T/C1为TH1和TL1.

定时器/计数器的初始值通过TH1/TH0和TL1/TL0设置.

2,定时器/计数器控制寄存器TCON

前面已介绍.

二,与T/C有关的SFR

3,T/C的方式控制寄存器TMOD

.C/T:

计数器或定时器选择位;

1→为计数器;0→为定时器.

.GATE:

门控信号;

1→T/C的启动受到双重控制,即要求TR0/TR1和INT0/INT1同时为高;

0→T/C的启动仅受TR0或TR1控制.

GATEC/TM1M0GATEC/TM1M0

D7D6D5D4D3D2D1D0

T/C1

T/C0

三,四种工作方式

M1M0方式功能

00013位定时器/计数器,TL是低5位,TH是高8位

01116位定时器/计数器

102常数自动重装的8位定时器/计数器

113仅用于T/C0,是两个8位定时器/计数器

利用定时器编写时钟程序.

四,T/C工作方式的说明

1.方式0:

当TMOD中MlM0=00时,T/C工作在方式0;

方式0为13位的T/C,由TH的高8位,TL的低5位的计数值,满计数值213,但启动前可以预置计数初值.

若T/C开中断(ET=1)且CPU开中断(EA=1)时,则定时器/计数器溢出时,CPU转向中断服务程序时,且TF白动清0.

2.方式1:

当TMOD中MlM0=01时,T/C工作在方式1;

方式1与方式0基本相同.唯一区别在于计数寄存器的位数是16位的,由TH和TL寄存器各提供8位,满计数值为216.

 

四,T/C工作方式的说明

3.方式2:

当TMOD中MlM0=10时,T/C工作在方式2;

方式2是8位的可自动重载的T/C,满计数值为28;

在方式0和方式1中,当计数满后,若要进行下一次定时/计数,须用软件向TH和TL重装预置计数初值;

方式2中TH和TL被当作两个8位计数器,计数过程中,TH寄存8位初值并保持不变,由TL进行8位计数.计数溢出时,除产生溢出中断请求外,还自动将TH中初值重装到TL,即重装载.

4.方式3:

方式3只适合于T/C0.当T/CO工作在方式3时,TH0和TL0成为两个独立的8位计数器.

五,定时器/计数器的初始化

在使用8051的定时器/计数器前,应对它进行编程初始化,主要是对TCON和TMOD编程;计算和装载T/C的计数初值.一般完成以下几个步骤:

(1)确定T/C的工作方式——编程TMOD寄存器;

(2)计算T/C中的计数初值,并装载到TH和TL;

(3)T/C在中断方式工作时,须开CPU中断和源中断——编程IE寄存器;

(4)启动定时器/计数器——编程TCON中TR1或TR0位. 

六,定时器/计数器的初值计算

在定时器方式下,T/C是对机器周期脉冲计数的,若fosc=12MHz,一个机器周期为12/fosc=1μs,则:

方式013位定时器最大定时间隔=8.192ms;(2的13次方=8192)

方式116位定时器最大定时间隔=65.536ms;(2的16次方=65536)

方式28位定时器最大定时间隔=256μs.

若使T/C工作在定时器方式1(16位二进制),要求定时1ms,求计数初值.设计数初值为x,则有:

(65536-x)×1μs=1000μs

或x=65536一1000

因此,TH,TL可置-1000;

即:

TH=-1000/256;TL=-1000%256.

对一般fosc有下列公式(设定时时间为timeμs):

(216-x)×12/fosc=timeμs

例1,设单片机的fosc=12MHz,要求在P1.0脚上输出周期为2ms的方波

采用查询方式.

#include〈reg51.h〉

sbitP1_0=P1^0;

voidmain(void〉

{TMOD=0x01;TR0=1;

for(;;)

{TH0=-1000/256;

TL0=-1000%256;

do{}while(!

TF0);

P1_0=!

P1_0;

TF0=0;

}

}

采用中断方式.

#include〈reg51.h>

sbitP1_0=P1^0;

voidtimer0(void)interrupt1using1{P1_0=!

P1_0;TH0=-1000/256;

TL0=-1000%256;}

voidmain(void)

{TMOD=0x01;P1_0=0;

TH0=-1000/256;

TL0=-1000%256;

EA=1;ET0=1;TR0=1;

do{}while

(1);

}

例2,设单片机的fosc=6MHz,要求在P1.7脚上的指示灯亮一秒灭一秒.

voidmain(void)

{P1_7=0;P1_0=1;

TMOD=0x61;

TH0=-50000/256;

TL0=-50000%256;

TH1=-5;TL1=-5;

IP=0x08;

EA=l;ET0=1;

ET1=l;TR0=l;

TR1=1;

for(;;){}

}

#include

sbitP1_0=P1^0;

sbitP1_7=P1^7;

voidtimer0()interrupt1using1

{P1_0=!

P1_0;

TH0=-50000/256;

TL0=-50000%256;

}

voidtimer1()interrupt3using2

{P1_7=!

P1_7;}

例3,设单片机的fosc=10MHz,要求在P1.0脚上输出周期为2.5μs,占空比20%.

#include

#defineucharunsignedchar

uchartime;

ucharperiod=250;

ucharhigh=50;

voidtimer0()interruptlusing1

{TH0=-8333/256;

TL0=-8333%256;

if(++time==high)P1=0;

elseif(time==period)

{time=0;P1=1;}

}

voidmain(void)

{

TMOD=0x01;

TH0=-8333/256;

TL0=-8333%256;

EA=l;

ET0=1;

TR0=1;

do{)while

(1);

}

#include

#defineucharunsignedchar

#defineuintunsignedint

uchartime,status,percent,period;

bitone_round;

uintoldcount,target=500;

voidpulse(void)interrupt1usingl

{TH0=-833/256;

TL0=-833%256;ET0=l;

if(++time==percent)P1=0;

elseif(time==100)

{time=0;P2=l;}

voidtachmeter(void)interrupt2using2

{union{uintword;

struct{ucharhi;ucharlo;}byte;}newcount;

newcount_byte.hi=TH1;

newcount_byte.lo=TLl;

period=newcount.word--oldcounts;

oldcount=newcount.word;

one-round=1;

voidmain(void)

{IP=0x04;

TMOD=0x01;

TCON=0x54;

TH1=0;TL1=0;

IE=0x86;

for(;;)

{if(one_round)

{if(period

{if(percent0)

--percent;

}

}

}

串行口

8051系列单片机有一个标准的串行通信接口,发送数据时由TXD端口送出,接收数据时由RXD端口输入.

内置两个缓冲器SBUF,一个接受缓冲器,另一个是接收缓冲器,可实行全双工的串行通信.

近距离可直接用TTL电平,若与计算机通信,则需要将电平转换成RS232电平形式,若需长距离通信可以采用RS485电平形式,通信的数据必须通过软件的编写来完成.

一,与串行口有关的SFR

1,串行口控制寄存器SCON

SM0SM1SM2RENTB8RB8TIRI

D7D6D5D4D3D2D1D0

.SM0,SM1:

串行口工作方式控制位(见书P158).

.SM2:

多机通信控制位(方式2,3);

1→只有接收到第9位(RB8)为1,RI才置位;

0→接收到字符RI就置位.

.REN:

串行口接收允许位;

1→允许串行口接收;0→禁止串行口接收.

.TB8:

方式2和方式3时,为发送的第9位数据,也可以作奇偶

校验位.

.RB8:

方式2和方式3时,为接收到的第9位数据;方式1时,

为接收到的停止位.

.TI:

发送中断标志;由硬件置位,必须由软件清0.

.RI:

接收中断标志;由硬件置位,必须由软件清0.

一,与串行口有关的SFR

2,电源控制寄存器PCON

SMOD

D7D6D5D4D3D2D1D0

PCON的第7位SMOD是与串行口的波特率设置有关的选择位.

.SMOD:

串行口波特率加倍位.

1→方式1,3波特率=定时器1溢出率/16;方式2波特率为fosc/32;

0→方式1,3波特率=定时器1溢出率/32;方式2波特率为fosc/64.

二,串行口的工作方式

1.方式0

方式0为移位寄存器输入/输出方式,串行数据通过RXD输入/输出,TXD则用于输出移位时钟脉冲.

方式0时,收发的数据为8位,低位在前.波特率固定为fosc/12,其中fosc为单片机外接晶振频率.

发送是以写SBUF寄存器的指令开始的,8位输出结束时TI被置位.

方式0接收是在REN=1和RI=0同时满足时开始的.接收的数据装入SBUF中,结束时RI被置位.

移位寄存器方式的也可用于两个单片机之间的通信.和通常9600波特相比,lMHz通信能力对短距离通信很吸引人.

二,串行口的工作方式

2.方式1

方式1是10位异步通信方式,1位起始位(0),8位数据位和1位停止位

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

当前位置:首页 > 求职职场 > 简历

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

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