这是一段把红外遥控接收后用数码管显示出来的程序,你参考一下吧。
程序已经通过编译了。
;遥控器读码程序(晶振为110592),该程序能读出遥控器的控制码,并通过LED显示出来
;OMEN 2005/1/16于TCL
;
A_BIT EQU 20H ;数码管个位数存放内存位置
B_BIT EQU 21H ;数码管十位数存放内存位置
NO_OUT EQU 24H ;最终控制号码存放单元
A_NO EQU 25H ;数码管个位数对应代码存放内存位置
B_NO EQU 26H ;数码管十位数对应代码存放内存位置
;22H,23H为控制码及其反码的存放单元
;<<主程序>>
ORG 0000H
AJMP 0030H
ORG 0003H ;外部中断P32脚INT0入口地址
AJMP INT ;转入外部中断服务子程序(解码程序)
ORG 0030H
AJMP MAIN ;转入主程序
;
MAIN: MOV NO_OUT,#0H
SETB EA ;打开CPU总中断请求
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
SETB EX0 ;打开INT0中断请求
LOOP: MOV A,NO_OUT;将按键的键值通过P1口的8个LED显示出来!
CPL A ;由于P1发光二极管显示的是电平的反状态,所以取反
MOV P1,A ;发光二极管显示输出
LCALL DISPLAY;LED数码管显示输出
AJMP LOOP;循环
;<<中断接受遥控程序>>
;以下为进入P32脚外部中断子程序,也就是解码程序
INT:
PUSH ACC
PUSH PSW ;将PSW和ACC推入堆栈保护
CLR EA ;暂时关闭CPU的所有中断请求
MOV R6,#10
SB: LCALL DL865;调用865微秒延时子程序
JB P32,EXIT;延时865微秒后判断P32脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB;重复10次,目的是检测在8650微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P32, $ ;等待高电平避开9毫秒低电平引导脉冲
LCALL DL4737 ;延时474毫秒避开45毫秒的结果码
MOV R7,#16;忽略前26位系统识别码
JJJJA:JNB P32,$;等待地址码第一位的高电平信号
LCALL DL865;高电平开始后用865微秒的时间尺去判断信号此时的高低电平状态
MOV C,P32;将P32引脚此时的电平状态0或1存入C中
JNC UUUA;如果为0就跳转到UUUA
LCALL DL1000;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUUA: DJNZ R7,JJJJA
MOV R1,#22H ;设定22H为起始RAM区
MOV R2,#2;接收从22H到23H的2个内存,用于存放 *** 作码和 *** 作反码
PP: MOV R3,#8;每组数据为8位
JJJJ: JNB P32,$;等待地址码第一位的高电平信号
LCALL DL865;高电平开始后用865微秒的时间尺去判断信号此时的高低电平状态
MOV C,P32;将P32引脚此时的电平状态0或1存入C中
JNC UUU;如果为0就跳转到UUU
LCALL DL1000;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUU: MOV A,@R1;将R1中地址的给A
RRC A;将C中的值0或1移入A中的最低位
MOV @R1,A;将A中的数暂时存放在R1数值的内存中
DJNZ R3,JJJJ;接收满8位换一个内存
INC R1;对R1中的值加1,换下一个RAM
DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在22H/23H中
MOV A,22H
CPL A;对22H取反后和23H比较
CJNE A,23H,EXIT;如果不等表示接收数据发生错误,放弃
MOV A,22H
MOV NO_OUT,A
;LCALL EEPROM_C ;清除以前的保存的码
;LCALL DL4737
;LCALL EEPROM_W ;把码存在单片机内部的EEPROM里
;LCALL DL4737
CLR P36;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
LCALL DL4737
LCALL DL4737
LCALL DL4737
SETB P36;蜂鸣器停止
lcall DL4737
EXIT: SETB EA ;允许中断
POP PSW
POP ACC ;将PSW和ACC推入堆栈保护
RETI ;退出解码子程序
;<<LED数码管显示子程序>>
DISPLAY:
MOV A,NO_OUT ;将NO_OUT分成个位和16位
ANL A,#0FH ;取低四位放在a_bit
MOV A_BIT,A ;个位
MOV A,NO_OUT ;
RR A
RR A
RR A
RR A ;四次移动,把高四位移到低四位
ANL A,#0FH;取高四位放在B_bit
MOV B_BIT,A ;个位在b
MOV DPTR,#NUMTAB ;指定查表启始地址
MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV A_NO,A
MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV B_NO,A
DPLOP:MOV A,A_NO
MOV P0,A ;送出个位的7段代码
;SETB P21;关闭十位显示,防止鬼影
CLR P20 ;开个位显示
LCALL DL40 ;显示4737微秒
SETB P20;关闭个位显示,防止鬼影
MOV A,B_NO
MOV P0,A ;送出十位的7段代码
CLR P21 ;开十位显示
LCALL DL40 ;显示4737微秒
SETB P21;关闭十位显示,防止鬼影
RET
;<<延时程序>>
DL865: MOV R4,#12 ; 109(2R5+4)R4+2延时子程序1,精确延时865微秒
D1: MOV R5,#31
DJNZ R5,$
DJNZ R4,D1
RET
DL4737: MOV R4,#12 ;延时子程序2,精确延时4737微秒
D2: MOV R5,#179
DJNZ R5,$
DJNZ R4,D2
RET
DL1000: MOV R4,#17;延时程序3,精确延时1000微秒
D3: MOV R5,#25
DJNZ R5,$
DJNZ R4,D3
RET
DL40: MOV R4,#1;延时程序4,精确延时40/17微秒
D4: MOV R5,#1
DJNZ R5,$
DJNZ R4,D4
RET
;
;如果是共阳数码管的显示代码 1-F 16个代码
NUMTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH ;STC新板的
END
这是我参考别人的代码适当修改后,测试可用。
注意:与NEC协议中说明的高低电平是反转的
程序采用计时器,当下降沿到来时,进入外部中断程序interrup 2中,计时器装入值清0,即从0计数到下一个下降沿到来,得到的计数值就是一个“低电平+高电平”的时间,对时间进行判断就可以区分是引导码,数据1或0,还是重复码
没有做抗干扰
#include "reg52h"
sbit ir=P3^3; //红外接收IO口
unsigned char duan,wei,flag,jc,jc1;
unsigned int m,Tc; //12M晶振
#define tmin 13220 //协议中高电平560us平分,提高容限
#define tmax 13780 // 9+45=135 + -280:1322~1378
#define thh 2530 //数据1
#define thl 1970 //225ms 不能大于 重复码9+225=1125 1097~1153
#define tlh 1400 //数据0
#define tll 840 // 112ms
unsigned char dat[4]={0,0,0,0};//接收32为地址和命令码
//数码管显示表
unsigned char code tableduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code tablewei[]= {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void display();
void main()
{
ir=1;//开外部中断INT1
m=0;
EA=1;
EX1=1;
IT1=1;
ET0=0;//启动定时器0,只做计数不开启中断
TMOD=0x01;
TH0=0;
TL0=0;
TR0=1;
while(1)
{//---只显示了命令码,地址码可自行加入----
duan=flag/16;//得到命令码高4位,16进制显示
wei=6;
display();
duan=flag%16;//低4位
wei=7;
display();
duan=jc%16;//显示引导码获得次数、判断是否检测到引导
wei=0; //码,调试用
display();
duan=jc1%16;//显示接收到数据“1”次数,低四位的数据
wei=1;
display();
}
}
void display()
{
unsigned char i=100;
P2=tableduan[duan];//P2口输出数码管段选数据
P1=tablewei[wei]; //P1的P10~P12 3个IO实现8数码管位选控制
while(i--);
}
void int0() interrupt 2
{
Tc=TH0256+TL0;//得到一个低电平+高电平时序计时值
TH0=0;
TL0=0;//继续下一个计时
if((Tc>tmin)&&(Tc<tmax))
{
m=0;//检测到引导码
jc++; //不用管清零,加满后自动归0
}
if(m<32)
{
if((Tc>thl)&&(Tc<thh))//取码
{
dat[m/8]=(dat[m/8]>>1)|0x80;
m++;
jc1++;
}
else if((Tc>tll) && (Tc<tlh))
{
dat[m/8]=(dat[m/8])>>1;
m++;
}
}
else m=0;//在没接收到引导码的情况下清0,调试用
if(dat[2]==~dat[3])//判断数据是否正确,正确就取出
flag=dat[2];//取码完成后判断读码是否正确
}
C51
#include <stc12c5a60s2h>
sbit P3_2=P3^2;
sbit P2_0=P2^0; //P20接一个LED用于指示,led正极接单片机
void main()
{
while(1)
{
if(P3_2)
{
P2_0=0; //未对准,led灭
}
else
{
P2_0=1; //对准,led亮
}
}
}
整个单片机就干这么一个活,太浪费了。
如果还有其他的要执行,就用外部中断,下降沿触发。
Find X6是一款OPPO的手机,它支持红外线功能。要打开Find X6的红外功能,您可以按照以下步骤进行 *** 作:
1 打开Find X6的控制中心。可以通过从屏幕顶部向下滑动来访问控制中心。
2 在控制中心中查找“红外”选项。如果在默认的控制中心中没有找到此选项,则可以单击“自定义”按钮,然后添加“红外”选项。
3 单击“红外”选项,打开红外功能。
4 如果您之前的 *** 作没有起作用,您也可以尝试在设置中打开红外功能。打开设置应用程序,在“设备”或“连接和共享”选项卡中查找“红外”选项。在该选项下,您可以启用或禁用红外功能。
请注意,使用红外功能需要您的手机与其他设备有相应的互通性,因此请确保您要控制的设备也支持红外线功能。希望这些步骤能够帮助您打开Find X6的红外功能。
1
使用L298N芯片驱动直流电机控制小车车轮,直流电机转速使用PWM控制,PWM不懂可以百度。
2
单片机可以通过控制L298N芯片的引脚高低电平控制车轮转或者不转,左轮转
右轮不转,这就是右转弯啦。这样一个思路就可以让小车前进后退左转右转,PWM可以让小车加速或者减速。
3
步进机一般不拿来当车轮的,自动开关窗帘这方面更适合步进机。拿来控制车轮跑得太慢了。直流电机更灵活一点。控制PWM值一样可以让小车转到你想要的角度。
“发射部分,编码的信号可以发生过来,且在接受部分的接收管脚可以用数字示波器看到发射过来的波形正常。 ”
接收的信号需要进行放大处理,然后才能检测到高低电平的变化。否则只能在示波器上看到,模拟电路中却起不到作用,单片机也检测不到。
另外,要将单片机检测引脚至1,来检测外部信号变化(设置检测低电平),否则检测比较难以实现。
以上就是关于红外遥控解码程序全部的内容,包括:红外遥控解码程序、谁能介绍一下红外线解码c51遥控程序、红单片机红外对管程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)