以下将以红外遥控解码为例讲一下C51外部中断(INT0)的编程亲身体会.
要对红外遥控信号解码那么就要使用C51外部中断,并且要设置成为负跳变沿触发方式.一般都会在主程序的开始外初始化中断(或将初始化中断程序写成函数,将这个函数放入主程序)如下:
void main(void)
{
IT0=1;//负跳变触发
EX0=1;//开外部中断0
EA=1;//开总中断
.........//其它程序
..........
}
void INT0() interrupt 0
{
.......//红外信号解码程序
}
根据需要打开外部中断(EX0=1):
以上程序在开始处便打开了外部中断.从理论上是完全正确的!但在现实情况中要看具体情况来打开外部中断!如果刚进入程序要处理其它事情暂时不能处理红外信号,那么EX0=1就不能写在主程序的开始处.而要写在适当的位置.否则开机有红外信号就会马上进入红外信号解码程序.
关闭外部中断(EX0=0):
一但有中断信号,单片机将很快对中断产生响应进入中断程序.中断程序也就是红外信号解码程序.在中断程序中一定不要忘记关闭中断EX0=0!在按下遥控器的某个按键后,遥控器将一组一组的向外发送数据.即便是以最快的速度按下并放开按键,那么遥控已经发送出多组数据.单片机将多次解码,主程序如果比较庞大解码出来的数据还没有来的急使用就被下一个数据覆盖!关闭外部中断后,能有效的避免干扰和分清当前一组数据是否接收解码完毕!进入中断程序就将外部中断关闭,一组数据解码结束并经主程序采用后在开启外部中断.这才是一个完整的过程!这一个完整的过程是在没有干扰的情况下可正常完成.现实中干扰无时不在,一但无法正常解码出数据那么主程序也不采用,那么外部中断将不在打开.也就不在接受红外信号.这时在红外解码程序的最后加一判断,如果出错就在解码程序最后打开外部中断为下一次接受红外信号做好准备.
根据需要清空IE0(IE0=0):
关闭中断后遥控器并没有停止发送信号,关闭中断后的红外信号将继续使IE0置位.IE0的状态根本不受EX0的控制.单片机执行了IT1=1语句,只要外部中断有负跳变沿IE0就会置位.如果我们只处理EX0=1(即中断开启后的信号)以后的信号.那么在红外信号解码程序退出前要对IE0清零.如果不清零,只要打开外部中断将会再次进入中断.这一次进入中断轻则是浪费时间,重则可能就会出错(进入中断后红外线解码采用查询法时表现的很明显).所以在EX0=1前面要加上一句IE0=0.
关键字:C51 外部中断 INT0
引用地址:
认识C51外部中断(INT0)
推荐阅读最新更新时间:2024-03-16 14:38
C51 Timer 计数器
Timer0 计数器: #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit LED=P1^2; //定义LED端口 /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01 | 0x04; //使用模式1,16位计数器,使用 | 符号可以在使用多个定时器时不受影响 TH0=0xFF;
[单片机]
ARM7与FPGA相结合的应用
ARM7与FPGA相结合在工业控制和故障检测中的应用 工业控制中往往需要完成多通道故障检测及多通道命令控制(这种多任务设置非常普遍),单独的CPU芯片由于其外部控制接口数量有限而难以直接完成多路检控任务,故利用ARM芯片与FPGA相结合来扩展检控通道是一个非常好的选择。这里介绍用Atmel公司ARM7处理器(AT91FR40162)和ALTERA公司的低成本FPGA芯片(cyclone2)结合使用完成多通道检控任务的一种实现方法。 各部分功能简介 图1为此系统的结构连接框图。如图所示,ARM芯片与FPGA芯片之间通过数据总线、地址总线及读写控制线相连,而与终端PC则通过串口通信;FPGA与目标设备通过命令控
[嵌入式]
PWM的C51程序
#include intrins.h #include stdio.h #include math.h #include UPSD3200.H #include upsd_pwm.h #define uint unsigned int #define uchar unsigned char PSD_REGS PSD8xx_reg _at_ csiop; #define KEYIO (~(PSD8xx_reg.DATAIN_A)) & 0x07 sbit CP=P4^7; sbit U_D=P1^1; void init_system(); // 系统初始化 uchar keyboard(); void uPSD_PWM4
[单片机]
AT24C01/02/04/08/16/32系列EEPROM读写程序
/*------------------------------------------------------------------------------ 〖说明〗24Cxx I2C EEPROM字节读写驱动程序,芯片A0-A1-A2要接GND(24C65接VCC,具体看DataSheet)。 现缺页写、页读,和CRC校验程序。以下程序经过50台验证,批量的效果有待考察。 为了安全起见,程序中很多NOP是冗余的,希望读者能进一步精简,但必须经过验证。 Atmel 24C01 比较特殊,为简约型,为其单独编程. 51晶振为11.0592MHz 〖文件〗RW24CXX.c 2001/09/18 -----------------
[单片机]
在C51程序设计中变量的空间分配几个方法
C51中变量的空间分配几个方法 1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、 data区内最好放局部变量。 因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同; 3、 确保你的程序中没有未调用的函数。 在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。 4、 程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存
[单片机]
搭建使用 RTX51-Tiny 的 C51 Keil 项目环境
个人记录: 没想到stc单片机除了裸板还能跑系统,有些小惊讶。 记得接触rtx51还是原来玩pSoC3(51内核)的时候,后来改成PSoC5换了arm的内核就把这部分放下了,今天偶然看到了,居然可以用stc单片机来跑,比较有意思。 mark一记。 有时间了可以对照着看看。 万方也搜了两篇文章,有空可以看看别人的设计: 基于RTX51嵌入式操作系统的智能卡电能表的设计 基于RTX51 Tiny操作系统的双人游戏设计 试了一下还挺方便和简单的。 系统的初始化 可以用main函数这样 (不太提倡) void main(void) { init_system();
[单片机]
单片机定时器T0测量外部脉冲时间C51程序
数码管显示部分电路图 51单片机程序代码: #include reg51.h #define UCHAR unsigned char #define UINT unsigned int sbit KEY=P3^2; UCHAR table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; UINT conter; void inittime(void) { KEY=1; conter=0; TMOD=0x09; TH0=0X00; TL0=0X00; EA=1;
[单片机]
FPGA与DSP的高速通信接口设计与实现
在雷达信号处理、数字图像处理等领域中,信号处理的实时性至关重要。由于FPGA芯片在大数据量的底层算法处理上的优势及DSP芯片在复杂算法处理上的优势,DSP+FPGA的实时信号处理系统的应用越来越广泛。ADI公司的TigerSHARC系列DSP芯片浮点处理性能优越,故基于这类。DSP的DSP+FPGA处理系统正广泛应用于复杂的信号处理领域。同时在这类实时处理系统中,FPGA与DSP芯片之间数据的实时通信至关重要。 TigerSHARC系列DSP芯片与外部进行数据通信主要有两种方式:总线方式和链路口方式。链路口方式更适合于FPGA与DSP之间的实时通信。随着实时信号处理运算量的日益增加,多DSP并行处理的方式被普遍采用,它们
[工业控制]