C51中断函数的写法

发布者:sigma28最新更新时间:2024-08-19 来源: cnblogs关键字:C51  中断函数  写法 手机看文章 扫描二维码
随时随地手机看文章

一、中断允许控制

        CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。

                       

  • § EX0(IE.0),外部中断0允许位;

  • § ET0(IE.1),定时/计数器T0中断允许位;

  • § EX1(IE.2),外部中断1允许位;

  • § ET1(IE.3),定时/计数器T1中断允许位;

  • § ES(IE.4),串行口中断允许位;

  • § EA (IE.7), CPU中断允许(总允许)位。

 

80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。

一、工作方式寄存器TMOD

       工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

 

GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。:定时/计数模式选择位。C/T =0为定时模式;C/T=1为计数模式。

M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。


TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:

 

  • TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。

  • TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。

  • TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。

  • TR0(TCON.4):T0运行控制位,其功能与TR1类同。

 

3.3.5  定时/计数器应用举例 

初始化程序应完成如下工作:

  • 对TMOD赋值,以确定T0和T1的工作方式。

  • 计算初值,并将其写入TH0、TL0或TH1、TL1。

  • 中断方式时,则对IE赋值,开放中断。

  • 使TR0或TR1置位,启动定时/计数器定时或计数。

 

定时器T0中断的初始化

 

TMOD=0x01;            \设定工作方式为16位定时器

  TH0=(65536-50000)/256;   \赋定时器T0高四的值为50MS(对256求模)

  TL0=(65536-50000)%256;  \赋定时器T0低四的值为50MS(对256求余)

  EA=1;                   \开总中断

  ET0=1;                   \开定时器T0中断

  TR0=1;                   \启动定时器T0


当定时器时间到产生中断就自动跳到以下中断函数,中断函数不需要做任何声明;

 

void timer0( ) interrupt 1     \ 5个中断源的排序:0代表外部中断0中断 ,1代表定时器/计数器0中断 ,2代表外部中断1中断, 3代表定时器/计数器1, 4代表串行中断的中断

 

{

    TH0=(65536-50000)/256;   \重装初值

    TL0=(65536-50000)%256;   \重装初值

    \往下写CPU要处理的事情就OK了

 

}


中断响应条件

  •  中断源有中断请求;

  •  此中断源的中断允许位为1;

  •  CPU开中断(即EA=1)。

以上三条同时满足时,CPU才有可能响应中断。

 

 

P3.2口的外部中断

EA=1;                 //开总中断

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

//IT0=1;                //当IT=0时为电平的外部中断触发方式,

当IT=1时位跳变沿外部中断触发方式

TCON=0x01;               (这是对寄存器将IT置1,和IT0=1的效果是一样的)因为TCON的地址是  可以被8整除,所以可以对其进行位操作。


当符合外部中断的条件时执行下面的中断函数

 

void exter0() interrupt0     \ 5个中断源的排序:0代表外部中断0中断 ,1代表定时器/计数器0中断 ,2代表外部中断1中断, 3代表定时器/计数器1, 4代表串行中断的中断


{

\这里下写CPU要处理的事情就OK了

 

}


关键字:C51  中断函数  写法 引用地址:C51中断函数的写法

上一篇:2、软件模拟实现iic协议(51为例)
下一篇:51单片机data,bdata,idata,xdata使用注意事项

推荐阅读最新更新时间:2024-11-12 11:03

C51之74HC595的使用
/* 名称:74HC595的使用 说明:74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存人到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。而当OE为高电位,也就是输出关闭时,并行输出端会维持在高阻抗状态。 这里需要注意一点的就是,在芯片需要产生上升沿或者下降沿的时候:本质上就是将其对应引脚进行高低电平的转换。当然中间需要根据需要保持一定的时间(可以用空指令)。 具体引脚及使用说明见:百度百 (
[单片机]
keil c51 头文件的制作
编缉文本文件,保存文件时用后缀 .h 文件格式: #ifndef _ 文件名 _h_ #define _ 文件名 _h_ ...文件内容... #endif 使用时把这个文件复制到新建的project所在的文件夹内,在程序中包含这个文件(#include 文件名.h )就可以用了。
[单片机]
C51延时程序再抛砖原创
看到了个好帖,我在此在它得基础上再抛抛砖! 有个好帖,从精度考虑,它得研究结果是: void delay2(unsigned char i) { while(-i); } 为最佳方法。 分析:假设外挂12M(之后都是在这基础上讨论) 我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据: delay2(0):延时518us 518-2*256=6 delay2(1):延时7us(原帖写 5us 是错的,^_^) delay2(10):延时25us 25-20=5 delay2(20):延时45us 45-40=5 delay2(100):延时205us 205-200=5 delay2(200):延时405us 405-40
[单片机]
STM32 USB部分中断函数简要分析
在 stm32f10x_it.c 中有下面这个函数 void USB_LP_CAN1_RX0_IRQHandler(void) { USB_Istr(); } 可见USB_Istr()是处理USB_LP_CAN1_RX0_IRQHandler中断的,而这个中断管理的是控制传输、中断传输、批量传输(单缓冲区)。 下面对此函数中关键部分进行分析 wIstr = _GetISTR();这句说白了就是获取ISTR寄存器的值,从usb_regs.h中这个宏定义#define _GetISTR() ((uint16_t) *ISTR)中便知 #define IMR_MSK (CNTR_CTRM | CNTR_WKUPM
[单片机]
当主函数中断函数共享变量问题
当时开发的一个产品,一项功能是在通电后播放40秒的语音. 测试时发现,大约通电70-80次就有一次播放时间不够40秒就提前停止。 当时以为复位有问题,换了复位片,没好。又先后换了CPU,语音芯片,还有电源,都没有好转。排除了硬件芯片原因导致的此现象. 后来又从软件中查找原因。反复查找软件逻辑,也没发现问题。后来偶然发现在主while里增加大量延时后,稳定性提高。 几乎不再出现问题。但是我还是觉得不对劲,用了两天时间终于找到了原因。因为这是公司的程序,所以不能贴源码。 我把其他程序都略去,只把出错的程序大概写一下。大家看看能找到问题吗? unsigned int ms_counter; void T0() {
[单片机]
C51中的函数指针
概述 函数指针是C编程语言众多难懂的特性之一。由于C编译器对关于8051架构的独特要求,函数指针和可重入函数需要克服更大的挑战。这主要是因为函数参数传递的方式。 通常,(对于大多数非8051的芯片),函数参数是在栈上以压入和弹出的汇编指令来完成。由于8051的栈大小有限(仅128字节,某些设备上更低至64字节),函数参数传递必须用不同的技术来传递。 英特尔为8051推出PL/ML-51编译器时,他们引入了将参数存储在固定内存位置的技术。当链接器被调用时,它会建立程序的调用树,找出哪些函数参数是相互独立的,然后覆盖它们。这就是链接器OVERLAY指令的开始。 由于PL/M-51不支持函数指针,所以从未出现间接函数调用的问
[单片机]
c51: 串口通信2
一、程序功能 pc向c51发送字符串 hello ,c51收到 hello 表示通信测试正常,点亮P1.0脚。向pc发送 ok 二、代码 /*程序功能: pc向c51发送字符串 hello ,c51收到 hello 表示通信测试正常,点亮P1.0脚。向pc发送 ok */ #include reg52.h #define uchar unsigned char //定义变量 uchar recbuf ; //接收数据缓存 uchar recnum; //定义引脚,P1口的0脚控制指示灯, //light=0,表示指示灯亮,light=
[单片机]
STM32如何确定执行哪个中断函数
如下面所示: NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //NRF24L01 中断响应 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); 则对应的中断函数就是 STM3210x_
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved