您的位置:首页 > 其它

【51单片机实验】INT0中断计数

2017-11-11 14:45 405 查看
前言

—中断源—

52单片机:6个中断源:

INT0:外部中断0,P3.2,引起:低电平、下降沿

INT1:外部中断1,P3.3,引起:低电平、下降沿

T0:定时器/计数器0中断,由T0计数器计满回零引起

T1:定时器/计数器1中断,由T1计数器计满回零引起

T2:定时器/计数器2中断,由T2计数器计满回零引起

TI/RI:串行口中断,引起:串行端口完成一帧字符发送/接收



优先级

—51系列单片机中用于中断控制的寄存器为—

IE,中断允许控制寄存器,各位定义如下:

(外定0;外定1;串;空空;C)

EX0(IE.0),外部中断0允许位;

ET0(IE.1),定时/计数器T0中断允许位;

EX1(IE.2),外部中断0允许位;

ET1(IE.3),定时/计数器T1中断允许位;

ES (IE.4),串行口中断允许位;

ET2(IE.5),定时器/计数器2中断允许位(T2:51特有)

EA (IE.7), CPU中断允许(总允许)位。

有的芯片IE.5及IE.6没用定义。

值为1,开中断;值为0,关中断



IP,中断优先级控制寄存器,各位定义如下:

(外定0;外定1;串定2;空空)

PX0(IP.0),外部中断0优先级设定位;

PT0(IP.1),定时/计数器T0优先级设定位;

PX1(IP.2),外部中断0优先级设定位;

PT1(IP.3),定时/计数器T1优先级设定位;

PS (IP.4),串行口优先级设定位;

//PT2(IP.5) ,52芯片是无效位,定时/计数器T2优先级设定位。

IP.6和IP.7没有定义。



—中断嵌套—

 高优先级能打断低优先级-》中断嵌套;同优先级则不能,按照默认级别响应,若设置优先级,则按照设置顺序相应。

—中断函数—

中断函数是硬件或者操作系统自动调用

也就是说只要满足触发条件,就会自动调用中断函数(此时主函数是停止的)。

当中断函数执行完毕,又返回主函数继续执行主函数。

然后这样不断的循环,反正只要是触发中断的条件一满足。

就会自动进入中断(前提是你的中断的配置是正确的)

 

实验一

INT0中断计数

流程图



程序分析

计数按键:P3.2引脚(INT0),IE=0x81(1000 0001对应:EA,EX0,ET0,EX1,ET1,ES):允许INT0中断,

IT0=1:将INT0中断触发方式设为下降沿触发:按键按下,P3.2由高到低触发中断;

未释放,则不会持续触发;

只有 释放按键后再次按下,才会由跳变再次出发,累加计数值

按键识别

计数键:(中断方式:interrupt 0)

中断触发识别,中断触发即表示计数键按下,中断例程EX_INT0将自动调用,Count累加,INT0:interrupt 0

清零键(查询方式 while();)

while(1);实现,循环轮询,不间断查看P3.4是否为0,若为0,清零键按下

扩展

可修改代码:交换计数键和清零键的工作方式。

代码

/*每次按下计数键时,触发INT0中断,
中断程序累加计数,
计数值显示在3只数码管上,按下清零键时数码管清零。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar code DSY_CODE[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x00
};//0~9的数字编码,最后一位为黑屏

uint Count = 0;
sbit Clear_Key = P3 ^ 6;

void Show_Count_ON_DSY()//显示计数值
{
Display_Buffer[2] = Count / 100;//获取三个数位
Display_Buffer[1] = Count % 100 / 10;
Display_Buffer[0] = Count % 10;

if (Display_Buffer[2] == 0)//高位为0时不显示
{
Display_Buffer[2] = 0x0a;//0x0a即是10号,对应0x00

//高位为0时,如果第二位为0,则同样不显示
if (Display_Buffer[2] == 0)
Display_Buffer[1] = 0x0a;
}
P0 = DSY_CODE[Display_Buffer[0]];
P1 = DSY_CODE[Display_Buffer[1]];
P2 = DSY_CODE[Display_Buffer[2]];

}

void main()
{
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
IE = 0x81;
IT0 = 1;
while (1)
{
if (Clear_Key == 0)
Count = 0;
Show_Count_ON_DSY();
}
}

void EX_INT0()interrupt 0
{
Count++;
}


后语

中断是单片机里的重要组成部分,在感觉学习吃力的同时,要掌控好学习进度。(学习时间:大约5小时,注意效率!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单片机 51单片机