红外通信

红外通信1 红外发射装置又可由键盘电路 红外编码芯片 电源和红外发射电路组成 红外接收设备可由红外接收电路 红外解码芯片 电源和应用电路组成 通常为了使信号更好的被发射端发送出去 经常会将二进制数据信号调制成为脉冲信号 通过红外发射管发射 常用的有通过脉冲宽度来实现信号调制的脉宽调制 PWM 和通过脉冲串之间的时间间隔来实现信号调制的脉时调制 PPM 两种方法 2 有发射端和接收端 所以就会对应有编码电路和解码电路 3 红外常用的载波频率是 35kHz 原理图 代码 来源于普中科技单片机教程

代码:来源于普中科技单片机教程 / * 红外通信实验 * 实现现象:下载程序后,数码管显示红外遥控键值数据 注意事项: 红外遥控器内的电池绝缘片一定要抽掉 */ #include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit IRIN=P3^2; u8 IrValue[6]; u8 Time; u8 DisplayData[8]; u8 code smgduan[17]={ 
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76}; //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码 /* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us */ void delay(u16 i) { 
    while(i--); } /* * 函数名 :DigDisplay() * 函数功能 :数码管显示函数 * 输入 : 无 * 输出 : 无 */ void DigDisplay() { 
    u8 i; for(i=0;i<3;i++) { 
    switch(i) //位选,选择点亮的数码管, { 
    case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位  } P0=DisplayData[2-i];//发送数据 delay(100); //间隔一段时间扫描  P0=0x00;//消隐 } } /* * 函数名 : IrInit() * 函数功能 : 初始化红外线接收 * 输入 : 无 * 输出 : 无 */ void IrInit() { 
    IT0=1;//下降沿触发 EX0=1;//打开中断0允许 EA=1; //打开总中断 IRIN=1;//初始化端口 } /* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 */ void main() { 
    IrInit(); while(1) { 
    DisplayData[0] = smgduan[IrValue[2]/16]; DisplayData[1] = smgduan[IrValue[2]%16]; DisplayData[2] = smgduan[16]; DigDisplay(); } } /* * 函数名 : ReadIr() * 函数功能 : 读取红外数值的中断函数 * 输入 : 无 * 输出 : 无 */ void ReadIr() interrupt 0 { 
    u8 j,k; u16 err; Time=0; delay(700); //7ms if(IRIN==0) //确认是否真的接收到正确的信号 { 
    err=1000; //1000*10us=10ms,超过说明接收到错误的信号 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时 侯,程序死在这里*/ while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去  { 
    delay(1); err--; } if(IRIN==1) //如果正确等到9ms低电平 { 
    err=500; while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去 { 
    delay(1); err--; } for(k=0;k<4;k++) //共有4组数据 { 
    for(j=0;j<8;j++) //接收一组数据 { 
    err=60; while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去 { 
    delay(1); err--; } err=500; while((IRIN==1)&&(err>0)) //计算高电平的时间长度。 { 
    delay(10); //0.1ms Time++; err--; if(Time>30) { 
    return; } } IrValue[k]>>=1; //k表示第几组数据 if(Time>=8) //如果高电平出现大于565us,那么是1 { 
    IrValue[k]|=0x80; //最高bit写1 } Time=0; //用完时间要重新赋值  } } } if(IrValue[2]!=~IrValue[3]) { 
    return; } } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200228.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午11:16
下一篇 2026年3月20日 上午11:16


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号