单片机定时记数中断程序1--c语言实现

时间:2021-02-26 02:10:37

 

                 定时计数综合程序

 

如图所示,在P1.7端接一个发光二极管,要求利用c/~t控制,使led1 s,灭1 s,周而复始!

 

 硬件电路(略)

定时/计数器简称定时器,8051单片机有216位的定时/计数器:定时器0T0)和定时器1T1)。T02个特殊功能寄存器TH0TL0构成,T1则由TH1TL1构成。作计数器时,通过引脚T0P3.4)和T1P3.5)对外部脉冲信号计数,当输入脉冲信号从10的负跳变时,计数器就自动加1。计数的最高频率一般为振荡频率的1/24

 

分析:要时使led 1m ,灭 1m ,也就是从P1.7端输出一周期1 s的方波(半周期为500ms),定时器共有四种工作方式,以6Mhz的晶振为例,一个定时计数系统的最大定时为131ms,远远小于500ms,因此必须使用两个定时器

分析计算:500ms=5*100ms,定时/计数器0用作定时100ms,定时/计数器1用作计数,定/计时器0为中断方式,定/计时器1为查询方式。

 

定时器共有2个控制寄存器TMODTCON,由软件写入TMODTCON 两个8位寄存器,设置各个定时器的操作方式和控制功能.

 

 

TMOD

GATE

C/T

M1

M0

GATE

C/T

M1

M0

 

 

 

 

 

 

 

 

 

           GATE 中断门控 gate=0 int0无关 gate=1int0有关

           C/T   模式选择 =0定时模式  =1计数模式

 

TCON

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

88

8F

8E

8D

8C

8B

8A

89

88

           TRi=0 Ti计数        TRi=1 Ti计数 

           TFi=0 Ti中断(硬件复位) TRF=1 有溢出中断

                       

1.定时器初值的计算

   定时器为加1计数器,计数器溢出产生中断。

   设:t-定时时间,TC-机器周期,fosc-晶振频率,

            L-计数器长度(13168),X-定时器初值

       t=( 2L X´TC 2L X´12 fosc

       X 2L   t ´12 fosc

 

假设fosc12MHz,最大定时时间(初值X=0

方式0t( 2L X)´12 fosc213 ´12(12 ´ 106) 8.192ms

方式1t216 ´12(12 ´ 106) 65.536ms

方式2t28 ´12(12 ´ 106) 0.256ms

方式3t28 ´12(12 ´ 106) 0.256ms

 

2.  定时器初始化

1)写TMOD,确定工作方式。

2)写THiTLi,装入计数初值。

3)置TRi1,启动Ti

4)置EA1,开CPU中断,置ETi1,开Ti中断。

 

 

#include<reg51.h>

sbit P1_0=P1^0;

sbit P1_7=P1^7;

 

void timer0(void) interrupt 1 using 1

      {

           P1_0= P1_0^0;  // P1.0取反

           TH0=0x 3c ;

           TL0=0xB0;

}

void main()

{

TMOD=0x0D1;

TCON=0x80;

IE=0x82;

TH0=0x 3c ;

      TL0=0xB0;

TH1=0x0FA;

TL1=0x0FA;

TR0=1;

TR1=1;

while(1)

      {

if(TF1)

      {

P1_7= P1_7^0;

TF1=0;

}

}

}