最近用到51单片机,算是古董级的单片机。51单片机非常经典,好比C语言之于编程语言,而且由于价格便宜而应用非常广泛,资料可以说是最多最全的,对于初学者来说,学习成本非常低,想学习单片机的同学可以了解一下。
中断,是单片机非常重要的概念,能不能用好中断,是检验学习者单片机掌握程度的一个标志,但是一些地方写的比较抽象,给中断裹上神秘的外衣,好像很独特的样子,其实不然,事物发展都是连续的,没有一蹴而就的概念。下面通过一个按键点亮LED灯实验来了解中断是什么,能干什么。
先上代码
//中断函数实验
#include<reg52.h>
#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初始化,这时单片机的小耳朵就竖起来准备监听了。注意了,看见初始化三个字,没别的,就是做前期准备,初始化完,就万事俱备,只欠东风,东风是啥?就是电信号。
注意:由于处理器每个时钟周期检测一次中断,因此中断触发条件至少要持续两个时钟周期,比方说,下降沿至少要保持两个时钟周期——一个高,一个低——才能确保被检测到,低电平至少要保持两个时钟周期才能确保被检测到。