开头,先做一个小总结:
什么时候用定时器/计数器?什么时候用外部中断? 为什么?
如果说他们最大的区别,我自己学习总结的认为:
- 定时器/计数器 是软件成面的,也就是通过代码来实现,我们可以通过定时器/计数器中断控制寄存器 TMOD 来设置一个时间(下面会讲到),设置这个时间的目的是在计算机执行程序的过程中,在除了 main()函数 中 while(1) 的无限循环下,在定时器中断处理函数(void Time0Handler() interrupt 1)中,也进行无限循环,只不过每次循环的时间我们都可以自己设定(通过TMOD);
- 外部中断是硬件中断;比起定时器中断就简单多了,来自外部,开启后,不管你是什么,触发对应的引脚,就执行(void Ex0_Handler() interrupt 0 )外部中断处理函数。
下面来详细讲讲:
定时器/计数器
C51中的定时器和计数器是同一个硬件电路支持的,所有原理是一样的,标准C51有2个定时器/计数器:T0和T1。
定时/计数器的寄存器也分为可位寻址和不可位寻址两种
可位寻址和不可位寻址的区别是什么呢?
-可位寻址,就是指它的寄存器可以单独领出来,进行赋值和传递;
-不可位寻址,就是指它的寄存器不可以单独领出来,两个定时器的命名有重复,我们一般的操作是将 TMOD 进行 位运算 来进行定时器的选取和赋值:
//1. 配置定时器0工作模式位16位计时
//设置定时器模式 //选择定时器1
TMOD &= 0xF0;
TMOD |= 0x01;
//2. 给值,定一个0.5出来
TL0=0x33;
TH0=0xFE;
TL0&TH0,如何定呢?
- 根据选取的模式(TMOD)中的M1&M0,一般我们选择01就行,根据芯片手册可以了解到,01模式,是将TH&TL的位全用上,一共16个位,可以计数2^16个数,也就是65536下,可以加65536下;
- 加1进行了多久呢?当晶振频率是11.0592MHz的时候,等于11059.2KHz = 11059200Hz 机器周期 = 12 x 时钟周期 =12 x (1/时钟频率) 秒 = 12 / 时钟频率 秒 = 12 / 11059200 秒 = 12 000 000 / 11059200 微秒 = 1.085 微秒;
- 将
,可以算出TF0(计数溢出标志位)出现溢出时,需要71ms,也就是说,一次计数,最长71ms,是不是蛮长的;
外部中断
先启动一下!
void EX0_Init() 外部中断0,启动!
{
EX0 = 1;
IT0 = 0; //低电平触发
//1的话就是下降言触发
}
顾名思义,外部中断来自外部,它是硬件中断,是硬件成面的中断,因此外部中断比定时器中断快(硬件肯定比软件快,比软件精准度更高);
外部中断我们可以简单的理解为,他就是某个引脚引起的,每次这个中断引脚受到了触发,外部中断程序就立马执行(计算机会放下手下的工作,去执行中断程序,处理完成后,再转战之前的程序),因此可以明白,只要硬件上接到了中断引脚就行,用来接收外部的信号,不管是震动传感器,光传感器,不管是什么都可以,只要是来自外部的信号,给予了该引脚,都可以使用外部中断。
常见51单片机中断查询次序
查询次序越高,这个中断的优先级就越高。
当然,在大家写中断处理函数的时候,千万要注意函数后面的中断号!
感谢大家阅读,如果有什么错误,还请多多指教。