最近学习51单片机,算是古董级的单片机。51单片机非常经典,好比C语言之于编程语言,而且由于价格便宜而应用非常广泛,资料可以说是最多最全的,对于初学者来说,学习成本非常低,想学习单片机的同学可以了解一下。
中断,是单片机非常重要的概念,能不能用好中断,是检验学习者单片机掌握程度的一个标志,下面通过一个按键点亮LED灯实验来了解中断是什么,能干什么。
先上代码
//中断函数实验
#include
#define uchar unsigned char
sbit key_s2 = P3^0;//独立按键s2
sbit flag = P3^7;//外部中断信号产生脚
void delay(int z)
{
int x,y;
for(x = z; x > 0; x--)
for(y = 144; y > 0; y--);
}
//外部中断初始化
void int1Init()
{
EA = 1; //开总中断
EX1 = 1; //外部中断1允许位
IT1 = 1; // 外部中断1下降沿触发
}
//外部中断1服务程序
void int1() interrupt 2
{
P1 = ~P1;
}
void main()
{
int1Init();
while(1)
{
if(key_s2 == 0)
{
delay(20);//按键消抖
if(key_s2 == 0)
{
flag = 1;
flag = 0;//产生下降沿
while(!key_s2);
}
}
}
}
前期准备:原料:一块51单片机开发板。接线:将p33和p37用杜邦线连接。上电下载,按下按键s2,LED全部点亮,再按下s2,LED全部灭,再按s2,又全部点亮,...,这样循环。
原理:中断就是一种特殊的函数,没有什么神秘的地方,外国人开发的,起名叫中断,要是我,我就给它起名叫电信号函数。为什么是电信号函数?
首先说说中断的背景,单片机是一个经常要和外部信号打交道的东西,外面有信号了,单片机就要进行一番动作,这个信号的本质其实就是一个电信号,也就是电压发生变化,早期,工程师们为了让处理器处理这些信号,必须有个东西能够识别这些信号,那就发明了这样的玩意儿:中断。当外部信号来了,也就是电信号来了,处理器就去执行特定的函数,所以我叫它电信号函数。
自然要问,这个程序的电信号是啥?看这里:flag = 1;
flag = 0;//产生下降沿
看见下降沿没?也就是说,如果有了下降沿,意味着单片机就要有所作为了,它要去执行它的特定函数去,也就是电信号函数,在这里,已经定义好:void int1() interrupt 2
{
P1 = ~P1;
}
给LED管脚电平取反,按一次键,有一次下降沿,单片机有所作为一次,即灯亮,或灭。但是中断这玩意不是想作为就能作为,还要给设定一下,条件成熟,才有电信号函数发生的可能性,否则,就算电信号来了,电信号函数也不会执行。这就是前期准备:void int1Init()
{
EA = 1; //开总中断
EX1 = 1; //外部中断1允许位
IT1 = 1; // 外部中断1下降沿触发
}
瞧这名字起得多好,int1Init(),就是中断1初始化,注意了,看见初始化三个字,没别的,就是做前期准备,初始化完,就万事俱备,只欠东风,东风是啥?就是电信号。
注意:由于处理器每个时钟周期检测一次中断,因此中断触发条件至少要持续两个时钟周期,比方说,下降沿至少要保持两个时钟周期——一个高,一个低——才能确保被检测到,低电平至少要保持两个时钟周期才能确保被检测到。