51单片机中断系统程序实例 (STC89C52RC)

51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。

单片机的学习不难,只要掌握学习方法,学起来并不难。什么是好的学习方法呢,一定要掌握二个要点:

1. 要知道寄存器的英文全拼,比如IE = interrupt中断

不知道全拼,要去猜,去查。这样就可以理解为什么是这个名称,理解了以后就不用记忆了。

2. 每个知识点要有形像的出处

比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位

看到ET0, 马上要形像地定位到IE寄存器的第2位

51hei独家揭秘: 形像是记忆的最大技巧。当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。

写程序代码时,也要把尽量把每行代码形像化。

51单片机内中断源

8051有五个中断源,有两个优先级。与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。51单片机的中断系统结构如下图(注意,IF0应为TF0):

8052有6个中断源,它比8051多一个定时器/计数器T2中断源。

8051五个中断源分别是:

(1)51单片机外部中断源

8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。

INT0 也就是Interrupt 0。在这里应该看一下你的51单片机开发板的电路原理图。离开形像的记忆是没有意义的。读到上面这句,你应该回忆起原理图上的连接。任何记忆都转化为形 像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。

TCON的结构如下图:

(a)定时器T0的运行控制位TR0

TR0由软件置位或者清0。当门控位GATE=0时,TO计数器仅由TR0控制,TR0=1启动计数,TR0=0时停止。当门控位GATE=1时,T0计数器由INT0和TR0共同控制,当INT0=1且TR0=1时启动T0计数器。

(b)定时器T0溢出标志位TF0

当T0溢出时TF0=1,并向CPU申请中断,CPU响应中断后由硬件将TF0清0,也可以由软件查询方式将TF0清0。

c)定时器T1的运行控制位TR1

功能同TR0。

(d)定时器T1溢出标志为TF1

功能同TF1。

(e)外部中断源1(INT1、P3.3)中断请求标志IE1

IE1=1时外部中断源1正在向CPU请求中断,当CPU响应该中断时由硬件将IE1清0(下降沿触发方式)。

(f)外部中断源1触发方式选择位IT1

IT1=0时外部中断源1选择电平触发方式,当输入低电平时置位IE1;IT1=1时外部中断源1选择下降沿触发方式,当中断源由高电平变低电平时置位 IE1,向CPU请求中断。

(g)外部中断源0(INT0、P3.2)中断请求标志IE0

功能类同IE1。

(h)外部中断源0触发方式选择位IT0

功能类同IT1。

CPU在每个机器周期采样INT0和INT1引脚的输入电平。

i、电平触发方式

当CPU采样到低电平时,置位IE0和IE1,采样到高电平时,将IE0和IE1清零。在电平触发方式下,外部中断源必须一直保持低电平(至少保持1个以 上的机器周期)直到CPU响应中断请求,否则中断请求将丢失,同时在中断处理程序结束之前必须,外部中断源必须变为高电平,否则将产生另一次中断。

ii、下降沿触发方式

CPU 每个机器周期采样中断输入引脚,如果相续的两次采样,第一次是高电平,第二次是低电平,则置位相应的IE,响应中断后,硬件自动将IE清0。采样下降沿触 发方式,中断源的高、低电平都必须保持12个振荡周期(即1个机器周期)以上,这样CPU才能有效检测到下降沿,并引发CPU中断。

(2)51单片机内部中断源

8051有3个内部中断源,分别是定时器T0、T1和串行口中断。8052增加了一个T2定时器中断。

2、51单片机中断使能控制

中断的允许和禁止由中断使能控制寄存器IE控制,其字节地址为0A8H,可以位寻址,其结构如下图所示:

EX0:外部中断0中断允许位;

ET0:定时器/计数器T0中断允许位;

EX1:外部中断1中断允许位;

ET1:定时器/计数器T1中断允许位;

ES:串行口中断允许位;

ET2:定时器/计数器T2中断允许位;(只要8052具有)

EA:CPU中断总允许位,EA=1时所有的中断开放,EA=0时禁止所有的中断。

3、51单片机中断优先级

51有两个优先级:高、低。通过IP(中断优先级寄存器)来设置优先级,其字节地址为0B8H,可位寻址,其结构如下图:

IP中各位值为0时表示低优先级中断,为1时表示高优先级中断。CPU复位后IP=0。

高优先级中断可以中断低优先级中断,同优先级中断不能相互中断。当CPU同时接到同优先级的几个中断请求时,CPU按照如下硬件顺序进行中断响应:

4、51单片机中断请求的撤除

CPU响应中断请求,执行中断服务程序,但在中断返回指令(RETI)之前必须撤除中断信号,否则将可能再次引起中断而发生错误。

中断请求撤销的方法有三种:

a、单片机内部硬件自动复位:对于定时器/计数器T0、T1及采用边沿触发方式的外部中断请求,CPU在响应中断后,由内部硬件自动撤销中断请求;

b、应用软件清除响应标志:对串口发送/接收中断请求及定时器T2的溢出和捕获中断请求,CPU响应中断后,内部无硬件自动复位RI、TI、TF2及EXF2,必须在中断服务程序中清除这些标志,才能撤除中断;

c、既无软件清除也无硬件撤除:对于采用电平方式的外部中断请求,CPU对引脚上的中断请求信号既无控制能力,也无应答信号,为保障CPU响应中断请求中断后,执行返回指令前撤除中断请求,必须考虑另外的措施。

5、51单片机中断响应过程

51 单片机在每个机器周期的S5P2状态顺序检查每个中断源的中断请求标志,若有中断源发送中断请求,CPU在下个机器周期的S5P2状态按优先级顺序查询各 中断标志,并且取高优先级的中断进行响应。响应中断后置位相应的中断优先级状态触发器,标明当前中断服务的优先级别,执行硬件调用程序,将程序计数器PC 的内容压入堆栈进行保护。对于中断源的中断入口地址装入程序计数器PC,使程序转入该中断入口处执行中断服务程序,直到遇到RETI指令。执行RETI指 令,撤销中断优先级触发器,弹出断点地址至程序计数器PC,继续源程序的执行过程。

在接收中断申请时,如遇到下列情况之一,硬件调用子程序将被封锁:

a、正在执行同级或高一级的中断服务程序;

b、当前指令周期不是该指令的最后一个周期(或一条指令未执行完);

c、当前正在执行的指令是RETI或对IE、IP的读写操作。

6、中断入口地址

各中断源的中断入口地址为:

STC86C52RC 51单片机中断示例程序

#include

typedef unsigned char         uint8;

typedef unsigned int          uint16;

typedef unsigned long          uint32;

sbit enableG1 = P1^3; sbit enableG2 = P1^4;

sbit selectC  = P1^2; sbit selectB  = P1^1; sbit selectA  = P1^0;

code uint16 num16[16] = {         0xC0, 0xF9, 0xA4, 0xB0,

0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83,

0xC6, 0xA1, 0x86, 0x8E        };//共阳数码管真极表

uint8 num6[6] = {0};//储存秒,0-5对应于个位...10万位上各位上的值

void enable138(void); //启用138译码器切换IO口

void refresh_led(void);

void thtl_init(void);

void timer1_init(void);

void et1_init(void);

void main(void)

{

enable138();

timer1_init();

et1_init();

while(1);

}

void interrupt_timer1(void) interrupt 3

{

static uint16 counter = 0;

static uint32 sec = 0;

counter++;

thtl_init();

if(counter == 1000)

{

counter = 0;

sec++;

num6[0] = sec % 10;

num6[1] = sec/10%10;

num6[2] = sec/100%10;

num6[3] = sec/1000%10;

num6[4] = sec/10000%10;

num6[5] = sec/100000%10;

}

refresh_led();//更新num6数组后再刷新数码管

}

void enable138(void) { enableG1 = 1; enableG2 = 0; }

//刷新数码管,只显示有效值

void refresh_led(void)

{

static uint8 i = 0;

switch(i)

{

case 0: selectC = 0; selectB = 0; selectA = 0; P0 = num16[ num6[0] ]; break;

case 1: selectC = 0; selectB = 0; selectA = 1; P0 = num6[5] == 0 && num6[4] == 0 && num6[3] == 0 && num6[2] == 0 && num6[1] == 0 ? 0xFF : num16[ num6[1] ]; break;

case 2: selectC = 0; selectB = 1; selectA = 0; P0 = num6[5] == 0 && num6[4] == 0 && num6[3] == 0 && num6[2] == 0 ? 0xFF : num16[ num6[2] ]; break;

case 3: selectC = 0; selectB = 1; selectA = 1; P0 = num6[5] == 0 && num6[4] == 0 && num6[3] == 0 ? 0xFF : num16[ num6[3] ]; break;

case 4: selectC = 1; selectB = 0; selectA = 0; P0 = num6[5] == 0 && num6[4] == 0 ? 0xFF : num16[ num6[4] ]; break;

case 5: selectC = 1; selectB = 0; selectA = 1; P0 = num6[5] == 0 ? 0xFF : num16[ num6[5] ]; break;

default: break;

}

i = ++i % 6;

}

//设置计数器初数值,重用的内容都应该写成独立函数出来方便维护

void thtl_init(void)

{

TH1  = (65536 - 922) / 256;

TL1  = (65536 - 922) % 256;

}

void timer1_init(void)

{

TMOD |= 0X10;

TMOD &= 0xDF;

thtl_init();

TR1  = 1;

}

void et1_init(void) { ET1 = 1; EA  = 1; }

中断系统c语言程序,51单片机中断系统程序实例 (STC89C52RC)相关推荐

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

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

  2. 51单片机 | 数字电路与C语言基础 | 51单片机最小系统

    文章目录 一.数字电路基础 1.电平特性 2.二进制与十六进制 2.1 二进制 2.2 十六进制 3.二进制的逻辑运算 二.C语言基础语法 三.51单片机最小系统 1. 51 单片机最小系统构成 1. ...

  3. 带中文字库的240128的c语言程序,51单片机-240128液晶程序与调试

    原标题:51单片机-240128液晶程序与调试 今天终于把金鹏OCMJ8X15D-2液晶(240128点阵带字库无触屏液晶)调好了. 这块液晶能显示8行15个汉字,还有放大字形,从16*16点放大到3 ...

  4. 单片机 中断秒表 c语言程序,51单片机秒表C程序

    本程序所用的原理图下载: 点这里 ,单片机芯片使用的stc89c52:电路找到相应部分即可.这是一整个单片机开发板的电路图其他的忽略. 本程序的keil工程下载: http://www.51hei.c ...

  5. c语言闹钟获取系统时间,求一个51单片机定时闹钟程序。要C语言。能够调时间...

    我来发一个C语言211351单片机时钟程序,希望5261能帮到你 /* 程序功能:4102带定时闹铃时钟                                      */ /*----- ...

  6. 51单片机中断与计时器

    文章目录 1.配置下图中各寄存器 1. 定时器/计数器控制寄存器TCON 2.定时器.计数器模式控制寄存器TMOD 3.TH0及TL0 2.中断设置 二.中断程序 51单片机中断与计时器 # 一.定时 ...

  7. 单片机复位电路电容一定用电解电容_什么叫51单片机最小系统

    单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:单片机.晶振电路.复位电路.下面给出一个51单片机的最小系统电路图. 复位 ...

  8. c语言单片机定时器的应用程序,51单片机定时器中断程序(C语言)

    51c程序 51单片机定时器中断程序(C语言) 用C语言实现的,先要定义好定时器的初值 不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶 ...

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

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

  10. 51单片机 | 中断系统

    文章目录 一.中断介绍 1.中断概念 二.中断结构及相关寄存器 1.中断结构 2.中断相关寄存器   这一节专门介绍 51单片机的中断系统,为后面学习外部中断.定时器中断.串口中断做好铺垫. 一.中断 ...

最新文章

  1. Java开发中的23种设计模式详解(转)
  2. Python自动化开发 - 字符编码、文件和集合
  3. AAAI21最佳论文Runners Up!Transformer的归因探索!
  4. JS 异常: Uncaught RangeError: Maximum call stack size exceeded
  5. Android(IPC)进程间通讯1:详解Binder由来?
  6. 今天微信没有520红包 大家可以放心了!
  7. 给机器人罗宾写一封英语回信_近10年高考英语书面表达真题及范文大汇总! 把握高考命题新趋势!...
  8. 《黑镜》黑科技成真 | 解码脑电信号,AI重构脑中的画面
  9. 关于MSDTC - 与基础事务管理器的通信失败 错误解决的小备忘
  10. 关于 创建网络套接字失败 10106
  11. php构建webservice,php webservice实例(简单易懂)
  12. 房地产主数据管理全周期实践[转]
  13. java 小说系统_java 实现小说管理系统
  14. MarkDown 内部跳转链接
  15. 解决a start job is running for dev-disk-by启动错误
  16. python贷款_python算账,贷款表
  17. 微信小程序真机调试功能失常
  18. [pat乙]1032 挖掘机技术哪家强
  19. 微信公众号开发本地调试【内网穿透】
  20. 《反恐特警组》(S.W.A.T.)影片介绍

热门文章

  1. 为 github markdown 文件生成目录(toc)
  2. android AndroidManifest.xml 属性详细解析
  3. linux usb有线网卡驱动_linux系统下安装usb网卡驱动图文?
  4. 詹姆斯titan_再见,詹姆斯!
  5. 席位、交易单元、交易网关是什么
  6. 斐讯路由器宽带运营商服务器,斐讯K2路由器的连接及上网设置教程
  7. 贪心科技分布式高性能深度实战学习笔记
  8. 基于Python的植被覆盖度时空变化规律分析
  9. 计算机的kb和m之间的换算,g和兆的换算(G和M之间的换算)
  10. 二月二龙抬头【集锦】