历史上的今天
今天是:2025年03月24日(星期一)
2021年03月24日 | 51单片机实现红外编码检测
2021-03-24 来源:eefocus
一直以来就像做个红外线检测,因为我是做空调扇的,我们组专门负责遥控器.前几天在百度文库找到一篇文章,之后就做了一个
#include #include sbit IR=P3^2; //红外接口标志 /*------------------------------------------------ 全局变量声明 ------------------------------------------------*/ unsigned char irtime;//红外用全局变量 bit irpro_ok,irok; unsigned char IRcord[4]; unsigned char irdata[33]; /*------------------------------------------------ 函数声明 ------------------------------------------------*/ 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 bit startflag; //是否开始处理标志位 if(startflag) { if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms i=0; irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i++; if(i==33) { irok=1; i=0; } } else { irtime=0; startflag=1; } } /*------------------------------------------------ 定时器0初始化 ------------------------------------------------*/ void TIM0init(void)//定时器0初始化 { TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00; //重载值 TL0=0x00; //初始化值 ET0=1; //开中断 TR0=1; } /*------------------------------------------------ 外部中断0初始化 ------------------------------------------------*/ void EX0init(void) { IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2) EX0 = 1; //使能外部中断 EA = 1; //开总中断 } /*------------------------------------------------ 红外码值处理 ------------------------------------------------*/ void Ircordpro(void)//红外码值处理函数 { unsigned char i, j, k; unsigned char cord,value; k=1; for(i=0;i<4;i++) //处理4个字节 { for(j=1;j<=8;j++) //处理1个字节8位 { cord=irdata[k]; if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差 value|=0x80; if(j<8) { value>>=1; } k++; } IRcord[i]=value; value=0; } irpro_ok=1;//处理完毕标志位置1 } /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main(void) { unsigned char temp[3]; unsigned int i; EX0init(); //初始化外部中断 TIM0init();//初始化定时器 lcd_init(); // 初始化LCD delay(10); lcd_pos(0); // 设置显示位置为第一行的第0个字符 while(1)//主循环 { if(irok) //如果接收好了进行红外处理 { Ircordpro(); irok=0; } if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等 { /*------------------------------------------------ 将ascii的数字显示: 即将字符对应的十进制数的每一位付给temp并转换成字符 ------------------------------------------------*/ temp[0]=IRcord[2]%10+48;//个位 temp[1]=IRcord[2]%100/10+48;//十位 temp[2]=IRcord[2]/100+48;//百位 lcd_wcmd(0x01); //清除LCD的显示内容 delay(1); lcd_pos(0); lcd_wdat('*'); lcd_wdat(temp[2]); lcd_wdat(temp[1]); lcd_wdat(temp[0]); lcd_wdat('*'); for(i=0;i<10;i++) delay(100); } } } /*------------------------------------------------- #include ----------------------------------------------------*/ #include #include /*------------------------------------------------ 定义数据类型 ------------------------------------------------*/ typedef unsigned char BYTE; typedef bit BOOL ; /*------------------------------------------------ 定义控制位 ------------------------------------------------*/ sbit rs = P2^4; // sbit rw = P2^5; sbit ep = P2^6; /*------------------------------------------------ 声明函数 ------------------------------------------------*/ delay(BYTE ms) { // 延时子程序 BYTE i; while(ms--) { for(i = 0; i< 250; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } BOOL lcd_bz() { // 测试LCD忙碌状态 BOOL result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_();
上一篇:51单片机两点间温度控制设计
下一篇:STC12延时函数的探究
史海拾趣
|
想请教一下,2407是不是没有CPU Timer? 2812已经有了通用计数器GP,为什么还需要CPU Timer? 2812的Timer主要是做什么用的呢? 是不是PSC减至0后,TIM才会减1 ? 如果没有用DSP-BIOS,2812的CPU-Timer2是否就能自行使用? 新手接触,问题太 ...… 查看全部问答> |
|
很郁闷的问题,WinCE、Platform Builder达人请进来,多提提建议,谢谢! 本人买了一块FriendlyARM(友善之臂)的板子,用VS2005开发了一个程序要运行在板子上面,系统刷成WinCE 5.0了,程序开发也完成了,正当以为一切可以结束的时候,发现板子重启之后保存在WinCE里面的数据完全消失了,程序可以放在别的 ...… 查看全部问答> |
|
Tornado2.2 for pcPentium问题,快被弄疯了 tornado2.2 for pentium,目标机是集成显卡,3com网卡的p4。 bsp选择p4,#define INCLUDE_EL_3C90X_END,#define INCLUDE_PC_CONSOLE都定义了,但是目标机一启动,v1.6+++++++走完就自动重启。 在网上查了下,好像是说集成显卡的内存可 ...… 查看全部问答> |
|
请教:我原来使用的WinCE5.0可以安装一个程序,但是后来设备更新后,WinCE升级了,我再重新安装时,一直无法安装。 我原来使用的WinCE5.0可以安装一个程序,但是后来设备更新后,WinCE升级了,我再重新安装时,一直无法安装。对此我一直很疑惑,系统主要对bug进行了修复,但是原来安装的程序只是复制到系统的文件夹中。其中有一点,系统盘符的名称变更了,原来是英 ...… 查看全部问答> |
|
比如 PA6--CH1/IN6 PA7 --CH2/IN7 现在我要捕获pwm的占空比 也就是要用到pwm模式 用到了两个输入口i 不过按照st的资料 ch2是内部连接的 那么 我还能PA7做模拟输入 ...… 查看全部问答> |
|
--基于AD56XX的VHDL控制程序--设计者 eeleaderlibrary ieee;use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity Wr_Ad56XX is port ( clk: in std_logic;------20M ...… 查看全部问答> |
|
现在很多设备仪器都在用可充电锂电池组(锂电池组加装有电池保护板),为了防水的原因,电池组的封装固定后,电池组做防水处理一般用胶水固定,问题是:有的设备和仪器使用几个月后出现不能充电了,什么原因?当然电池供 ...… 查看全部问答> |




