单片机学习小组
登录
直播中
王飞云
7年用户
1432经验值
私信
关注
什么是中断?CPU如何知道是哪一个中断呢
开启该帖子的消息推送
嵌入式
cpu
中断
什么是中断?
CPU如何知道是哪一个中断呢?C语言如何去编写我们的中断系统函数?
回帖
(1)
丁欣如
2022-2-25 14:27:56
1、规范使用我们的单片机开发板
(1)、给单片机通电之后,
不要用手触摸引脚
(2)、芯片不能装反
(3)、先关闭单片机电源,再撤掉数据线
2、LED流水灯
/*------------------按键 ---------------------*/
我们51单片机。一共是配置有4个独立的按键
key1 ===》 P3^3
key2 ===》 P3^4
key3 ===》 P3^6
key4 ===》 P3^7
***it key1 = P3^3;
if(key1 == 0)
{
执行语句1;
}
else
{
````````;
}
练习:
编写一个按键控制LED灯的函数;
测试没有小抖动的程序与消除抖动之间的区别。
/*-------------------
模块化编程-
---------------*/
1、对工程进行模块化划分
一个模块一个.c
一个.c 对应一个 .h
在.c 文件中 , 一个功能一个函数
在*.c文件中,如果需要需要用到其他模块的函数
怎么办?
#include "****.h"
去包含
在.c文件中 , 每一个函数, 我们需要对它进行功能注释, 方便以后进行复习回顾
练习:
把我们的工程进行模块化
全局变量 、 局部变量
int a ;
void sum()
{
int b = 1 , c = 2;
a = b + c;
}
void chu()
{
int b = 2 , c = 1;
a = b / c;
}
main()
{
sum();
chu();
}
/---------* 蜂鸣器 * ------- /
蜂鸣器:
蜂鸣器威廉希尔官方网站 :
使用的PNP型三极管 驱动蜂鸣器 , 当P0^7为低电平时,PN结
正向偏置,三极管导通,蜂鸣器发出声音:
***it beep = P0^7;
练习:
通过按键,操作我们的蜂鸣器
========================================================
/---------------------
中断
------------------------/
1、
问题的引入
while(1)
{
if( 0 == key1 )
;
if( 0 == key2 )
;
}
上面这种检测按键是否按下的方式:
称之为 “轮询”
2、
轮询
轮流的询问 , (相当于 CPU 一直询问按键 1 与 按键 2 , 是否按下)
显然 , 轮询去判断按键 ,有什么缺点?
(1)、 占用CPU
(2)、 轮询存在时间差
我们这里用的方式是一直在等待 , 那么有没有一种方法 , 不用去登 ,
而是当有按键按下或者弹起的时候 , 来通知 “我”
==》》 中断系统
1、什么是中断?
我们一般把打断CPU执行顺序的事件 , 称之为中断 ,
C51中断原理
:
当特定的中断产生时 , CPU会立即切换到中断模式
打断我们main函数的执行 , 到指定的地址去执行中断处理函数。
例子:
看综艺
玩游戏、打电话
中断源:
产生中断事件的设备
C51中 支持 5 个中断
外部中断0 P3^2
定时器0中断
外部中断1 P3^3
定时器1中断
串口中断
那么当中断产生之后 , 我们如何知道是哪一个中断呢?我们该去哪里找
CPU如何知道是哪一个中断:
中断向量表
:
不同的中断 , 对应的不同的入口地址
[tr]编号中断源:入口地址[/tr]
0
外部中断0
0003H
1
定时器0中断
000BH
2
外部中断1
0013H
3
定时器1中断
001BH
4
串口中断
0023H
编号才编程当中最需要用到的
所以请多看、多记编号
C51中断的配置
:
外部中断0 、 1:
触发方式:
低电平触发: IT0 = 0 IT1 = 0
下降沿触发: IT0 = 1 IT1 = 1
中断开关:
EX0 -> 外部中断 0
EX1 -> 外部中断 1
使能外部中断 EX0 EX1 , 置 1
中断总开关
EA = 1
C语言如何去编写我们的中断系统函数
1、中断初始化
2、编写中断服务函数
练习:
通过外部按键中断 ,去打断我们main执行的流水灯 ,
中断服务函数(另一种花样的流水灯程序)
伪代码:
/*-----------中断初始化函数---------------*/
void interrupt_init()
{
//配置外部中断1 , 低电平触发:
//使能外部中断1
//开启中断总允许
}
/*------------中断服务函数---------------*/
void interrupt(void) interrupt 编号
{
//用户自由编写
}
实例
#include"interrupt.h"
#include"led.h"
#include"key.h"
#include
/*-----------中断初始化函数---------------*/
void interrupt_init()
{
IT1 = 0; //配置外部中断1,低电平触发
EX1 = 1; //使能外部中断1
EA = 1; //开启中断总允许
}
/*------------中断服务函数---------------*/
void interrupt_IT1(void) interrupt 2
{
led_huayang();
}
/*-------------数码管-------------*/
数码管:
准备来说,是LED数码管
是由多个发光二极管封装在一起组成“8”字型的器件
对应的LED引脚已经在内部连接成功,总共8个LED
分别对应的字母为
a , b , c ,d , e , f , g ,dp
例如:
显示数字 “2”
a亮,b亮,c灭 , d亮 ,e亮 ,f灭 ,g亮 ,dp亮
0010 0100 ==》 0x24
我们16进制对应的二进制表达式:
低字节是在右边
所以我们的寄存器P0组的P0^0对应的
是最右边的比特
所以需要从右开始依次对P0组进行改写
0010 0100
0x24
进行寄存器整体赋值
P0 = 0x24;
在点亮我们的数码管之前:
要开启相应的位选 , 也就是开关
是的我们的a~dp把条引线去作用于对应的数码管
位选代码
#include"shumaguan.h"
#include"delay.h"
#include
***it w1 = P1^0;
***it w2 = P1^1;
***it w3 = P1^2;
***it w4 = P1^3;
void show_0718(){
w4 = 0;
P0 = 0xc0;
delay_ms(1);
w4 = 1;
w3 = 0;
P0 = 0xf8;
delay_ms(1);
w3 = 1;
w2 = 0;
P0 = 0xf9;
delay_ms(1);
w2 = 1;
w1 = 0;
P0 = 0x7f;
delay_ms(1);
w1 = 1;
}
总结今天讲的内容:
蜂鸣器、按键 、模块化编程、数码管 、中断
1、外部按键中断实现所有的数码管依次从0显示到9
中断用外部中断1 , 下降沿触发的方式
(用到延时函数)
1、规范使用我们的单片机开发板
(1)、给单片机通电之后,
不要用手触摸引脚
(2)、芯片不能装反
(3)、先关闭单片机电源,再撤掉数据线
2、LED流水灯
/*------------------按键 ---------------------*/
我们51单片机。一共是配置有4个独立的按键
key1 ===》 P3^3
key2 ===》 P3^4
key3 ===》 P3^6
key4 ===》 P3^7
***it key1 = P3^3;
if(key1 == 0)
{
执行语句1;
}
else
{
````````;
}
练习:
编写一个按键控制LED灯的函数;
测试没有小抖动的程序与消除抖动之间的区别。
/*-------------------
模块化编程-
---------------*/
1、对工程进行模块化划分
一个模块一个.c
一个.c 对应一个 .h
在.c 文件中 , 一个功能一个函数
在*.c文件中,如果需要需要用到其他模块的函数
怎么办?
#include "****.h"
去包含
在.c文件中 , 每一个函数, 我们需要对它进行功能注释, 方便以后进行复习回顾
练习:
把我们的工程进行模块化
全局变量 、 局部变量
int a ;
void sum()
{
int b = 1 , c = 2;
a = b + c;
}
void chu()
{
int b = 2 , c = 1;
a = b / c;
}
main()
{
sum();
chu();
}
/---------* 蜂鸣器 * ------- /
蜂鸣器:
蜂鸣器威廉希尔官方网站 :
使用的PNP型三极管 驱动蜂鸣器 , 当P0^7为低电平时,PN结
正向偏置,三极管导通,蜂鸣器发出声音:
***it beep = P0^7;
练习:
通过按键,操作我们的蜂鸣器
========================================================
/---------------------
中断
------------------------/
1、
问题的引入
while(1)
{
if( 0 == key1 )
;
if( 0 == key2 )
;
}
上面这种检测按键是否按下的方式:
称之为 “轮询”
2、
轮询
轮流的询问 , (相当于 CPU 一直询问按键 1 与 按键 2 , 是否按下)
显然 , 轮询去判断按键 ,有什么缺点?
(1)、 占用CPU
(2)、 轮询存在时间差
我们这里用的方式是一直在等待 , 那么有没有一种方法 , 不用去登 ,
而是当有按键按下或者弹起的时候 , 来通知 “我”
==》》 中断系统
1、什么是中断?
我们一般把打断CPU执行顺序的事件 , 称之为中断 ,
C51中断原理
:
当特定的中断产生时 , CPU会立即切换到中断模式
打断我们main函数的执行 , 到指定的地址去执行中断处理函数。
例子:
看综艺
玩游戏、打电话
中断源:
产生中断事件的设备
C51中 支持 5 个中断
外部中断0 P3^2
定时器0中断
外部中断1 P3^3
定时器1中断
串口中断
那么当中断产生之后 , 我们如何知道是哪一个中断呢?我们该去哪里找
CPU如何知道是哪一个中断:
中断向量表
:
不同的中断 , 对应的不同的入口地址
[tr]编号中断源:入口地址[/tr]
0
外部中断0
0003H
1
定时器0中断
000BH
2
外部中断1
0013H
3
定时器1中断
001BH
4
串口中断
0023H
编号才编程当中最需要用到的
所以请多看、多记编号
C51中断的配置
:
外部中断0 、 1:
触发方式:
低电平触发: IT0 = 0 IT1 = 0
下降沿触发: IT0 = 1 IT1 = 1
中断开关:
EX0 -> 外部中断 0
EX1 -> 外部中断 1
使能外部中断 EX0 EX1 , 置 1
中断总开关
EA = 1
C语言如何去编写我们的中断系统函数
1、中断初始化
2、编写中断服务函数
练习:
通过外部按键中断 ,去打断我们main执行的流水灯 ,
中断服务函数(另一种花样的流水灯程序)
伪代码:
/*-----------中断初始化函数---------------*/
void interrupt_init()
{
//配置外部中断1 , 低电平触发:
//使能外部中断1
//开启中断总允许
}
/*------------中断服务函数---------------*/
void interrupt(void) interrupt 编号
{
//用户自由编写
}
实例
#include"interrupt.h"
#include"led.h"
#include"key.h"
#include
/*-----------中断初始化函数---------------*/
void interrupt_init()
{
IT1 = 0; //配置外部中断1,低电平触发
EX1 = 1; //使能外部中断1
EA = 1; //开启中断总允许
}
/*------------中断服务函数---------------*/
void interrupt_IT1(void) interrupt 2
{
led_huayang();
}
/*-------------数码管-------------*/
数码管:
准备来说,是LED数码管
是由多个发光二极管封装在一起组成“8”字型的器件
对应的LED引脚已经在内部连接成功,总共8个LED
分别对应的字母为
a , b , c ,d , e , f , g ,dp
例如:
显示数字 “2”
a亮,b亮,c灭 , d亮 ,e亮 ,f灭 ,g亮 ,dp亮
0010 0100 ==》 0x24
我们16进制对应的二进制表达式:
低字节是在右边
所以我们的寄存器P0组的P0^0对应的
是最右边的比特
所以需要从右开始依次对P0组进行改写
0010 0100
0x24
进行寄存器整体赋值
P0 = 0x24;
在点亮我们的数码管之前:
要开启相应的位选 , 也就是开关
是的我们的a~dp把条引线去作用于对应的数码管
位选代码
#include"shumaguan.h"
#include"delay.h"
#include
***it w1 = P1^0;
***it w2 = P1^1;
***it w3 = P1^2;
***it w4 = P1^3;
void show_0718(){
w4 = 0;
P0 = 0xc0;
delay_ms(1);
w4 = 1;
w3 = 0;
P0 = 0xf8;
delay_ms(1);
w3 = 1;
w2 = 0;
P0 = 0xf9;
delay_ms(1);
w2 = 1;
w1 = 0;
P0 = 0x7f;
delay_ms(1);
w1 = 1;
}
总结今天讲的内容:
蜂鸣器、按键 、模块化编程、数码管 、中断
1、外部按键中断实现所有的数码管依次从0显示到9
中断用外部中断1 , 下降沿触发的方式
(用到延时函数)
举报
更多回帖
rotate(-90deg);
回复
相关问答
嵌入式
cpu
中断
UART PMDA模式接收数据,pmda和串口
中断
全打开会进
哪一个中断
?
2023-08-24
108
使用ReadStatusRegister怎么
知道
触发了哪
个中断
?
2019-09-19
2094
STM32使能定时器更新
中断
和捕获
中断
同时发生那么
CPU
会先因为哪
个中断
源进入
中断
呢
?
2018-09-04
8313
STM32
一
个中断
线配置两
个中断
的问题
2017-11-29
9908
请问如何区别不同的HPM6750 IO
中断
呢
?
2023-05-26
415
在单片机UART
中断
中TXE与TC
哪一个
先发生
呢
2021-11-03
1050
MCS51的
中断
系统有几
个中断
源?几
个中断
优先级?
2023-10-30
378
请问STM32的
中断
里面有的标志都有什么用?
2019-07-17
2084
如何在
中断
中识别PIN?
2019-09-30
1280
多
个中断
的问题如何解决
2020-05-07
1527
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分