分享

15W4K58S4 实验10:定时器中断

 360tsgyd 2018-07-04
电路连接如实验1

中断的应用1

要求:使用定时器T0,实现P0.0引脚LED灯亮30ms,灭30ms,持续闪烁,采取中断方式。RC时钟为22.1184MHz

主时钟fosc未设置分频,所以系统时钟SYSclk=fosc

并且每12个系统时钟周期计数一次


根据定时公式,预装入初值应为:

预装入初值=65536-T*SYSclk/12 

其中T为定时时间T=30ms=30000us=30000*10-6

SYSclk=fosc=22.1184MHz=22.1184*106

 

TSYSclk带入上式

预装入初值=65536-30000*10-6*22.1184*106/12=10240 

就是十六进制数 0x2800


#include "STC15W4K.H"    

sbit LED0=P0^0;

void delay500ms()

{

         unsigned char i,j,k;  // i,j,k由软件计算出并验证正确。

         for(i=41;i>0;i--)       

         for(j=133;j>0;j--)      

         for(k=252;k>0;k--);   

} 

void port_mode()            // 端口模式

{

 P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;

 P2M1=0x00;P2M0=0x00;P3M1=0x00; P3M0=0x00;

 P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;

 P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;

} 

void Timer0() interrupt 1

{

  LED0=!LED0;

} 

void main()

{

 uchar data i;

 port_mode();    //端口初始化,配置为准双向弱上拉,与传统51

for(i=1; i<=3; i++)  //LED灯亮三次,表明系统上电正常工作

 {

  LED0=0;  delay500ms();

  LED0=1;  delay500ms();

}

    P0=0xff;  //关闭P0口所以的LED

         TMOD=0x00;  //定时器0 16位自动重装入方式

         TH0=0x28;    //装入初值

         TL0=0x00;

    TR0=1;       //开启定时器

         ET0=1;       //定时器中断开

         EA=1;        //总中断开

         while(1);

} 

 

中断的应用2

要求:用定时器T0实现P0.0引脚的LED灯以1秒亮,1秒灭的方式闪烁,RC时钟22.1184MHz,使用中断方式。

主时钟fosc无分频,故系统时钟SYSclk=fosc

定时器T012个系统时钟周期计数一次

 

如果每20ms,产生一次中断,那么50次中断以后,就会得到1秒的定时

计算预装入初值,方法同中断的应用1

T=20ms=20000us=20000*10-6s

SYSclk=22.1184MHz=22.1184*106

预装入初值=65536-20000*10-6*22.1184*106/12=28672 

就是十六进制数 0x7000

这次将T0定时器的工作方式设置为  手动16位重装入 TMOD=0x01; 

#include "STC15W4K.H"       

#define uchar unsigned char

#define uint unsigned int

sbit LED0=P0^0;

void delay500ms()

{

         unsigned char i,j,k; 

         for(i=41;i>0;i--)

         for(j=133;j>0;j--)

         for(k=252;k>0;k--);

}

void port_mode()  // 端口模式

{

P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;

P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;

P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;

P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;

}

void Timer0() interrupt 1

{

  static uchar idata Count=0;  //静态变量,只初始化一次

  Count++;

  if(Count>=50)

  {

   LED0=!LED0;

   Count=0;

  }

  TH0=0x70;

  TL0=0x00;

}

void main()

{

 uchar data i;

 port_mode(); //端口初始化,配置为准双向弱上拉,与传统51

 for(i=1; i<=3; i++) //LED灯亮三次,表明系统上电正常工作

 {

  LED0=0; delay500ms();

  LED0=1; delay500ms();

 }

    P0=0xff;  //关闭P0口所以的LED

         TMOD=0x01;  //定时器0 16位手动重装入方式

         TH0=0x70;   //装入初值

         TL0=0x00;

    TR0=1;      //开启定时器

         ET0=1;      //定时器中断开

         EA=1;       //总中断开

         while(1);

}


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多