项目文件
文件
关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断
图中 P2.0引脚处接有一个发光二极管 D1,P3.2引脚处接有一个按键。要求分别采用一般方式和中断方式编程实现按键压下一次,D1 的发光状态反转一次的功能。
查询法
先讲查询法:
就是先把那二个端口定义了,然后按键按下的话,D1的电平反转
判断按键:
while(1)
{
if(P3_2==0) 事件;
}
这里为啥是0?
因为电路图:
你看原来按键没按下,端口处还是高电压水平,但是按下后接地,低电压水平,所以应该是0判断按下
按下后D1灯端口处电压反转,
P1_0=!P1_0;
这样就亮了
然后再按下按键就会又反转了,大致这样循环着
代码如下:
#include <reg51.h>
sbit p2_0=P2^0;
sbit p3_2=P3^2;
main(){
p2_0=1; //刚开始为1 灭
while(1){
if(p3_2==0) {
p2_0=!p2_0;
}
}
}
程序运行时,主函数需要不断查询 P3.2引脚的电平状态。若 p3_2为0则将p2_0值取反显然这一过程要占用大量主函数机时。
中断法
先定义sbit p1_0=P1^0端口
这里就要写中断处理函数了,就是灯端口电平反转
int0_srv () interrupt 0{
p2_0 = !p2_0;
}
interrupt 0通常指的是中断向量表中的第0个中断(等级高),也就是系统中断。当系统需要处理一些紧急的事件时,会触发中断,让CPU暂停当前的任务,转而去处理中断事件。中断向量表中的每个中断都对应着一个中断处理程序,当中断发生时,CPU会跳转到对应的中断处理程序中去执行。
再来主函数:
main(){
IT0=1; //中断初始化 高优先级中断
EX0=1; //外部中断0被使能,可以响应外部中断信号(按键传感器之类的)
EA=1; //中断使能位EA 所有中断都被使能
while(1); //无限循环
}
这一程序由主函数和中断函数组成,中断函数int0_srv()完成p2_0电平翻转作用,主函数中的 while(1)语句则模拟任意任务的语句。
代码整体:
#include <reg51.h>
sbit p2_0=P2^0;
int0_srv () interrupt 0{
p2_0 = !p2_0;
}
main(){
IT0=1; //中断初始化 高优先级中断
EX0=1; //外部中断0被使能,可以响应外部中断信号(按键传感器之类的)
EA=1; //中断使能位EA 所有中断都被使能
while(1); //无限循环
}
可见,该程序也可以实现按键压下一次、D1的发光状态翻转一次的功能。该主函数中没有按键检测语句,故不会占用主函数机时。
运行结果
单片机c51-开关状态检测中断