描述:对红外模块接收到的数据进行处理,然后将其显示到1602LCD上
一流程图:
二、小知识
1.二进制×2的i次方就是往左移动几位,同样的除以2的i次方就是向右移动几位。
比如0xAB 被除以 16 得到 0xA,就是向右移动的4位。
2. 定时器中断和外部中断要区分开,定时器是在每次溢出时触发中断;外部中断是由外部事件触发的中断。总结来说,就是定时器中断是基于定时器计数的,而外部中断是基于外部事件的
三、代码:
main.c
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include"1602.h"
#include"delay.h"
sbit IR=P3^2; //红外接口标志
char code Tab[16]="0123456789ABCDEF"; //十六进制字符,用于在Ir_work()函数中将二进制转换为16进制
/*------------------------------------------------
全局变量声明
------------------------------------------------*/
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok; //irpro_ok 表示红外信号已经成功解码和处理完毕。 irok 表示红外信号接收完成
/*
irok 的状态:
如果 irok 为 0,表示红外信号接收未完成或正在进行中。
如果 irok 为 1,表示红外信号接收完成,可以开始解码处理。
irpro_ok 的状态:
如果 irpro_ok 为 0,表示红外信号的数据尚未处理完毕。
如果 irpro_ok 为 1,表示数据处理完成,可以进行数码管的显示操作。
*/
unsigned char IRcord[4];
unsigned char irdata[33];
unsigned char TempData[16];
/*------------------------------------------------
函数声明
------------------------------------------------*/
void Ir_work(void);
void Ircordpro(void);
/*------------------------------------------------
定时器0中断处理
------------------------------------------------*/
void tim0_isr (void) interrupt 1 using 1
{
irtime++; //用于计数2个下降沿之间的时间
}
/*------------------------------------------------
外部中断0中断处理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
static unsigned char i;//接收红外信号处理 于存储信号数据的索引。使用 static 关键字保证在中断处理过程中 i 的值会被保留,即使函数多次调用。
static bit startflag; //用于标记是否开始记录数据
if(startflag)
{
if(irtime<63