(C51学习四)外部中断和定时器中断

发布者:SerendipitySoul最新更新时间:2018-12-19 来源: eefocus关键字:C51  外部中断  定时器中断 手机看文章 扫描二维码
随时随地手机看文章

1.什么是中断


中断就是指CPU正在执行一项任务A,然后突然停止任务A去执行任务B,执行完任务B再回来继续执行任务A的过程。


例如:你正在看电视,然后电话响了,你就停止看电视,跑去接电话,接完电话后由回来继续看电视。这个过程叫中断。


中断跟硬件有关。可以说是硬件来让单片机中断。


2.中断有什么用 


1.中断能让CPU同时执行多项任务,例如CPU在执行流水灯程序,就无法执行 按下按键时,蜂鸣器发声了。


2.当然上面的例子可以用软件轮询检擦案件是否按下来实现,但这样就消耗了CPU一部分资源来轮询检测 按键是否有按下了,所以中断的另一个优点就是


   节省CPU资源

3.双重功能的P3引脚



由最小系统板的原理图可知,P3.0~P3.7的引脚对应着RXD,TXD,INTO,INT1,T0,T1等,说明P3引脚既是 I/O口,由有别的功能,这个功能就是中断功能。


4.8051中断体系


8051的单片机有5个中断源,2个优先级


由上图可知,INT0是通过引脚P3.2,INI1时通过引脚P3.3,定时器T0和T1是分别通过引脚P3.4和P3.5的



中断源:INT0(外部中断0),INT1(外部中断1),T0(定时器0),T1(定时器1),RXD和TXD(同属串口中断)


中断相关的特殊寄存器:


(1)中断允许控制寄存器(IE)--------控制各中断的开放和屏蔽


(2)定时器/计数器控制寄存器(TCON)-------定时器和外部中断的控制


(3)串行口控制寄存器(SCON)-------串行中断的控制


(4)中断优先级控制寄存器(IP)-------设置各中断的优先级



各寄存器的控制范围如下图:

从上图可看出从中断源产生请求到请求进入CPU的过程:


以INT0为例,INT0产生中断源,经过TCON寄存器中的IT0为选择是下边沿触发的还是低电平触发的中断请求(当然IT0是程序人工设置的),当中断请求到达IE0的时候,


IE0会被硬件置1(当CPU响应此中断请求时,IE0被硬件置0),然后就到 IE寄存器的地方了,EX0是外部中断INT0的开关,而 EA 是所有中断的总开关,这都由 IE寄存器


控制,最后经过 IP寄存器 设置优先级,这个一般比较少用,默认的优先级为,INT0 > T0 > INT1 > T1 >串口中断。最后把中断请求传给CPU。


5.中断特寄存器


TCON寄存器

IE寄存器


EA:中断的总开关,EA=1才能允许中断传给CPU


ES:串行口中断开关


ET1:定时器1中断开关


EX1:外部中断1开关


ET0:定时器0中断开关


EX0:外部中断0开关


IP优先级寄存器(对应为设置成1说明优先级设置成高,8051只有高低两种优先级)


6.中断的优先级


8051只有高低两种优先级,默认下优先级从高到低:INT0 > T0 > INT1 > T1 > 串行中断。


1.高优先级的中断可以打断低优先级的中断。


2.正在响应的中断,不能被同级或者低级的中断打断。


3.同时发生几个中断,先响应优先级高的中断



7.中断服务程序的编写


中断服务程序就是中断发生后,CPU去执行的函数。


1.中断服务函数没有返回值


2.中断服务函数不能传入参数



例如:


void  函数名 (void)  interrupt  x  using  y


{




}


x 范围为0~4,分别代表5个中断源,例如外部中断INT0就是0,T0就是1,INT1就是2,T1就是3,串行中断就是4


y 的范围为0~3,分别表示4组工作寄存器,不写就用0. 不写也可以



8.外部中断实现代码



#include

sbit LED=P1^0;

void main()

{

IT0=0;  //中断触发方式为低电平触发,IT0=1则为下边沿触发

EX0=1;  //打开外部中断0

EA=1;    //打开中断总开关

while(1)

{

LED=1;   //在没有中断发生时,LED关闭

}

}

 

void INTERR(void) interrupt 0

{

LED=0;//有中断发生时,LED亮起

}

把开发板的P3.2用杜邦线接到GND上,就会触发中断,发现LED亮起来了。(为什么是P3.2?因为由最上面的原理图可知道INT0的引脚是P3.2)


9.定时器/计数器中断工作原理


1.由最上面的最小系统原理图可以看出,定时器T0和T1分别对应的引脚是P3.4和P3.5


2.定时器/计数器 的计数脉冲来源可以有两个,一个是芯片内部晶振振荡器输出脉冲12分频后的脉冲,一个是从外部接入的外部脉冲



3.TLx和THx寄存器,x=0,1。


以TL0和TH0为例,TL0和TH0 都是8位寄存器(8051的寄存器都是8位),所以TL0和TH0形成高八位和低八位寄存器,用于计数,一共16位。


2^16=65536,所以 TL0和TH0加一起最大能计数的值是0~65536,一共65536.


4.定时器/计数器的两个寄存器:TCON和TMOD,其中TCON用于开启定时器/计数器中断,TMOD用于设置定时器/计数器的工作方式(TCON上面 已经说过了)


TMOD寄存器:

(由图:低八位为定时器T0,高八位为定时器T1)


GATE:门控制。


当GATE=1:INTx引脚为高电平且TRx 要同时为1,定时器Tx才启动。


当GATE=0:只要TRx =1,定时器Tx就启动,不用理会INTx引脚的电平高低。



C/T:决定是使用 定时功能,还是 计数功能


当C/T=0:定时功能。加1计数器对芯片晶振12分频的脉冲计数,一个脉冲过来,就加一,直到 TFx 加满了溢出。(TFx在TCON寄存器中)

当C/T=1:计数功能。加1计数器对来自输入引脚T0(P3.4)或T1(P3.5)的外部脉冲进行计数,一个脉冲加一,直到TFx加满溢出。




M1和M0:工作方式选择位



M0 M1 工作方式 功能说明

0 0 方式0 13位定时器/计数器,最大计数为2^13 = 8192

0 1 方式1 16位定时器/计数器,最大计数为2^16 = 65536

1 0 方式2 自动重载8位定时器/计数器,最大计数为 2^8 = 256

1 1 方式3 T0分为2个独立的8位独立计数器,T1停止工作



10.定时器/计数器定时数值的计算


例:我要定时10ms。晶振频率是12M,工作模式在方式1


f = 12M/12 =1M   (因为要12分频),也就是说 1秒 1000000个机器周期,10ms有10000个机器周期。


65536 - 10000 = 55536 ,意思是 计数器从65536 一直减到 55536 所用的时间就是10ms。


55536的十六进制是0xD8F0


所以设置 TH0 = 0XD8,TL0=0XF0


下面给出代码


或者直接下载一个C51定时器计算器:


11.定时器/计数器代码



#include

sbit LED0=P1^0;

unsigned char i;

 

void main()

{

TMOD=0X01;  //设置使用定时器0,16位的定时/计数寄存器

TL0=0xD8;    //低八位赋初值

TH0=0XF0;    //高八位赋初值

ET0=1;          //开启定时器0中断

TR0=1;         //运行定时器0

EA=1;          //开启中断总开关

while(1);

}

 

void Delay(void) interrupt 1 using 0

{

i++;

TR0=0;           //进入中断函数时,关闭定时器

TL0=0XD8;    //重新赋初值

TH0=0XF0;

if(i==20)        //因为10ms一次处罚看不出明显结果,所以让20次触发才让灯变一次

{

LED0=~LED0;

}

TR0=1;     //重新开启定时器

}

关键字:C51  外部中断  定时器中断 引用地址:(C51学习四)外部中断和定时器中断

上一篇:关于如何利用Keil C实现51单片机中断功能
下一篇:【单片机笔记】51内核的中断及中断向量

推荐阅读最新更新时间:2024-03-16 16:20

单片机C语言教程:C51指针的使用
指针就是指变量或数据所在的存储区地址。如一个字符型的变量 STR 存放在内存单元DATA 区的 51H 这个地址中,那么 DATA 区的 51H 地址就是变量 STR 的指针。在 C 语言中指针 是一个很重要的概念,正确有效的使用指针类型的数据,能更有效的表达复杂的数据 结构,能更有效的使用数组或变量,能方便直接的处理内存或其它存储区。指针之所以 能这么有效的操作数据,是因为无论程序的指令、常量、变量或特殊寄存器都要存放在内 存单元或相应的存储区中,这些存储区是按字节来划分的,每一个存储单元都能用唯一的 编号去读或写数据,这个编号就是常说的存储单元的地址,而读写这个编号的动作就叫做寻 址,通过寻址就能访问到存储区中的任一个能访
[单片机]
单片机C语言教程:<font color='red'>C51</font>指针的使用
51单片机定时器中断函数中变量初始化的问题
前几天在进行单片机实验时,目的是用定时器0写一个流水灯的程序,代码如下,编译没有问题,但就是灯不亮,检查了好几次始终找不到问题,现在找到了,分享一下 #include reg51.h //调用头文件 #define uint unsigned int //宏定义 #define uchar unsigned char #define long_time 10 //定时时间,每次50ms uint n=0; //查表变量 uchar temp ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯查表实现 /*********主函数*******
[单片机]
C51---按键控制LED移位
原理图 main 函数 按键key1控制LED往下一位点亮 按键key2控制LED往上一位点亮 #include REGX52.H //0 num 65535 void Delay_ms(unsigned int num) //@12.000MHz { unsigned char i, j; while(num) { i = 2; j = 239; do { while (--j); } while (--i); num--; } } unsigned char LEDNum; void main() { P2=~0x01; while(
[单片机]
C51---按键控制LED移位
STM32F1外部中断实例
使用外部中断的基本步骤如下: 1. 设置好相应的时钟; 2. 设置相应的中断; 3. IO口初始化; 4. 把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化; 5. 在选择的中断通道的响应函数中中断函数。 1、开启时钟 void RCC_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE)| RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); } 设置相应的时钟所需要的RCC函数在stm32f10x
[单片机]
采用C51与插拔式FLASH闪存设计无纸记录仪
ATMEL公司推出的带有看门狗功能的单片机AT89C55WD带有20K的程序存储器,是8051系列中一款较为先进的产品,其看门狗功能可以大大提高产品的稳定性,大容量的内部程序存储器可以容纳功能丰富的软件。   以往的许多无纸记录仪均采用3.5英寸软盘作为数据存贮介质,但软盘存贮的可靠性差、存储容量有限、成本较高等诸多缺点实在难以克服。   作为一种高科技的非易失性存储设备,FLASH闪存首先在数码相机、PDA、移动电话等数字产品当中得到了应用,随着工艺的进步和价格的下降,逐步向其他应用领域扩展,其容量大、功耗低、速度快、不易受损等优点正受到人们越来越多的青睐,而且最大的好处是,随着技术水平的进步,FLASH闪存的容量也在不断
[应用]
基于C51单片机的家庭防盗报警系统
从实际出发,设计一种家庭用、与电话线连接、操作简单、工作稳定可靠的远程智能防盗报警装置。当人们外出时,往往希望实施自动监测报警以使家庭财产免受损失。针对这一需求,研制出了一系列自动报警系统,如门磁式、触摸式和红外线监测自动报警系统等。本文将介绍的远程智能防盗报警装置,可同时监视多个重要点(如门、窗等),发现盗情及时拨叫号码,并能利用普通电话线进行告警信号呼叫,其性能稳定可靠,实用性、适用性强,且具有较高的灵活性。 基本工作原理 如图1所示,远程智能防盗报警装置由信号检测电路、复位电路、电话号码输入电路、89C51单片机、语音电路、模拟摘机挂机电路、DTMF编码发送电路、铃流信号检测电路和忙音信号检测电路等
[单片机]
基于<font color='red'>C51</font>单片机的家庭防盗报警系统
STM32F10x外部中断EXTI
一、EXTI是什么? EXTI(External interrupt/event controller)外部中断事件控制器,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。 二、使用方法 1.功能框图及寄存器 20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程: ● 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR) ● 设置软件中断寄存器的请求位(EXTI_SWIER) 当配置好软件中断事件寄
[单片机]
STM32F10x<font color='red'>外部中断</font><font color='red'>EXTI</font>
C51学习三)按键
1.独立按键 原理: 独立按键比较简单,先在单片机开发板的配套资料中找出案件的原理图,如下图: 以K1为例,当K1按下时,P3.4就相当于接地GND,所以当K1按下时,P3.4为低电平。即P3.4=0 代码: 下面写一个按下K1就亮起LED0灯: 找出LED的原理图: 可以发现LED0对应的引脚为P1.0 #include sbit K1=P3^4; sbit LED0=P1^0; void main() { while(1) { LED0=K1; } } 2.矩阵键盘 为什么要用矩阵键盘: 因为矩阵键盘相对于独立键盘可以节省I/O口。例如16个按键,用
[单片机]
(<font color='red'>C51</font>学习三)按键
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved