博主福利:100G+电子设计学习资源包!

​http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect​​ --------------------------------------------------------------------------------------------------------------------------

 

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

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

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

 

51单片机入门 - 中断的使用_数码管

51单片机入门 - 中断的使用_数码管_02


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];

}

}