×
单片机 > 单片机程序设计 > 详情

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

发布时间:2024-05-12 发布时间:
|

前言

—中断源—


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(10000001对应:EA,EX0,ET0,EX1,ET1,ES):允许INT0中断,


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

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

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


按键识别:


计数键:(中断方式:interrupt0)

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


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

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

扩展

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


代码


/*每次按下计数键时,触发INT0中断,

中断程序累加计数,

计数值显示在3只数码管上,按下清零键时数码管清零。

*/

#include

#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小时,注意效率!)


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32 总线矩阵介绍