51单片机入门 - 中断的使用

博主福利:100G+电子设计资料合集icon-default.png?t=N7T8https://dwz.date/fyQa

1、中断:放下手中的事情去处理另一种事情。
 
2、定时器中断
       

定时器是单片机模块的一个资源,确确实实存在的一个模块,中断是单片机的一种运行机制。不是一回事,不只是定时器才能触发中断。
       

对单片机的操作主要是操作IO口和操作寄存器的。


x * 8 + 3 = 向量地址 —— x为中断函数编号
 
3、数码管动态扫描


余晖效应:(10ms)     
P0 = 0xff; // 消隐
EA = 0;
ET0 = 0; // 开总中断,开定时器0中断


#include <reg52.h>

 

typedef unsigned int uint;

typedef unsigned char uchar;

 

uchar code display[] =

{

  //数码管显示字符转换表

  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

  0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};

uchar buffer[6] =

{

  //数码管显示缓冲区,初值0xFF确保启动时都不亮

  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF

};

uint cnt = 0; //记录T0中断次数

 

int main(void)

{

  unsigned long sec = 0;  //记录经过的秒数

 

  EA = 1;       //使能总中断

  TMOD = 0x01;  //设置T0为模式1

  TH0 = 0xFC;  //为T0赋初值0xFC67,定时1ms

  TL0 = 0x67;

  ET0 = 1;     //使能T0中断

  TR0 = 1;     //启动T0

 

  while(1);

 

    return 0;

}

/* 定时器0中断服务函数 */

void InterruptTimer0() interrupt 1

{

  static uchar i = 0;   //动态扫描的索引

 

  TH0 = 0xFC; //重新加载初值

  TL0 = 0x67;

  cnt++;      //中断次数计数值加1

  //以下代码完成数码管动态扫描刷新

  P0 = 0xFF;  //显示消隐

  switch (i)

  {

  case 0:

    P1 = 0xfe;

    i++;

    P0 = buffer[0];

    break;

  case 1:

    P1 = 0xfd;

    i++;

    P0 = buffer[1];

    break;

  case 2:

    P1 = 0xfb;

    i++;

    P0 = buffer[2];

    break;

  case 3:

    P1 = 0xf7;

    i++;

    P0 = buffer[3];

    break;

  case 4:

    P1 = 0xef;

    i++;

    P0 = buffer[4];

    break;

  case 5:

    P1 = 0xdf;

    i = 0;

    P0 = buffer[5];

    break;

  default:

    break;

  }

  if(cnt >= 1000)  //判断T0溢出是否达到1000次

  {

    cnt = 0;      //达到1000次后计数值清零

    sec++;        //秒计数自加1

    //以下代码将sec按十进制位从低到高依次提取并转为数码管显示字符

    buffer[0] = display [sec % 10];

    buffer[1] = display [sec / 10 % 10];

    buffer[2] = display [sec / 100 % 10];

    buffer[3] = display [sec / 1000 % 10];

    buffer[4] = display [sec / 10000 % 10];

    buffer[5] = display [sec / 100000 % 10];

  }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值