
NEC编译码器的设计.doc
10页1NEC 编译码器的设计一、摘要本电路主要运用 STC89C52RC 单片机、UPD6121G 编码集成芯片、VS1838B 红外接收集成芯片、共阳极数码管、发光二极管灯等元件在发送端用程序已固化好的UPD6121G 编码集成芯片来实现 NEC 的编码并采用 38khz红外线发送,在接收端通过 STC89C52RC 单片机与红外接收集成芯片来实现对NEC 的解码过程通过不同指令来实现数码管和发光二极管亮与灭的变化四、NEC 编译码的基本原理及系统功能模块结构图1、NEC 编译码的基本原理:NEC 编码是采用脉宽调制的串行码,以脉宽为 0.565ms、间隔 0.56ms、周期为 1.125ms 的组合表示二进制的“0” ;以脉宽为 0.565ms、间隔 1.685ms、周期为 2.25ms 的组合表示二进制的“1” 上述“0”和“1”组成的 32 位二进制码经 38kHz 的载频进行二次调制以提高发射效率,达到降低电源功耗的目的然后再通过红外发射二极管产生红外线向空间发射1) 、发送器及 NEC 编码UPD6121G 产生的遥控编码是连续的 32 位二进制码组,其中前 16 位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
该芯片的用户识别码固定为十六进制 01H;后 16 位为 8 位操作码(功能码)及其反码UPD6121G 最多额 128 种不同组合的编码遥控器在按键按下后,周期性地发出同一种 32 位二进制码,周期约为 108ms一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在 45~63ms 之间代码格式(以接收代码为准,接收代码与发射代码反向)①位定义②单发代码格式:根据码的格式,应该等待 9ms 的起始码和 4.5ms 的结果 码完成后才能读码2(2) 、接收器及 NEC 解码一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接 元件,将其和 STC89C52RC 单片机的 P3.2 端口的外部中断 0 相连将接收到的红外信号通过计数器来计算其脉宽的宽度来分别是接收的数字信号“0” 还是数字信号“1” ,其具体操作过程在 C 程序中解释,在按下一个键时,单片机会发送一个 32 位的二进制数,此时我们用 unsigned char 型的变量 a[4]存储在四个字节的存储空间作为命令来进行设计者的自动控制。
3) 、NEC 码波形图数字信号“0”和数字信号“1”波形图起始码 用户识别码 指令码 指令反码 一帧数据波形图32、系统功能模块结构框图(1) 、NEC 编码模块结构框图: 监控编 码扫描信号 发生模块时钟脉冲发生模块键盘指令编码调制器红外线发送设备(2) 、NEC 解码模块结构框图:STC89C52 单片机 数据接收与处理数据显示红外接收电路基准时钟电路复位电路4五、系统电路图及工作原理分析1、外线接收 NEC 译码电路模块此模块由红外接收电路、复位电路、基准时钟电路、单片机单片机数据处理电路和数码管与发光二极管显示电路五大部分组成:(a) 、基准时钟电路:是采用 12MHZ 的晶振来提高其稳定性在此情况下,单片机的一个机器周期就为 1us,也就是说在计数时,1ms 时间计数器要计数 1000次,这在单片机译码的时候要根据 TH0 和 TL0 的值来计算脉宽是否为有效值;(b) 、复位电路:是在程序跑飞时或者使用者想单片机从第一条指令重新运行时的功能其原理就是根据电容的充放电使 RST 引脚在上电时电容充电使 RST 处于低电平让单片机复位或者是当按键按下时单片机复位;(c) 、红外接收电路:是将接收到的红外信号经过整形、放大、滤波送给单片机进行译码;(d) 、单片机数据处理电路:是译码电路的核心,它将红外接收送来的信号进行识别、处理并存储。
识别过程是通过启动外部中断 0 和计数器 0 来辨别脉冲宽5度及二进制数据“0”和”1”的e) 、数码管与发光二极管显示电路:此电路是将单片机接收到的数据指令用它来显示查表后的数据2、红外线发送 NEC 编码电路模块此模块主要是由键盘输入电路、单片机控制编码电路、基准时钟电路、复位电路和红外二极管发送电路组成(a) 、时钟基准电路:和接收端一样为单片机提供稳定的工作频率,一般采用 12MH 的晶振来提高其稳定性b) 、单片机控制编码电路:利用单片机将接收来的键盘输入信号进行识别,通过编写程序使发送端按不同的延时时间取反发送端,从而达到 NEC 编码的过程c) 、键盘输入电路:是通过 6x5 的矩阵通过键盘扫描来确定输入值的理论上可以发送 30 个不同的指令,用来执行不同任务d) 、复位电路:和接收端一样,用于让单片机程序从第一条执行e) 、 红外二极管发送电路:是通过控制二极管电压的高低来实现红外发送的,发送的频率为38KHZ 的方波,由于发送功率不强所以接收端接收距离在 10M 左右范围内6六、NEC 编译码程序流程图1、NEC 编码流程图:72、NEC 译码流程图:初始化程序查表调用显示函数计数脉宽是否标准有外部中断 0锁存接收数据并 执行相应控制YesNONOYes七、C 程序代码及注释#include#define uchar unsigned char#define uint unsigned intUint code table[21]={ 0x77,0x7c,0x39,0x5e,0x79,0x71,0x5e,0x79,0x71,0x3f,0x39,0x5e,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f }; //共阳极数码管相对应的十六进制值uchar a[4]={0,0,0,0},j,i,k,num; //定义变量sbit js=P3^2; //红外接收端sbit hd=P2^3; //红色二极管控制端sbit yd=P2^4; //蓝色二极管控制端delay(uint z) //延时子程序{8uint x;for(x=z;x>0;x--);}void main(){ EA=1; //初始化ET0=1; //开计数中断 0EX0=1; //开外部中断 0TMOD=1; //设置工作方式IT0=1; //启动计时器while(1){ if((a[2]+a[3])==0xff) //判断接收到数据是否正确switch(a[2]) //将接受到的数据与所建表一一对应{case 0x00:num=1;break;case 0x01:num=2;break;case 0x02:num=3;break;case 0x04:num=4;break;case 0x05:num=5;break;case 0x06:num=6;break;case 0x08:num=7;break;case 0x09:num=8;break;case 0x0a:num=9;break;case 0x0c:num=10;break;case 0x0d:num=11;break;case 0x0e:num=12;break;case 0x10:num=13;break;case 0x11:num=14;break;case 0x12:num=15;break;case 0x14:num=16;break;case 0x15:num=17;break;case 0x16:num=18;break;case 0x18:num=19;break;case 0x19:num=20;break;9case 0x1a:num=21;break;} P0=table[num-1]; //输出显示值if(num==1) //判断按键值是否为第一个按键如果是就熄灭蓝灯hd=1; if(num==2) //判断按键值是否为第二个按键如果是就点亮蓝灯hd=0; if(num==4) //判断按键值是否为第四个按键如果是就熄灭红灯yd=1; if(num==5) //判断按键值是否为第五个按键如果是就点亮红灯yd=0;}} void zhd(void) interrupt 0 // 外部中断子程序(译码过程){ TH0=0; //计数器清零TL0=0; TR0=1; //启动计数器while(!js) //等待低电平结束{delay(5); if(TH0>45) //判断低电平是否高于 11.52ms 如果高于则跳出等待和中断return;}TR0=0; if(TH028) //判断高电平是否高于 7.168ms 如果高于则跳出等待和中断return;}10//至此为起始信号检测TR0=0;TH0=0; for(i=0;i15)return;}TH0=0; while(js) //判断高电平是否大于 1.012ms 如果高于则为接受到 1,否则为 0{delay(5);if(TH0>15)return;}TR0=0;CY=0;k=(k>>1);if(TH0>4)k=k+0x80;TH0=0;}a[i]=k;}}。












