用C语言编写的红外发射与接收程序

用C语言编写的红外发射与接收程序,第1张

给你一段430单片机遥控器解码的程序吧,也就是接收部分

毕竟世界太现实只能这么帮你

#ifndef _IR_

#define _IR_

char t0,t1,t2;

uchar IR;

void DelayIR()

{

uint i=130;

while(i--);

}

void init_port2(void)

{

P2DIR&=~BIT0;

P2SEL&=~BIT0;

P2IES|=BIT0;

P2IE|=BIT0;

}

#pragma vector=PORT2_VECTOR

__interrupt void PORT2_ISR(void)

{

char CounterIR;

P2IES&=~BIT0;

if(P2IFG&BIT0)

{

P2IFG&=~BIT0;

}

CounterIR=0;

while(!(P2IN&BIT0))

{

DelayIR();

CounterIR++;

}

if(CounterIR>85)

{

if(CounterIR<95)

{

t1++;

for(char k=0;k<17;k++)

{

CounterIR=0;

while((P2IN&BIT0)&&(CounterIR<50))

{

DelayIR();

CounterIR++;

}

CounterIR=0;

while((!(P2IN&BIT0))&&(CounterIR<10))

{

DelayIR();

CounterIR++;

}

}

for(char j=0;j<8;j++)

{

CounterIR=0;

while((P2IN&BIT0)&&(CounterIR<25))

{

DelayIR();

CounterIR++;

}

IR<<=1;

if(CounterIR>11)

IR|=BIT0;

CounterIR=0;

while((!(P2IN&BIT0))&&(CounterIR<10))

{

DelayIR();

CounterIR++;

}

}

if((IR!=0xff)&&(IR!=0x00))

{

if(!(flag&dataflag))

{

if(IR==0x22)

{

flag|=runflag;

}

else

{

Tar[0]=Tar[1];

Tar[1]=Tar[2];

Tar[2]=Tar[3];

Tar[3]=Tar[4];

switch (IR)

{

//case 0x22 : flag|=runflag;break;

case 0x68 : Tar[4]=0;flag|=dataflag;break;

case 0x30 : Tar[4]=1;flag|=dataflag;break;

case 0x18 : Tar[4]=2;flag|=dataflag;t2++;break;

case 0x7a : Tar[4]=3;flag|=dataflag;break;

case 0x10 : Tar[4]=4;flag|=dataflag;break;

case 0x38 : Tar[4]=5;flag|=dataflag;break;

case 0x5a : Tar[4]=6;flag|=dataflag;break;

case 0x42 : Tar[4]=7;flag|=dataflag;break;

case 0x4a : Tar[4]=8;flag|=dataflag;break;

case 0x52 : Tar[4]=9;flag|=dataflag;break;

default : break;

}

}

}

}

IR=0;

}

}

for(int m=0;m<250;m++)

DelayIR();

P2IES|=BIT0;

}

#endif

请采纳。

红外线NEC解码程序 + 仿真文件

(可定义任意I/O作接收脚,支持长/短按,自适应主频6MHz~40MHz)

>

你好,我来为你解答:

摘要:本文介绍了一种用MCS-51系列单片机AT89C52代替专用遥控芯片的设计方案,通过软件模拟实现了电视机遥控编码的发射,并且达到“一器多用”。

关键词:全码;简码;引导码;系统码;数据

引言

上世纪八十年代初,日本率先在电视产品中使用了红外遥控技术,目前已经在电视机上得到了广泛应用。电视遥控器使用的是专用集成发射芯片来实现遥控码的发射,如东芝TC9012,飞利浦SAA3010T等。这些芯片价格较贵,且相互之间采用的遥控编码格式互不兼容,所以各机型的遥控器通常只能针对各自的遥控对象而无法通用。本文在试验验证的基础上,介绍了如何利用低成本的MCS-51系列单片机来实现遥控码的模拟发射,并实现遥控器的通用化。

遥控发射技术的基本原理

图1 NEC标准下的主码表示

图2 NEC标准下,数据0和1的表示

图3 PHILIPS标准下的全码表示

图4 硬件原理图

通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在32~56KHz范围内的载波上,然后经放大、驱动红外发射管将信号发射出去。

不同公司的遥控芯片,采用的遥控码格式也不一样。在此介绍较普遍的两种,一种是NEC标准,一种是PHILIPS 标准。

NEC标准:遥控载波的频率为38KHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。简码重复延时108ms,每两个引导脉冲上升沿之间的间隔都是108ms。一个完整的全码如图1所示。 其中,引导码高电平45ms,低电平45ms;系统码8位,数据码8位,共32位;数据0用“高电平05625ms+低电平05625ms”表示,数据1用“高电平05625ms+低电平16875ms”表示,如图2所示:一个简码=引导码+系统码位0的反码+结束位(05625ms)高电平。

各部分码的作用:引导码用来通知接收器其后为遥控数据。系统码用来区分是哪一机型的数据,接收端依此来判断后续的数据是否为须执行的指令。数据码用来区分是哪一个键被按下,接收端根据数据码做出应该执行什么动作的判断。简码是在持续按键时发送的码。它告知接收端,某键是在被连续地按着。

遥控数据传输系统的关键是数据传输的可靠性。为了提高编码的可靠性,NEC标准规定系统码、数据码后分别接着传送一个同样的码或者反码,供误码校验用。

PHILIPS标准:载波频率为38KHz;没有简码,点按键时,控制码在1和0之间切换,若持续按键,则控制码不变。一个全码=起始码‘11’+控制码+系统码+数据码,如图3所示。

数据0用“低电平1778ms+高电平1778ms”表示;数据1用“高电平1778ms+低电平1778ms”表示。 连续码重复延时114ms。

硬件原理图

图4为硬件原理图,电路主要由三大部分组成:AT89C52及其外围电路部分;8×8键矩阵部分;及直流电源部分。

AT89C52单片机及其外围电路组成的控制和遥控码产生部分:主要有外中断信号处理、12M时钟、CPU复位、I/O口上拉电路、红外遥控发射、按键指示等。由P0口和P2口搭成按键矩阵,当有键按下时,产生的外中断请求信号(低电平有效)经八输入与非门和非门后送至P32端,使CPU进入中断处理,同时点亮按键指示灯。系统产生的遥控编码信号通过P14端发出,经放大后驱动发射管发射出去。拨码开关DIP的作用是进行不同机芯状态的切换。比如当DIP设置为“1000”时,系统处于长虹CH-10机芯状态;为“1001”时,则处于CN-12机芯状态。R13、C11和按键KEY组成单片机复位电路。

8×8键矩阵部分:由64只键盘开关排列而成,可以根据需要,选择合适的按键数。 88键是不增加扩展器件的情况下最多的按键数。

整个系统的工作电源为直流+5V。由电源模块IC31 (PS0500DS)、整流桥HBA、HBK等组成。

程序实现

NEC编码程序用MCS-51系列单片机汇编语言编写而成,PHILIPS编码可以此类推。

NEC、TOSHIBA、SAMSONG公司的编码格式有其共通之处:遥控全码都由“引导码+系统码+系统码(或系统码取反)+数据码+数据码取反”组成;数据“0”和“1”的定义相同;不同的只是引导码高低电平的持续时间不同,系统码位数有长有短,第一个简码和全码最后一位之间的延时不同,简码的引导脉冲不同等;所以可以把相同的部分做成通用子程序,包括产生数据“0”和“1”的子程序“ONE”和“ZERO”,9ms、45ms、225ms、22ms、45ms等时间控制子程序。

8×8的键矩阵处理,采用外中断的方式,有键按下时,就向CPU发出中断请求,然后按照“先列后排”一个个扫描,从而找出被按下的键,当然这里面还包括了去抖动、多键同时按时只处理一键的处理部分。

机芯的不同状态由单片机P3口的P35、P34、P31、P30四位的输入数值来区分判断,比如“0000”表示工作于东芝TC90××系列状态,“0001”则表示要求工作于NEC公司的PD61××系列状态。

判断了是哪一只键按下以及处于机芯的哪种状态以后,程序就严格按照相应的遥控编码方式来进行遥控码的发射,也就是说将一定时段、一定数值的电平脉冲调制在38KHz载波上,逐一发射出去。

流程图如图5所示

图5 程序流程图

部分程序段:

这里给出的是产生NEC遥控码的主要部分,而像键扫描等较常见的程序段就不再提供

主程序初始化部分:

ORG 100H

main: mov psw,#0 ;

mov sp,#30h ;设置堆栈

mov tmod,#02h ;方式2定时

mov th0,#0f3h ;38KHZ方波时间数

mov p2,#0 ;

mov p0,#0ffh

setb ex0 ;允许外中断0

setb pt0 ;外中断0(有键按下)优先

clr it0 ;电平触发方式

clr mdl ;设有无按键的标志

setb p32 ;

setb p34

setb p35

setb p31

setb p30 ;置P30~P35为输入状态

clr c ;清进位标志位

clr p14 ;清遥控输出端

clr a ;清累加器A

mov KEYHAO,#0H ; 清按键号存储器

xrl a,#11000000b ;0000(p35 p34 p31 p30)

jz TV1

mov a,r7

xrl a,#11000001b ;0001

jz TV2

mov a,r7

xrl a,#11000010b ;0010

jz VCD

mov a,r7

……

SET ETO

SET EA ;开中断

pp:jnb mdl,pp ;循环等待按键

clr mdl ;

CLR KEYHAO

sjmp pp……

‘0’子程序和‘1’子程序部分:ZERO: CLR A

SETB TR0 ;启动定时器0#

CJNZ A,#39,$ ;05625ms高电平

CLR TR0 ;停定时器0#

ACALL DE05625 ;沿时05625ms

CLR A

RET

ONE: CLR A

SETB TR0 ;启动定时器0#

CJNE A,#39,$ ;05625ms高电平

CLR TR0 ;停定时器0#

ACALL DE16875 ;沿时16875ms

RET

结语

本文介绍了AT89C52单片机代替专用遥控芯片设计通用型电视遥控器,该方案具有结构简单、成本低等优点,用本文介绍的方法进行单片机遥控信号模拟,可以作出一款自己家的通用遥控器。

推荐你使用 VUI模块 v280 。使用改进型 ld3320芯片开发的标准模块。可以支持安静环境最远8米,或者支持超级嘈杂的会场的语音识别。

V280流程编辑器功能强大,只需要在PC机上设置汉字或者拼音串的命令就可以实现语音识别功能。有IO输输出,识别结果可以通过如下方式输出:

IO输出: 8个IO输出

Uart输出:支持Uart输出(输出内容完全由编辑器来输入决定)

SPI输出: 支持一线SPI输出和4线SPI输出

红外协议之NEC协议

NEC协议载波:38khz

其逻辑1与逻辑0的表示如图所示:

逻辑1为225ms,脉冲时间560us;逻辑0为112ms,脉冲时间560us。所以我们根据脉冲时间长短来解码。推荐载波占空比为1/3至1/4。

NEC协议格式:

首次发送的是9ms的高电平脉冲,其后是45ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit

的命令码(也是从低有效位开始发),而后也是8bit 的命令码的反码。

以上是一个正常的序列,但可能存在一种情况:你一直按着1个键,这样的话发送的是以110ms为周期的重复码,如下图:

就是说,发了一次命令码之后,不会再发送命令码,而是每隔110ms时间,发送一段重复码。

重复码由9ms高电平和225ms的低电平以及560us的高电平组成。

需要注意的是:1838红外一体接收头为了提高接受灵敏度。输入高电平,其输出的是相反的低电平。

NEC解码出来还是有点细微差错。查了很久,也没有收获。心里有点小郁闷。今早起来,仔细地看了看他人的参考代码。突然被下面一个小小的细节折服了。

请注意这段代码:

1 void hal_NEC_decode(uchar addr,uchar addrt,uchar comm,uchar commt)

2 {

3     uchar i,j,k;

4     uchar tmp1=0;

5

6     while(NECFinshFlag==0);

7     NECFinshFlag=0;

8

9     for(i=0,k=1;i<4;i=i+1)

10     {

11         for(j=1;j<=8;j++)

12         {

13             if(NECTimerTable[k++] > 7)

14             {

15                 tmp1 |=0x80;

16             }

17             tmp1 >>=1;

18         }

19         switch(i)

20         {

21             case 0:addr=tmp1;break;

22             case 1:addrt=tmp1;break;

23             case 2:comm=tmp1;break;

24             case 3:commt=tmp1;break;

25         }

26         tmp1=0;

27     }

28 }

以上就是关于用C语言编写的红外发射与接收程序全部的内容,包括:用C语言编写的红外发射与接收程序、请问下谁有红外6122格式的51解码程序谢谢、有一个4路学习型的遥控开关的源程序,只有UPD6121和TC9012的格式可学习,但SAA3010和M50560的格式则无效等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10142539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存