单片机里面有很多中断资源,例如外部中断、定时器中断、串口中断等,这些中断资源应当用于处理相应的紧急事件,而不是顺序执行的常规事件,所以在编写中断子程序的时候应当十分注意。

具体的事务处理语句不应放在中断函数里面,中断子程序中的语句应当简洁明了,不应当有太多的语句。假如你在编写中断子程序的时候像在main函数中那样写一大串处理具体事务的指令的话,会在此中断中占用太多的时间,假如当有其他低优先级的中断信号来临的时候也可能导致中断丢失,发生程序的逻辑错误。所以,在中断子程序中的指令语句应当做到最短。

中断子程序中的语句不应当使用延时函数,不使用whiledo-whiledo-until等有等待延时功能的指令。在中断子程序中使用while、do-while、do-until等指令也会导致单片机在执行过程中在该位置延时或者等待太长的时间,当其他中断信号来临的时候同样也可能导致中断丢失。

那么应该怎么做呢?

在编写中断子程序的时候,应当巧用全局状态变量,在中断子程序中只改变状态变量值,在main函数中while(1)程序段内部判断该状态变量的值,根据状态变量的值再分别执行对应的事务处理语句。这就像你接到一个电话要你办某事,你也不能在一直接着电话把这件事做完吧,你需要把事情记下来,挂了电话再安排时间处理。

举个例子,一个串口触摸屏需要根据触屏中按键来执行对应的操作,需要使用到串口中断。假设触屏在触摸按键1时会发送数据A,触摸到按键2时会发送数据B,那么我们可以定义一个全局状态变量command:

unsigned char command;

在串口中断子程序中,根据接收到的不同串口数据改变command的值:

void 串口1中断函数()

{

switch (收到的串口数据)

{case A:  //假如收到按键1的动作,command赋值x1

{command=x1;

break;

}

case B:  //假如收到按键2的动作,command赋值x2

{command=x2;

break;

}

default: break;

}

}

在上面这个串口1的中断子程序中,switch是一个条件选择指令,当串口收到数据A,那么给command赋值x1, 当串口收到数据B,那么给command赋值x2。当然,上面的程序段只是一个说明的示意,不能直接复制编译到单片机中运行,在实际工程中需要根据不同单片机程序的编写规则进行开发。

接着在main函数中根据command的值执行不同的事务处理语句:

main函数()

{

while(1)

{

Switch (command)

{case x1:   //假如收到按键1的动作,执行事务处理1的程序

{事务处理1;

break;

}

case x2:  //假如收到按键2的动作,执行事务处理2的程序

{事务处理2;

break;

}

default: break;

}

}

}

按照这样的程序,单片机在接收到触屏发出的代表不同按键的串口数据时,在串口中断子程序中改变全局状态变量的值command,这个语句很少,执行时间也短。再到main函数中根据command的不同值分别执行非常耗时间的具体事务处理程序。这样的程序分配,将使单片机运行高效而且合理。

更多精彩,微 信 公 众 号:yonkotech

中秋快乐!

沙鸥  2019.9.13

编写单片机中断程序的注意事项 成都电气开发相关推荐

  1. c语言编写51单片机中断程序,执行过程是怎样的?

    Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序: #include<reg52.h>   void main(void)   {    EA=1;      //开放总中断 ...

  2. 一点点学pic单片机,如何设计pic单片机中断程序

    pic单片机使用很多,但pic单片机的学习存在一定难度.为帮助大家稳步提高对pic单片机的认识,本文将对pic单片机引脚中断程序设计技巧加以介绍.如果你正在学习pic单片机,或对本文即将讲解的内容存在 ...

  3. 单片机中断程序实例_单片机定时器中断实现长时间定时程序

    单片机定时器中断实现长时间定时程序 #include // 包含51单片机寄存器定义的头文件 sbit D1=P2^0; //将D1位定义为P2.0引脚 unsigned char Countor; ...

  4. 填坑—c语言写单片机中断程序无法返回到中断点—解决办法

    在写定时器中断时,想每隔20ms就中断一次,结果怎么都返回不了 原程序 #include<reg51.h> unsigned char i; //定时器0初始化 void IT0_INIT ...

  5. PLC定时中断程序应用注意事项(西门子三菱信捷)

    首先我们了解下什么是中断.中断(打断的意思),在PLC执行当前程序时,由于系统出现了某种需要处理的紧急情况,(比如定时中断10ms进行脉冲计数,只要中断时间一到,我们就去查看10ms里累积的脉冲量,我 ...

  6. 如何编写 android go 程序,轻松搭建基于go1.5开发Android应用的环境 | Go语言中文网 | Golang中文社区 | Golang中国...

    go1.5beta2已经发布,正式版将在8月份发布.而早在go1.4就已发布了golang/mobile项目用以实现Android应用的开发.当前gomobile的环境部署已经相对成熟了.但项目声明必 ...

  7. 步进电机正反转实验_一种三相电机正反转控制互锁的考虑-成都电气开发

    最近一个客户找到我想做一个控制器的改造,这个控制器会根据传感器采集到的数据控制一个三相电机的正反转来实现预期的目的,但是客户却指出之前的控制器老是烧线,搞得他很恼火,所以他想找我来重新设计一下这个控制 ...

  8. c语言T1中断程序编写步骤,用51单片机中断编写的4x4键盘程序

    当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章 用51单片机中断编写的4x4键盘程序 作者:未知   来源:山涧一溪流   点击数:-  更新时间:2014年06 ...

  9. c语言键盘中断扫描码,用51单片机中断编写的4x4键盘程序

    应用查询扫描编写键盘程序,由于要给按键去抖动,程序变得比较复杂和冗长(详见2013年9月29日博文<MSP430和AT89C51单片机4x4键盘C程序>),如果用中断编写,设置中断响应在下 ...

  10. 用计算机控制单片机的程序编写,单片机程序编写步骤

    单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上.相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备.概括的讲:一块芯片就成了一台计算机.它的体 ...

最新文章

  1. Yolo(3)(项目)Yolo v3 目标检测(85分类)
  2. eclipse怎样在线安装hibernate tools插件并使用
  3. 监测linux一些重要文件md5值脚本
  4. boost::safe_numerics::safe_unsigned_range相关的测试程序
  5. 利用反射,实现动态调用winform窗体
  6. extern C用法详解
  7. Gym100923H Por Costel and the Match
  8. Web性能测试篇:AB 压力测试
  9. [转]跟我一起写Makefile系列
  10. Javascript模块化编程 (附WebTrends的dcsMultiTrack方法浅述)
  11. OpenCV 单/多目标跟踪传统算法实验
  12. ps cs6选择并遮住在哪
  13. Redux:优点和缺点
  14. Java使用PDFBox将一个 PDF 文档拆分为多个 PDF
  15. 晨光计算机里的铃声是什么歌曲,soul app里的音乐有哪些?soul app里的铃声有哪些?[图]...
  16. Sitemesh小记
  17. 个人公众号成长记 - 你为什么要做公众号呢?
  18. 穆易天气app代码(二)
  19. 《计算机的硬件系统》教案,计算机硬件系统的组成教案
  20. 前缀和——(1)什么是前缀和和一维前缀和

热门文章

  1. PNP : Work Cound Frequence
  2. 计算机触摸板设置方法,笔记本触摸板设置教程详解!笔记本触控怎么打开设置...
  3. 如何加减单元格指定数字_表格怎么自动计算加减
  4. 8个免费高清图片素材网站,再也不用担心侵权了。
  5. 在电脑上怎样将长方形图片裁剪成圆形的图片?
  6. 如何管理软件资产及如何管理软件许可资产?
  7. 多年录制游戏的心得分享
  8. 五十岁才考上大学的柳永,半生风流半生坎坷!
  9. 软考数据库-无损联接分解
  10. php重构求圆柱圆锥的体积,圆锥的体积 - 彭阳县第二小学数学教研社区 - 宁夏教育云...