51单片机中断与定时计数实验

本文详细解释了51单片机中断的概念,包括中断的发生、响应、服务过程以及中断在提高计算机利用效率、实时性和系统可靠性中的作用。还通过实例说明了如何使用T0和T1定时器进行LED控制,展示了中断在硬件编程中的实际应用。
摘要由CSDN通过智能技术生成

51单片机中断的原理

(1)中断的概念
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生),那么CPU就会暂停当前的工作(A事件),去执行B事件(中断响应和中断服务),然后B事件做完之后,再回到原来的事件(A事件)中继续工作。(中断的返回)。
在这里插入图片描述

(2)中断的作用
随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与I/O设备的数据传送问题,而且还有具有如下的优点:

  1. 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。
  2. 实时操作:CPU能够及时处理应用系统的随机事件,系统的实时性大大增强。
  3. 可靠性高:CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性更高。

定时器

(1)在AT89S51的P1口上接有8只LED,原理电路见图7-13。采用T0方式1的定时中断方式,使P1口外接的8只LED每0.5s闪亮一次。
在这里插入图片描述
(1)设置TMOD寄存器

T0工作在方式1,应使TMOD寄存器的M1、M0=01;应设置C/T*=0,为定时器模式;对T0的运行控制仅由TR0来控制,应使相应的GATE位为0。定时器T1不使用,各相关位均设为0。所以,TMOD寄存器应初始化为0x01。

(2)计算定时器T0的计数初值

设定时时间5ms(即5 000µs),设T0计数初值为X,假设晶振的频率为11.059 2MHz,则定时时间为:

定时时间=(216−X)×12/晶振频率
则 5 000=(216 −X) ×12/11.059 2

得 X = 60 928

转换成十六进制:0xee00,其中0xee装入TH0,0x00装入TL0。

(3)设置IE寄存器

  本例由于采用定时器T0中断,因此需将IE寄存器中的EA、ET0位置1。

(4)启动和停止定时器T0

将定时器控制寄存器TCON中的TR0=1,则启动定时器T0;TR0=0,则停止定时器T0定时。

代码:

#include<reg51.h>
char  i=100;
void main ()
{
   TMOD=0x01;            //定时器T0为方式1
   TH0=0xee;            //设置定时器初值
   TL0=0x00;

P1=0x00;                //P1口8个LED点亮
   EA=1;                    //总中断开
   ET0=1;                    //开T0中断
   TR0=1;                    //启动T0
   while(1);                //循环等待
   {
       ;
   }
}
void timer0() interrupt 1            //T0中断程序
{
   TH0=0xee;                //重新赋初值
   TL0=0x00;

i--;                    //循环次数减1
   if(i<=0)
   {
       P1=~P1;            //P1口按位取反
       i=100;                //重置循环次数
   }
}

中断

(2)如下图,T1采用计数模式,方式1中断,计数输入引脚T1(P3.5)上外接按钮开关,作为计数信号输入。按4次按钮开关后,P1口的8只LED闪烁不停。
在这里插入图片描述
(1)设置TMOD寄存器

T1工作在方式1,应使TMOD的M1、M0=01;设置C/T*=1,为计数器模式;对T0运行控制仅由TR0来控制,应使GATE0=0。定时器T0不使用,各相关位均设为0。所以,TMOD寄存器应初始化为0x50。
(2)计算定时器T1的计数初值

由于每按1次按钮开关,计数1次,按4次后,P1口的8只LED闪烁不停。因此计数器初值为65 536−4=65 532,将其转换成十六进制后为0xfffc,所以,TH0=0xff,TL0=0xfc。
(3)设置IE寄存器

本例由于采用T1中断,因此需将IE寄存器的EA、ET1位置1。

(4)启动和停止定时器T1

将寄存器TCON中TR1=1,则启动T1计数;TR1=0,则停止T1计数。

代码:

   #include <reg51.h>
   void Delay(unsigned int i)        //定义延时函数Delay( ),i是形                                     //式参数,不能赋初值

{    
   unsigned int j;        
   for(;i>0;i--)            //变量i由实际参数传入一个值                    //因此i不能赋初值
   for(j=0;j<125;j++)        
   {;}                //空函数
}
 
void  main( )                //主函数
{
   TMOD=0x50;            //设置定时器T1为方式1计数
   TH1=0xff;            //向TH1写入初值的高8位
   TL1=0xfc;            //向TL1写入初值的低8位
   EA=1;                    //总中断允许

   ET1=1;              //定时器T1中断允许  
   TR1=1;              //启动定时器T1
   while(1) ;              //无穷循环,等待计数中断
}
 
void T1_int(void)  interrupt 3      //T1中断函数
{
   for(;;)                //无限循环
   {    
       P1=0xff;            //8位LED全灭
       Delay(500) ;        //延时500ms
       P1=0;            //8位LED全亮
       Delay(500);        //延时500ms
   }                            
}

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值