一、 基本原理
11 红外编码原理
常用的红外线信号传输协议有 ITT 协议、 NEC 协议、 Nokia NRC 协议、 Sharp 协议、 Philips RC-5 协议、Philips RC-6协议,Philips RECS-80协议,以及 Sony SIRC 协议等。
1)协议组成 :一般由引导码 ,用户码,数据码,重复码或数据码的反码和结束码构成。
2)载波:常用的有33K,36K,366K,38K,40K,56K,无载波
3)占空比:常用的有1/3,1/2,不常用1/4
4)调制方式:脉宽调制,相位调制,脉冲位置调制
12 红外解码原理
本次作业选用的是NEC协议编码的,由38K载波调制的红外编码。基于51单片机的编码环境,编程语言为C51。 原理框图如下:
13 NEC编码方式
引导码,16bit用户码(地址码),8bit命令码(数据码)及其反码。
1) 引导码由一个9ms的载波波形和45ms的关断时间构成
2
2) 地址码共16bit,低8位在前,高8位在后。
3) 8bit命令码及其反码
二、 解码环境
21 硬件环境
1、 SST89E58RD单片机开发板
2、 HX1838型红外接收头
1) HX1838型红外接收头外形尺寸及引脚排列:
3
2) 应用电路图
3、 电阻、电容等元件
22 软件环境
1) Keil u vision2
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
2) C51
C51是为51系列单片机设计的一种C语言
结构化语言,代码紧凑——效率可与汇编语言媲美
接近真实语言,程序可读性强——易于调试、维护
库函数丰富,编程工作量小——产品开发周期短
机器级控制能力,功能很强——适合于嵌入式系统开发
4
与汇编指令无关,易于掌握——在单片机基础上上手快
三、 解码实现
31 程序结构框图
定时器20us发
生
一次中断
是否有信号
(低电平)
YES NO
判断是否为引导
码
低电平时间高
于600us
判断命令码为0
或1
储存命令码
解析命令码
在数码管显示
YES
NO
32 程序源代码
//NEC 编码红外遥控器解码程序
5
// // 2011-3-26 #include<stdioh> #include<intrinsh> #include<reg51h> #define TIMERH 0xed //宏定义定时器高位为237 #define TIMERL 0xed //宏定义定时器低位为237 unsigned char code seg_code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码 unsigned char bcode[32]=0; //定义储存二进制命令码数组 unsigned int count,dcode;//定义变量 // 关键变量说明 //en: 接受命令码使能控制 //flag: 接收完毕符号位 unsigned int i,j,en,k,m,flag; //解码数值和数码管显示段码转换 char code_chg(unsigned char ch) { switch(ch) { case 14:return 0; case 16:return 1; case 17:return 2; case 18:return 3; case 20:return 4; case 21:return 5; case 22:return 6; case 24:return 7; case 25:return 8; case 26:return 9; default :return 0; } } // 显示数字断码 void WriteSegData(unsigned char seg) { if(seg>16) seg = 16;
6
seg = seg_code[seg]; P0 = seg; _nop_(); _nop_(); P2 &= 0x1f; _nop_(); _nop_(); P2 |= 0xe0; } // 显示数字位码 void WriteCsData(unsigned char cs) { cs &= 0x0f; P0 = ~cs; _nop_(); _nop_(); P2 &= 0x3f; _nop_(); _nop_(); P2 |= 0xe0; } //初始化定时器 void InitTimer() { TMOD=0x20; //定时器1,工作方式2 TH1=TIMERH; //定时器高位初始化 TL1=TIMERL; //定时器低位初始化 EA=1; //允许中断 ET1=1; //定时器1开中断 // for(m=0;m<32;m++)//初始化存储二进制命令码数组 { bcode[m]=0; } } //定时器中断函数 void timer() interrupt 3 { if((P1&0x80)==0x00) //判断是否为低电位 { P1=P1&0xfe; //点亮二极管e5
7
if(count<100&&en==1)//判断是否为引导码 { count++; } else if(count>=100) //若是引导码则忽略 { en=0; count=0; } } //命令码高电位开始判断前一低电位持续时间 //若在600——800us之间,则为0 //若在1600——1900us之间,则为1 //此处定义时间段是为了抗干扰 else if(((P1&0x80)==0x80)&&en==1) { P1=P1|0x01; //若为高电位,熄灭LED灯e5 if(i<31) { if(count>30&&count<40) //若在600——800us之间,则为0 { bcode[i]=0; //储存二进制命令码 i++; //储存该位编码后,初始化 en=0; count=0; } else if(count>80&&count<95) //若在1600——1900us之间,则为1 { bcode[i]=1; i++; en=0; count=0; } } } else if(((P1&0x80)==0x80)&&en==0) //命令码之前初始化 { en=1; count=0; } else if(i==31) //接收完毕 { flag=1;
8
1、红外接收头一般有三只引线脚,分别为接地、电源和信号输出。不同型号的红外接收头,其引脚排列也不相同。笔者用电阻法判别红外接收头的引脚简单、快速。
2、用指针式万用表(数字表不适用)电阻挡R×1k(或R×100),先测量确定接地脚,一般接地脚与屏蔽外壳是相通的,余下的两只脚假设为a和b。
3、然后用黑表笔搭接地脚,用红表笔去测a或b脚的阻值,读数分别约为6kΩ和8kΩ(有的接收头相差在1kΩ左右);调换表笔,红表笔接地,黑表笔测a和b脚,读数分别约为20kΩ和40kΩ。
4、两次测量阻值相对应都小的a脚即为电源脚,阻值大的b脚即为信号输出脚。不过用不同的万用表和测不同型号的接收头,所测得的电阻都各不相同。
5、但总的结论是:电源脚对地的电阻值不管正反向都要比信号脚对地的电阻值小。
红外接收头管脚的判别方法:
1、先准备一个5V电源,因为三端红外接收头的正常工作电压均为5V(也可以用两节电池组成3V电源代替)。将要测量的三端红外接收头的任意一脚分别接电源正极,万用表黑表笔接电源负极,红表笔分别接红外接收头的另外两脚,测其静态电流(万用表置电流挡)。
2、若测量电流达几十mA,则为管脚接错,应立即断开以免损坏。只有测量结果为3mA以下(各种型号接收头静态电流有差异)时,才为接收头电源端的正确接法,该两脚即为电源正负极引脚。
3、将接收头正负极接入电源上,万用表黑表笔接电源负极,红表笔接另一未接入电源的一脚,测量其电压若与电源电压相近,即该脚为输出脚。
4、再取一个任何型号的红外遥控器对准接收头,使遥控器发射一次信号,若输出脚电压波动下降,说明该脚已输出接收的数据信号,证明三脚排列判别正确,并且该接收头完好无损,能正常工作。
3脚 33V
2脚 地
1脚 串个10K电阻
收不到信号你是用什么测量的直接单片机仿真看IO口 还是示波器
用示波器能看到波形就OK了其它的就看你编程了
以上就是关于我无线电不懂,红外写过51单片机的收发程序,可我不会制作遥控器···我怎么不能追问啊全部的内容,包括:我无线电不懂,红外写过51单片机的收发程序,可我不会制作遥控器···我怎么不能追问啊、红外线接收头1838引脚图、急!!!单片机的红外传感器1838谁知道怎么接~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)