中断结合代码分析
本文总字数:2422,阅读预计需要:6分钟
中断结合代码分析
中断结构图
所有中断程序需要完成的步骤
中断响应条件
- 此中断源的中断允许位为1;
- CPU开中断(即EA=1);
- 中断源有中断请求;
以上三条同时满足时,CPU才有可能响应中断。因为串口中断和定时器中断还需要其他设置条件,即这个条件只是说明了第一张图中IE需要设置,中断条件完整还需要设置TCON,SCON,定时器中断及串口中断还要加上TMOD的设置以及TH0和TL0初值问题。
外部中断程序步骤:
对应代码:蓝色是外加条件,红色任何中断的必要条件,任何中断条件所必须设置的
- IT0=1;//跳变沿出发方式(下降沿)中断触发方式
- EX0=1;//打开 INT0 的中断允许。中断源的中断允许
- EA=1;//打开总中断CPU开中断
- 当外部中断源触发即中断源响应进入中断程序
1 void Int0Init() //外部中断的条件设置
2 {
3 //设置 INT0
4 IT0=1;//跳变沿出发方式(下降沿)
5 EX0=1;//打开 INT0 的中断允许。
6 EA=1;//打开总中断
7 }
8
9
10 void Int0() interrupt 0 //外部中断 0 的中断函数
11 {
12 //写入要完成的任务
13 }
定时器中断程序步骤:
初始化程序应完成如下工作:
- 对TMOD赋值,以确定T0和T1的工作方式。
- 计算初值,并将其写入TH0、TL0或TH1、TL1。
- 中断方式时,则对IE赋值,开放中断。
- 使TR0或TR1置位,启动定时/计数器定时或计数。
对应代码:蓝色是外加条件,红色任何中断的必要条件,任何中断条件所必须设置的
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- ET0=1;//打开定时器0中断允许 中断源的中断允许
- EA=1;//打开总中断 打开总中断CPU开中断
- TR0=1;//打开定时器 开始计数
- 当定时器溢出时中断开始即中断源发生响应
1 void Timer0Init()
2 {
3 TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
4 TH0=0XFC; //给定时器赋初值,定时1ms
5 TL0=0X18;
6 ET0=1;//打开定时器0中断允许
7 EA=1;//打开总中断
8 TR0=1;//打开定时器
9 }
10
11 void Timer0() interrupt 1
12 {
13 //发生定时器中断索要完成的任务
14 }
串口中断程序步骤:
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。具体步骤如下:
●确定串行口控制(编程SCON寄存器确定串口工作方式SM0,SM1,允许串口接受REN);
●确定T1(定时器)的工作方式(编程TMOD寄存器);
●计算T1的初值,装载TH1、TL1;
●串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。中断源的中断允许 打开总中断CPU开中断
——打开允许中断,依次打开串口允许中断位ES,总中断允许位EA(=1,允许)
●启动T1(编程TCON中的TR1位);
●当串口有中断请求时(串口有数据传输时)即中断源发生响应,开始进入中断程序
在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。
对应代码:蓝色是外加条件,红色任何中断的必要条件,任何中断条件所必须设置的
- SCON=0X50; //设置为工作方式1
- TMOD=0X20; //设置计数器工作方式2
- PCON=0X80; //波特率加倍
- TH1=0XF3; //计数器初始值设置,注意波特率是4800的
- TL1=0XF3;
- ES=1; //打开接收中断
- EA=1; //打开总中断
- TR1=1; //打开计数器
1 void UsartInit()
2 {
3 SCON=0X50; //设置串口为工作方式1
4 TMOD=0X20; //设置计数器工作方式2
5 PCON=0X80; //波特率加倍
6 TH1=0XF3; //计数器初始值设置,注意波特率是4800的
7 TL1=0XF3;
8 ES=1; //打开接收中断
9 EA=1; //打开总中断
10 TR1=1; //打开计数器
11 }
12
13 void Usart() interrupt 4
14 {
15 u8 receiveData;
16
17 receiveData=SBUF;//出去接收到的数据
18 RI = 0;//清除接收中断标志位
19 SBUF=receiveData;//将接收到的数据放入到发送寄存器
20 while(!TI); //等待发送数据完成
21 TI=0; //清除发送完成标志位
22 }
我们向往远方,却忽略了此刻的美丽
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗