51单片机设计的红外线遥控器电路图及工作原理
51单片机红外遥控程序

unsigned long m,Tc;
unsigned char IrOK;
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display()
{
dula=0;
P0=table[show[0]];
MOV R7,#202
DELAY882_A
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000 ;1.085x ((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A
NOP
NOP
DJNZ R7,DELAY1000_A
Qq:735491739
红外遥控发射芯片采用PPM编码方式,当发射器按键按下后,将发射一组108ms的编码脉冲。遥控编码脉冲由前导码、8位用户码、8位用户码的反码、8位操作码以及8位操作码的反码组成。通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。前导码是一个遥控码的起始部分,由一个9ms的低电平(起始码)和一个4. 5ms的高电平(结果码)组成,作为接受数据的准备脉冲。以脉宽为0. 56ms、周期为1. 12ms的组合表示二进制的“0”;以脉宽为1. 68ms、周期为2. 24ms的组合表示二进制的“1”。如果按键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2. 5ms)组成。
基于51单片机的红外遥控计算器程序(附电路图,注释详细)

/*************************基于51单片机的红外遥控计算器程序****************/ /****本程序用基于TC9012遥控器可直接操作,电路图,遥控器编码图在最后****/ #include<reg52.h>#include<stdio.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define lint unsigned long intsbit IR=P3^2; //红外接口标志bit irpro_ok,irok;uchar irtime,X,mir,fir; //红外用全局变量uchar IRcord[4], irdata[33];uchar DA TA1[8]={0,0,0,0,0,0,0,0}; //第一个数uchar DA TA2[8]={0,0,0,0,0,0,0,0}; //第二个数uchar RESUIT[8]={0,0,0,0,0,0,0,0}; //结果uchar px1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0; //各全局变量uchar temp,key,fang1,fang2;lint x1=0,x2=0,y=0; //输入的数及其结果void delay(msx); //ms延时函数void Init(); //系统初始化void INTInit(); //中断初始化void Ircordpro(); //红外码值处理函数void keyscan(); //键值检测void delay(uint); //延时void DataOper(); //数据运算void DataHandle(); //数据接收void DisplayHandle(); //显示处理void display(uchar,uchar); //数码管显示函数void main(){INTInit();P0=0x00;while(1){keyscan();DataHandle();DisplayHandle();}}void INTInit(){TMOD=0x02; //定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //reload valueTL0=0x00; //initial valueET0=1; //开中断TR0=1;IT0 = 1; // Configure interrupt 0 for falling edge on /INT0 (P3.2)EX0 = 1; // Enable EX0 InterruptEA = 1;}void Init() //初始化,所有数据归零{uchar i;px1=0;px2=0;px3=0;flag=0;flag1=0;flag2=0;flag3=0;f1=0;f2=0;f3=0;f4=0;x1=0;x2=0;y=0;for(i=0;i<8;i++){DA TA1[i]=0;DATA2[i]=0;RESUIT[i]=0;}}void delay(msx) //msx为延时毫秒数{uint i,j;for(i=0;i<=msx;i++)for(j=0;j<=110;j++);}void display(uchar n,uchar m) //n是第几只数码管,m是显示的数字是多少{P0=P0&0x80;P0=P0|(n<<4);P0=P0|m;}void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数{irtime++;}void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数{if(fir){if(irtime<49&&irtime>=31)mir=0; //4.5ms+4.5msirdata[mir]=irtime;irtime=0;mir++;if(mir==33){irok=1;mir=0;fir=0;}}else{irtime=0;fir=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) value=value|0x80;else value=value;if(j<8)value=value>>1;k++;}IRcord[i]=value;value=0;}if((IRcord[0]=~IRcord[1])&&(IRcord[2]=~IRcord[3])) {X=IRcord[2];fang2=1;}}void keyscan() //矩阵键值扫描子函数{if(irok){Ircordpro();irok=0;fang1=1;}if((fang1==1)&&(fang2==1)){fang1=0;fang2=0;switch(X){case 0x08: key=0;flag=1;break;case 0x01: key=1;flag=1;break;case 0x02: key=2;flag=1;break;case 0x03: key=3;flag=1;break;case 0x05: key=4;flag=1;break;case 0x06: key=5;flag=1;break;case 0x07: key=6;flag=1;break;case 0x09: key=7;flag=1;break;case 0x0A: key=8; flag=1;break;case 0x0B: key=9; flag=1;break;case 0x10: key=10;flag1=1;display(7,0);break;case 0x1A: key=11;flag1=1;display(7,0);break;case 0x16: key=12;flag2=1;Init();break;case 0x11: key=13;flag2=1;DataOper();break;case 0x15: key=14;flag1=1;display(7,0);break;case 0x19: key=15;flag1=1;display(7,0);break;}}}void DataOper(){uchar i,j,m=0;lint k=0;for(i=0;i<(px1-1);i++) //把第一个数组中的数处理成十进制数{k=DATA1[i];for(j=0;j<(px1-i-1);j++){k=k*10;}x1=x1+k;}x1=x1+DATA1[px1-1];for(i=0;i<(px2-1);i++) //把第二个数组中的数处理成十进制数{k=DATA2[i];for(j=0;j<(px2-i-1);j++){k=k*10;}x2=x2+k;}x2=x2+DATA2[px2-1];if(f1==1) y=x1+x2; //根据标志位进行运算else if(f2==1) y=x1-x2;else if(f3==1) y=x1*x2;else if(f4==1) y=x1/x2;RESUIT[0]=y/10000000; //把各位分离出来存入结果数组中RESUIT[1]=(y%10000000)/1000000;RESUIT[2]=(y%1000000)/100000;RESUIT[3]=(y%100000)/10000;RESUIT[4]=(y%10000)/1000;RESUIT[5]=(y%1000)/100;RESUIT[6]=(y%100)/10;RESUIT[7]=y%10;while(!RESUIT[m]) m++;px3=m;}void DataHandle() //把每次按键的结果记录下来,并存到适当的位置{if((key<10)&&(flag==1)&&(flag1==0)){DATA1[px1]=key;px1++;flag=0;}else if((key<10)&&(flag==1)&&(flag1==1)){DATA2[px2]=key;px2++;flag=0;}else if(flag1==1){switch(key){case 10 : f1=1;f2=0;f3=0;f4=0;break; // "+"case 11 : f1=0;f2=1;f3=0;f4=0;break; // "-"case 14 : f1=0;f2=0;f3=1;f4=0;break; // "*"case 15 : f1=0;f2=0;f3=0;f4=1;break; // "/"}}}void DisplayHandle() //将数据显示在数码管上{uchar i,x;if((flag1==0)&&(flag2==0)){x=px1;if(px1==0) display(7,0);else{for(i=0;i<px1;i++){display(8-x,DA TA1[i]);x--;delay(5);}}}else if((flag1==1)&&(flag2==0)){x=px2;if(px2==0) display(7,0);else{for(i=0;i<px2;i++){display(8-x,DA TA2[i]);x--;delay(3);}}}else if ((flag1==1)&&(flag2==1)){for(i=7;i>=px3;i--){display(i,RESUIT[i]);delay(3);}}}。
51单片机设计的红外线遥控器电路图及工作原理

51单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控解码器”。
该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF 一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。
发光二极管8个。
价钱不足20元。
电路图及原理:主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个发光二极管作为显示解码输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分别与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分别接电脑串行口的2(接收)脚、3(发送脚)。
晶振采用11.0592MHz,这样才能使得通讯的波特率达到9600b/s,电脑一般默认值是9600b/s、8位数据位、1位停止位、无校验位。
电路就这么简单了,现在分析具体的编程过程吧。
如图所示,panasonic遥控器的波形是这样的(经过反复测试的结果)。
开始位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms 高电平周期为1.8ms表示“0”,0.9ms低电平2.4ms高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。
因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。
定时器0的工作方式设置为方式1:mov tmod,#09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。
51单片机项目教程项目 14 红外遥控

图14- 10调制后加到红外发光管驱动电路的波形
7.硬件调制与软件调制 硬件调制: 将编码信号与载波通过与门进行调制. 软件调制: 直接用软件产生调制后的信号. 如图14-11,14-12所示。
9.红外接收头的特性 当接收到38KHz的红外线时其输出低电平
静态时其输出为高电平,如图14-15所示
红外线的应用领域 1.红外线辐射加热 理疗机————使用远红外线的热效应治疗 2.红外线测温 夜视仪————探测人体热量,红外线成像
热寻的导弹——跟踪飞机尾部热量的导弹,著名的美国响尾蛇
3.红外线通信 测距仪————以红外线作为载波的一种测量距离的精密仪器 红外遥控器------以红外线作为载波的一种无线通信设备 红外遥控的优点及应用场合 红外线遥控是目前使用最广泛的一种通信和遥控手段。 红外线遥控装置的优点: 体积小、功耗低、功能强、成本低 应用场合: 在家用电器中,彩电、录像机, 录音机、音响设备、空凋机以及玩具等 产品中应用非常广泛。工业设备中,在高压、辐射、有毒气体、粉尘 等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干 扰。
图 14- 1 客户码和操作码
那么现在假如要发送一个数据ECH 其客户码1为AAH,客户码2为66H 则发送的二进制数为 01010101 01100110 00010011 11101100 再加上引导码要发送的波形就为:,如图14-9所示。
图 14- 1 波形
6.上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制 以提高发射效率(因红外接收头能接收的红外线为38KHz 左右),还 可达到降低电源功耗的目的。如图14-10所示。
红外接收头的主要参数如下: 工作电压:4.8~5.3V 工作电流:1.7~2.7mA 接收频率:38kHz 峰值波长:980nm 静态输出:高电平 输出低电平:≤0.4V 输出高电平:接近工作电压
51单片机红外控制发射器设计【非常详细】

单片机红外控制发射器设计【详细】摘要随着社会的发展、科技的进步以及人们生活水平的逐步提高,各种方便于生活的遥控系统开始进入了人们的生活。
传统的遥控器采用专用的遥控编码及解码集成电路,这种方法虽然制作简单、容易,但由于功能键数及功能受到特定的限制,只实用于某一专用电器产品的应用,应用范围受到限制。
而采用单片机进行遥控系统的应用设计,具有编程灵活多样、操作码个数可随便设定等优点。
本设计主要应用了A T89C2051单片机作为核心,综合应用了单片机中断系统、定时器、计数器等知识,应用红外光的优点。
遥控操作的不同,遥控发射器通过对红外光发射频率的控制来区别不同的操作。
遥控接收器通过对红外光接收频率的识别,判断出控制操作,来完成整个红外遥控发射、接收过程。
其优点硬件电路简单,软件功能完善,性价比较高等特点,具有一定的使用和参考价值。
关键词:单片机,红外遥控,中断,定时,计数,频率AbstractWith the development of our society and the gradual improvement of science and technology, various kinds of help remote control systems have began to enter people’s life. The traditional remote controllers adopt special remote control code and decode integrated circuits, though this kind of method is simply and easily, it is only the practical application of some certain special electric equipments because of the counted functional keys is counted and the restricted function, so the range of application is limited. But the remote controllers which adopt the microprocessors have many advantages such as flexible operating and unceremonious manipulative keys.The design has used A T89C2051 microprocessor as core, integratively apply the interruptive system, timer , counter ,etc. mainly to design originally and also take the advantage of the infrared light. The remote control launcher distinguishes different operation through the control on frequency of infrared emission of light. The remote control receiver judges control operation by adopting the discerned frequency of the received infrared light to finish the whole launching and receiving course.Its advantage is that the hardware circuit is simple, the software is with perfect function, have certain use and reference valueKeywords:Microprocessor, Infrared remote control,Interrupt,Timing,Counting,Frequency目录摘要 (I)Abstract (I)1 绪论 (5)1.1 单片机的产生与发展 (5)1.2红外通信技术概述 (3)1.2.1红外概述 (3)1.2.2 选择红外遥控的原因 (3)1.2.3红外的简单发射接收原理 (4)2.1 设计目的与原理 (4)2.2单片机红外遥控发射器设计原理 (4)2.3 单片机红外遥控接收器设计原理 (5)3系统硬件电路设计 (6)3.1有关A T89C2051单片机的介绍 (6)3.1.1简介 (6)3.1.2引脚介绍 (6)3.1.3 A T89C2051单片机的主要组成部分 (8)3.2定时器/计数器 (9)3.2.1主要特性 (9)3.2.2定时/计数器0和1的控制和状态寄存器 (10)3.2.3 T0和T1的4种工作方式 (12)3.3独立式按键结构 (12)3.4低功耗控制电路 (13)3.4.1低功耗的实现方法 (13)3.4.2 掉电保护和低功耗的设计 (13)3.5 CPU时钟电路 (16)3.6 复位电路 (17)3.6.1复位状态 (17)3.6.2 复位电路 (17)3.7 红外发射电路的设计 (18)3.8 红外接收电路的设计 (19)3.9 完整的系统电路设计图 (20)4 系统软件设计 (20)4.1遥控发射器程序设计 (20)4.1.1程序总体结构 (20)4.1.2 伪指令和初始化程序 (22)4.1.3键盘扫描程序 (24)4.1.4 中断服务程序 (25)4.2 遥控接收器程序设计 (27)4.2.1 程序总体结构 (27)4.2.2 初始化程序 (29)4.2.3 计数值比较程序 (30)4.2.4 定时器1中断服务程序 (30)5 总结与展望 (31)致谢 (32)参考文献 (33)附录1 (35)附录2 (37)1 绪论1.1单片机的产生与发展为适应社会发展的需要,微型计算机不断的更新换代,新产品层出不穷。
【精品论文】51单片机红外数据收发器设计+设计框图+电路图+流程图+源程序-论文_39

51单片机红外数据收发器设计+设计框图+电路图+流程图+源程序-论文51单片机红外数据收发器设计+设计框图+电路图+流程图+源程序研究目的本设计主要研究并设计一个基于单片机的红外接收系统,并实现对八路开关的控制。
控制系统主要是由MCS-51和52系列单片机、电源电路、红外发射电路、红外接收电路、LCD显示电路等部分组成,单片机编码发射遥控信号经红外接收处理传送给单片机,单片机根据不同的信息码控制八路LED发光二极管各个状态,并完成相应的状态指示。
研究意义红外遥控的特点是不影响周边环境、不干扰其它电器设备。
由于其无法穿透墙壁,故不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。
信息可以直接通过红外光进行调制传输,例如,信息直接调制红外光的强弱进行传输,也可以用红外线产生一定频率的载波,再用信息对载波进行调制,接收端去掉载波,取到信息。
从信息的可靠传输来说,这就是我们今天看到的大多数红外遥控器所采用的方法。
近年来随着计算机在社会领域的渗透,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
传统的遥控器大多数采用了无线电遥控技术,但是随着科技的进步,红外线遥控技术的成熟,红外也成为了一种被广泛应用的通信和遥控手段。
继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
由于红外线抗干扰能力强,且不会对周围的无线电设备产生干扰电波,同时红外发射接收范围窄,安全性较高。
红外遥控虽然被广泛应用,但各产商的遥控器不能相互兼容。
当今市场上的红外线遥控装置一般采用专用的遥控编码及解码集成电路,由于其灵活性较低,应用范围有限。
所以采用单片机进行遥控系统的应用设计,遥控装置将同时具有编程灵活、控制范围广、体积小、功耗低、功能强、成本低、可靠性高等特点,因此采用单片机的红外遥控技术具有广阔的发展前景。
C51单片机09(红外遥控)

P3.2(INT0)
采用脉宽调制的串行码波形
0.56ms
1.685ms
0.565ms
0.565ms
1.125ms
2.250ms
“0”
“1”
采用脉宽调制的串行码波形
0.5ms 0.5ms 0.56ms 0.5ms 0.5ms 0.5ms 0.5ms
1.685ms
“0”
0.565ms
“1”
0.565ms
采用脉宽调制的串行码波形
0.5ms 0.5ms 0.56ms 0.5ms 0.5ms 0.5ms 0.5ms
1.685ms
“0”
0.565ms
“1”
0.565ms
定时器中断T0发生, 定时器中断 发生,times=2 发生
采用脉宽调制的串行码波形
0.5ms 0.5ms 0.56ms 0.5ms 0.5ms 0.5ms 0.5ms
//LED显示红外解码 显示红外解码
小结
Thank you
D7 EA
D6
D5 ET2
D4 ES
D3 ET1
D2 EX1
D1 ET0
D0 EX0
定时/计数器控制寄存器 定时 计数器控制寄存器TCON 计数器控制寄存器
TF1——定时器T1溢出标志位 ——定时器 溢出标志位 ——定时器 TR1——定时器 启动位(= ,启动) ——定时器 启动位(= ——定时器T1启动位(=1,启动) TF0——定时器 溢出标志位 ——定时器 ——定时器T0溢出标志位 TR0——定时器 启动位(= ,启动) ——定时器 启动位(= ——定时器T0启动位(=1,启动) IE1——外部中断 请求标志位 ——外部中断 ——外部中断1请求标志位 IT1——外部中断 触发方式(= ,边沿触发) ——外部中断 触发方式(= ——外部中断1触发方式(=1,边沿触发) IE0——外部中断 请求标志位 ——外部中断 ——外部中断0请求标志位 IT0——外部中断0触发方式(=0,电平触发) ——外部中断 触发方式(= ,电平触发) ——外部中断 触发方式(= D7 TF1 D6 TR1 D5 TF0 D4 TR0 D3 IE1 D2 IT1 D1 IE0 D0 IT0
51单片机综合学习系统_红外线遥控篇

图 10 截取的波形图像 Ele
PRACTICAL ELECTRONICS
制作天地
51 单 片 机 综 合 学 习 系 统
— ——红外线遥控篇
◎徐 玮
通过 以 前 的学 习 , 已 经对 51 单 片 机综 合 学 习 系 统 的 使用 方 法 及 学 习 方 式 有 所 了 解, 并 学 会 了 12864 点 阵型液晶显示的基本知识, 体会到了综合学习系统的 易用性与易学性, 这一期我们将学习红外线遥控的基 本原理与使用方法。
2008 年第 3 期 电子制作 23
PRACTICAL ELECTRONICS
制作天地
4.5ms 的结果码完成后才能读码。 3.接收器及解码 一体化红外线接收器是一种集红外线接收和放大
于一体, 不需要任何外接元件, 就能完成从红外线接收 到 输出 与 TTL 电 平信 号 兼 容的 所 有 工 作 , 而 体 积 和 普 通的塑封三极管大小一样, 它适合于各种红外线遥控 和红外线数据传输。在 51 单片机综合学习系统的右上 角有一个黑色的一体化红外线接收头。
遥控 器 在 按键 按 下 后, 周 期 性 地 发 出 同 一 种 32 位 二进制码, 周期约为 108ms。一 组码 本 身 的持 续 时 间随 它 包 含 的 二 进 制“0”和“1”的 个 数 不 同 而 异 , 大 约 在 45~63ms 之间, 图 6 为发射波形图。
HANDS ON PROJECTS
图 1 硬件平台 红外线遥控是目前使用最广泛的一种通信和遥控 方 式 。由 于红 外 线 遥控 装 置 具 有 体 积 小 、功 耗 低 、成 本 低 等 特点, 因 而 继彩 电 、录 像 机 之 后 , 它 在 录 音 机 、音 响 设备、空凋机以及玩具等小型电器装置上也被广泛采 用。 下面详细介绍红外线遥控的基本原理和使用方 法。 1.红外遥控系统 通用红外遥控系统由发射和接收两大部分组成, 应用编 / 解码专用集成电路芯片来进行控制操作, 如图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控*器”。
该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF 一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。
发光二极管8个。
价钱不足20元。
电路图及原理:主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个发光二极管作为显示*输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分别与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分别接电脑串行口的2(接收)脚、3(发送脚)。
晶振采用11.0592MHz,这样才能使得通讯的波特率达到9600b/s,电脑一般默认值是9600b/s、8位数据位、1位停止位、无校验位。
电路就这么简单了,现在分析具体的编程过程吧。
如图所示,panasonic遥控器的波形是这样的(经过反复测试的结果)。
/sch/rc/0080743.html开始位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms高电平周期为1.8ms表示“0”,0.9ms低电平 2.4ms高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。
因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。
定时器0的工作方式设置为方式1:mov tmod,#09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。
比如:jnb p3.2,$jb p3.2,$clr tr0这3条指令就可以测量一个高电平,接下来读取计数值TH0,TL0就可以分辨是起始位还是“1”或“0”。
在确定码表之前,您可以使用P0口的8个发光二极管来显示编码,16位编码分两次显示:mov p0,keydataacall delay_1s ;//1ms延时子程序mov p0,keydata+1ljmp main根据P0相继的两次显示的编码,记录每个按键的编码,形成编码表,即遥控器编码的*完毕。
码表确定之后,以后接收到遥控器的编码之后,就与码表比较,找到匹配的码项,并把该码项对应的顺序号输出到P0口,同时也把顺序号向串行口输出到电脑,电脑接收该数据后由串口软件决定如何处理。
程序不长,下面是完整的程序和注释:(先看流程图)、keydata equ 30h ;//该地址和31H地址用来存放遥控器按键编码。
org 00hmain:mov keydata,#0 ;// 清零mov tmod ,#09h ;//设置定时0方式1,GATE=1mov r7,#0 ;//计数器,用来计数是否满8位mov r6,#0 ;//计数器,用来计数是否满2字节(解16位编码)jb p3.2,$ ;//是否为低电平again: ;//如果为低,继续往下面执行mov tl0,#0 ;//清零TL0mov th0,#0 ;//清零TH0setb tr0 ;//开启定时器0jnb p3.2,$ ;//等待高电平到来jb p3.2,$ ;//高电平到来,此时开始计数clr tr0 ;//高电平结束,停止计数mov a,th0 ;//读取th0 值,TL0忽略不计subb a,#12 ;//jc again ;//th0<12则转,即小于3.4ms,你可以算一下这个时间mov a,#14 ;//clr c ;//subb a,th0 ;//和14比较,如果TH0>14则大于3.8msjc again ;//大于3.8ms,从新再检测nextbit: ;//起始位找到了,然后下一位mov tl0,#0 ;//mov th0,#0 ;//setb tr0 ;//启动定时器jnb p3.2,$ ;//等待高电平jb p3.2,$ ;//高电平到来,此时开始计数clr tr0 ;//高电平结束,停止计数mov a,th0 ;//读取计数值,TL0忽略不计clr c ;//subb a,#8 ;//th0和8比较jc next ;;;;//若<2.2ms则转,再判断是否大于0.84msmov a,#10 ;//再跟10比较clr c ;//subb a,th0 ;//jc again ;;;;;;;//若>2.7ms,则放弃,从新检测mov a,keydata ;// 符合大于2.2ms 小于2.7ms,即为“1”setb c ;//C = 1rrc a ;//把1移位进Amov keydata,a ;//保存inc r7 ;//计数器加1cjne r7,#8,nextbit ;//是否满8位inc r6 ;//计数加1cjne r6,#2,last8 ;//是否满两字节sjmp seach ;//不满两字节,再新采集last8: ;//满1字节,再接下来第二字节mov keydata+1,a ;//把第一字节编码数据保存到31h里mov r7,#0 ;//计数器R7清零sjmp nextbit ;//继续采集数据next: ;//小于2.2ms时转到这里mov a,th0 ;//读取计数值TH0swap a ;//高4位与低4位对换mov r1,a ;//保存到R1anl tl0,#0f0h ;//取TL0高4位,低4位忽略不计mov a,tl0 ;//clr c ;//rrc a ;//rrc a ;//rrc a ;//add a,r1 ;//mov r1,a ;//subb a,#30 ;//以上几行是把TH0的低4位和TL0的高4位合并为1字节作为计数值jc nextbit ; //判断是否<0.84ms,是则放弃,继续采集mov a,r1 ;//否clr c ;//cjne a,#64,continue ;//跟64比较continue: ;//jnc nextbit ; //a>64表示采样值>1.11ms 放弃mov a,keydata ;//否则,符合位“0”clr c ;//C = 0rrc a ;//把零右移进Amov keydata,a ;//保存inc r7 ;//计数器加1cjne r7,#8,nextbit ;//是否满8位inc r6 ;//计数器加1cjne r6,#2,last_8 ;//是第一字节已经满sjmp seach ;//last_8: ;//如果为第二字节mov keydata+1,a ;//则保存第一字节到31hmov r7,#0 ;//清零R7sjmp nextbit ;//seach: ;//匹配按键编码mov r0,#-2 ;//按键编码字节个数计数器mov r1,#-1 ;//按键顺序计数器seach1: ;//inc r0 ;//seach2: ;//inc r0 ;//inc r1 ;//cjne r1,#29,compare ;//是否R1=29sjmp exit0 ;//compare: ;//开始匹配mov a,r0 ;//mov dptr,#keycode ;//地址指针指向码表首址movc a,@a+dptr ;//取码cjne a,keydata,seach1 ;//比较inc r0 ;//R0+1,再比较下一字节(每个按键编码为2字节)mov a,r0 ;//;mov dptr,#keycode ;//movc a,@a+dptr ;//比较cjne a,keydata+1,seach2 ;//是否匹配,不匹配则继续跟下一字节比较mov p1,r1 ;//如果匹配,把按键顺序号输出到p1send: ;//mov tmod,#20h ; //设置timer 1,mode 2mov tl1,#0fdh ;//设置定时器初值mov th1,#0fdh ;//mov scon,#01010000b;//以上设置,即设置串口波特率系数为:9600,8,1,0setb tr1 ;//启动定时器1loop_s: ;//mov sbuf,r1 ;//把R1(按键顺序号)输出到串口jnb ti,$ ;//等待是否发送完毕clr ti ;//发送完毕,清零TIexit0: ;//ljmp main ;//循环keycode: ;//每两字节代表一个按键的编码db 11111000b,00000000b, 11111100b,00000000b, 11111001b,11000000bdb 11111100b,11000000b, 11111010b,00000000b, 11111010b,00100000bdb 11111010b,01000000b, 11111010b,01100000b, 11111010b,10000000bdb 11111010b,10100000b, 11111010b,11000000b, 11111010b,11100000bdb 11111011b,00000000b, 11111011b,00100000b, 11111011b,01000000bdb 11111011b,01100000b, 11111111b,01100000b, 11111111b,10100000bdb 10001100b,10001110b, 10001101b,11101110b, 10001100b,10101110bdb 10001101b,11001110b, 11111000b,11100000b, 11111100b,10000000bdb 11111100b,01000000b, 11111001b,10100000b, 11111100b,10100000bdb 11111100b,01100000bend---------------------------------------------------------------------------------各种遥控器编码不同,如果你采用的是其他遥控器,修改几个参数即可(当然按键的编码表肯定不同了),即计数器的值不同,不过有的遥控器有机器码(机器码每个按键都是一样的),此时可以跳过机器码的采集。