导航:首页 > 操作系统 > 单片机红外识别数字

单片机红外识别数字

发布时间:2022-11-22 00:22:34

1. 单片机c语言编写红外遥控控制小车,按下数字2,小车启动前进,怎么写

红外遥控小车,关键是小车上要有一个红外接收头,接收红外遥控器发送的红外信号。按下数字2,是单片机板上的按键吧,这首先必须要对所用按键编码,小车接收后再解码,这样小车才能识别按键。至于小车启动,就发送数字2的编码即可。下图是红外接收头。

2. 知道了红外遥控的编码(16位1101 0011 1001 0010)请问怎样在单片机里解码

;遥控器读码程序(晶振为11.0592),该程序能读出遥控器的控制码,并通过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 ;外部中断P3.2脚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;循环
;********************<<中断接受遥控程序>>************************
;以下为进入P3.2脚外部中断子程序,也就是解码程序
INT:
PUSH ACC
PUSH PSW ;将PSW和ACC推入堆栈保护
CLR EA ;暂时关闭CPU的所有中断请求
MOV R6,#10
SB: LCALL DL865;调用865微秒延时子程序
JB P3.2,EXIT;延时865微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB;重复10次,目的是检测在8650微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
LCALL DL4737 ;延时4.74毫秒避开4.5毫秒的结果码
MOV R7,#16;忽略前26位系统识别码

JJJJA:JNB P3.2,$;等待地址码第一位的高电平信号
LCALL DL865;高电平开始后用865微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2;将P3.2引脚此时的电平状态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 P3.2,$;等待地址码第一位的高电平信号
LCALL DL865;高电平开始后用865微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2;将P3.2引脚此时的电平状态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 P3.6;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
LCALL DL4737
LCALL DL4737
LCALL DL4737
SETB P3.6;蜂鸣器停止
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 P2.1;关闭十位显示,防止鬼影
CLR P2.0 ;开个位显示
LCALL DL40 ;显示4737微秒
SETB P2.0;关闭个位显示,防止鬼影
MOV A,B_NO
MOV P0,A ;送出十位的7段代码
CLR P2.1 ;开十位显示
LCALL DL40 ;显示4737微秒
SETB P2.1;关闭十位显示,防止鬼影
RET
;**********************<<延时程序>>******************************
DL865: MOV R4,#12 ; 1.09*(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

3. 51单片机怎么用红外线

--你是指红外遥控解码吧,给你一点提示,在单片机定义一个I/O口为红外遥控的输入端口,(红外遥控解码不一定要用到定时器和中断方式.具体方法有很多的,看场合选取)当然输入这个端口的信号是经过遥控接收电路处理过的一串数据,如TTL或者CMOS电平。再然后就是对这个输入信号进行处理,也就是解调出遥控码值出来,要解这个码,首先又要知道其波形如何,即是逻辑电平和时序等问题...

建议你还是先熟知一下各种IR的遥控协议,有挺多的,典型的有NEC,飞利浦等。说说NEC的也有两种,简单的一种就是有32位数据,前16bit为地址码,后16bit为遥控码值的正码与反码,地址码用于区分相同协议下不同的遥控所带来的干扰等,正码和反码用于解调后进行校验数据。不多说了,主要是找点相关资料研究研究就明白了。图片是一个32bitNEC的遥控波形,这个波形的地址码是807F,正码是0x12,如果看懂了,用MCU解遥控码就很容易了..

4. 如何用单片机探测到红外感应信号

如果仅仅是判断有无信号,设置一个阈值,超过阈值输出1[或0],此时用比较器即可;热释电传感器输出的信号实际上是连续变化的,也可以用单片机的ADC采样进行数据采集后再处理.取决于你的用法.

5. 单片机红外遥控问题,要求:一个单片机发送数字另一个单片机也要能显示出相应的数字

呵呵,我刚前几天刚编好的程序,你的图片太小了,看不清楚

只要单片机原理图没用(你这个只是接受用的期间,没有发射的器件),你的红外芯片是什么型号的,要不怎么知道它的协议是什么~~~

它的时序还是有要求的,也就是红外芯片(也就是你要发射的红外线的芯片),它的型号不一样,那么它的协议就不一样,你先看看你红外发射芯片的型号,找到datasheet,然后就是找到协议,我这可以给你提供方法,把程序贴出来吧,你自己看看吧

#include"reg52.h"

#include"MacroAndConst.h"

#include"Foot.h"

#include"Delay.h"

#include"intrins.h"

ucharnum;

ucharkey_code=0; //遥控键值

ucharnew_code=0; //有无新按键

uinttemp_key_code=0; //键值暂存

ucharkey_bit_count=0; //键值码脉冲计数

uintcount=0; //定时中断次数计数

uinttemp_count=0; //定时中断计数暂存

ucharcommon_code_count=0; //前导码脉冲计数

ucharir_flag=0; //脉冲接收器所处的状态,0:无信号,1:系统码接收区,2:数据码接收区

//初始化

voidinter_init()

{

ir=1; //红外端口写1

TMOD=0X02; //定时器0,模式2,8位自动重装

TH0=(256-50)/256; //定时50us

TL0=TH0;

ET0=1; //允许定时器0中断

IT1=1; //INT1下降沿触发

ET1=1; //允许外部中断

EA=1; //开总中断

}

//定时器中断

voidtimer0() interrupt1

{

count++; //定时器中断次数累加

}

//外部中断,红外解码程序

voidint1() interrupt2

{

TR0=1;

if(count>12&&count<270) //如果信号合法,则放入buf_count,count清0,对下一个脉冲信号计时

{

temp_count=count;

count=0;

}

delay_10us(10); //延时100us来消除下降沿跳变抖动

if(ir==0) //INT1引脚稳定为低电平,则表明确实是信号,count重新计数,由于上面延时50us,因此要补偿一次T0中断

{

count=2;

}

if(temp_count>12&&temp_count<270) //若收到信号合法,则再次进行信号分析

{

if(ir_flag==0) //如果之前未收到起始码

{

if(temp_count>21&&temp_count<270) //判断是否起始码13.5

{

ir_flag=1; //系统标记

temp_count=0;

}

}

elseif(ir_flag==1) //收到起始码

{

if(common_code_count>=26) //若收到26个脉冲

{

ir_flag=2; //数据解码标志

common_code_count=0; //系统码计算清0

temp_count=0; //中断计数暂存清0

}

elseif((temp_count>40&&temp_count<70)||(temp_count>12&&temp_count<32))

{

temp_count=0;

common_code_count++; //每收到一个信号自加1

}

}

elseif(ir_flag==2) //进入数据编码接收

{

if(key_bit_count<8) //收到数据少于8位,则将收到的数据写入buf_key_code

{

if(temp_count>40&&temp_count<70)

{

temp_count=0;

temp_key_code>>=1;

temp_key_code|=0x80; //收到1

key_bit_count++; //数据脉冲累加

}

elseif(temp_count>12&&temp_count<32)

{

temp_count=0;

temp_key_code>>=1; //收到0

key_bit_count++;

}

}

else //若收到8位数据则做以下处理

{

ir_flag=0; //接收状态返回到空闲

key_code=temp_key_code;

key_bit_count=0;

temp_key_code=0;

temp_count=0;

TR0=0;

new_code=1;

}

}

}

}

好好看看吧,使用的定时计数器,挺简单的,重点在于协议,明白了协议就哦了

呵呵,记得给分啊~~

(*^__^*)嘻嘻……

6. 最简单51单片机红外编码获取问题

这有个帖子,你看了就明白,看看是怎样实现输入晶振频率自适应解码。
#define CPU_Fosc 12000000L //输入主频,自适应解码(单位:Hz,范围:6MHz ~ 40MHz)

红外线解码程序+遥控器程序+仿真文件(可定义任意I/O作接收脚,支持长/短按,适应6MHz~40MHz)
http://www.ourdev.cn/thread-5155483-1-1.html

7. 单片机 红外解码

红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、
成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷
纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且
能有效地隔离电气干扰。
1 红外遥控系统
通用红外遥控系统由发射和接收两大部分组成。应用编/解码专用集成电路芯片来进行控制操作,如图1 所示。
发射部分包括键盘矩阵、编码调制、LED 红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
遥控发射器及其编码
遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类
来加以说明,现以日本NEC 的uPD6121G 组成发射电路为例说明编码原理(一般家庭用的DVD、VCD、音响都使用
这种编码方式)。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下
特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉
宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”.
上述“0”和“1”组成的32 位二进制码经38kHz 的载频进行二次调制以提高发射效率,达到降低电源功耗的
目的。然后再通过红外发射二极管产生红外线向空间发射
UPD6121G 产生的遥控编码是连续的32 位二进制码组,其中前16 位为用户识别码,能区别不同的电器设备,
防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16 位为8 位操作码(功能码)及其
反码。UPD6121G 最多额128 种不同组合的编码。
遥控器在按键按下后,周期性地发出同一种32 位二进制码,周期约为108ms。一组码本身的持续时间随它包
含的二进制“0”和“1”的个数不同而不同,大约在45~63ms 之间.
2 遥控发射器及其编码
遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类
来加以说明,现以日本NEC 的uPD6121G 组成发射电路为例说明编码原理(一般家庭用的DVD、VCD、音响都使用
这种编码方式)。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下
特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉
宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”

上述“0”和“1”组成的32 位二进制码经38kHz 的载频进行二次调制以提高发射效率,达到降低电源功耗的
目的。然后再通过红外发射二极管产生红外线向空间发射。

UPD6121G 产生的遥控编码是连续的32 位二进制码组,其中前16 位为用户识别码,能区别不同的电器设备,
防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H;后16 位为8 位操作码(功能码)及其
反码。UPD6121G 最多额128 种不同组合的编码。
遥控器在按键按下后,周期性地发出同一种32 位二进制码,周期约为108ms。一组码本身的持续时间随它包
含的二进制“0”和“1”的个数不同而不同,大约在45~63ms 之间。
遥控信号接收
接收电路可以使用一种集红外线接收和放大于一体的一体化红外线接收器,不需要任何外接元件,就能完成
从红外线接收到输出与TTL 电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外
线遥控和红外线数据传输。
接收器对外只有3 个引脚:Out、GND、Vcc 与单片机接口非常方便

① 脉冲信号输出接,直接接单片机的IO 口。
② GND 接系统的地线(0V);
③ Vcc 接系统的电源正极(+5V);

8. 求救!!! 求51单片机用1602液晶显示红外解码的方法!!!要在液晶上显示遥控器对应的数字!!

你的意思是,遥控器按下什么数字,液晶就显示什么数字??
首先你得将遥控器上的红外波形记录下来存在单片机EEPROM里,即单片机判断并存储红外一体化接收头的高低波形的时长。
然后将接收到的波形的个高低电平的时长参数和已存储的波形数据进行比较,即可知现在是什么键按下了

9. 单片机红外编码

C51程序代码:
#include <AT89X51.h>
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标志
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
void SendIRdata(char p_irdata);
void delay();
void main(void)
{
count = 0;
flag = 0;
OP = 0;
P3_4 = 0;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许

TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
iraddr1=3;
iraddr2=252;

do{
delay();
SendIRdata(12);
}while(1);
}
//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
P3_4 = OP;
}

void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//发送9ms的起始码
endcount=223;
flag=1;
count=0;
do{}while(count<endcount);
//发送4.5ms的结果码
endcount=117
flag=0;
count=0;
do{}while(count<endcount);
//发送十六位地址的前八位
irdata=iraddr1;
for(i=0;i<8;i++)
{
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
//停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
{
endcount=41; //1为宽的高电平
}
else
{
endcount=15; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送十六位地址的后八位
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据的反码
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay()
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<100;j++)
{
}
}
}

10. 使用红外接收装置VS1383B, 如何连入单片机 通过单片机来识别信号(信号源为940nm的红外,波形如下)。

不同的遥控器输出的信号是不同的,一般都有由: 引导头 8位系统码 8 位用户码 8位系统码反码 8 位用户码反码组成, 系统码区别不同的遥控器,用户码区别不同的按键
并且不同的遥控器引导码是不同的,并且代表0和1的高低电平时间不同的,只有知道这些基本数据后,才可用单片机解码,如果用示波器把这些波型记录下来,人工就不能分析,你怎么编程序让单片机来识别呢?知道这些基本数据后把VS1383B的输出接入单片机的IO引脚(一般是中断引脚),单片机根据高低电平的持续时间可以识别出0和1,进而解析出用户码和系统码,再根据需要执行不同的动作

阅读全文

与单片机红外识别数字相关的资料

热点内容
dvd光盘存储汉子算法 浏览:757
苹果邮件无法连接服务器地址 浏览:962
phpffmpeg转码 浏览:671
长沙好玩的解压项目 浏览:144
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:737
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:484
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:381
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:349
风翼app为什么进不去了 浏览:778
im4java压缩图片 浏览:362
数据查询网站源码 浏览:150
伊克塞尔文档怎么进行加密 浏览:892
app转账是什么 浏览:163