串行通讯与红外解码


串行通信接口标准
RS-232C接口 RS-232C是EIA(美国电子工业协会)1969年修订 RS-232C标准。RS-232C定义了数据终端设备(DTE) 与数据通信设备(DCE)之间的物理接口标准。 (1)、机械特性 RS-232C接口规定使用9针连接器,连接器的尺寸 及每个插针的排列位置都有明确的定义。(阳头)
串行口控制寄存器SCON 用于定义串行口的工作方式及实施接收和发送控制。 字节地址为98H,其各位定义如下所示。
SM2:多机通信控制位。在方式0时,SM2一定要等于0。在方式1中,当 (SM2)=1则只有接收到有效停止位时,RI才置一。在方式2或方式3中,当 (SM2)=1且接收到得第9位数据RB8=0时,RI才置1;
例:在串口方式1,波特率为9600bps,系统晶振频率为 11.0592MHz时,求TL1和TH1中装入的数值是多少?
解:设所求数为X,则定时器每计256-X溢出一次,每计一个 数的时间为一个机器周期,一个机器周期=12个时钟周期。所 以计算一个数的时间为为12/11.0592MHz(s)。 那么溢出一次的时间为[256-x]*12/11.0592,T1的溢出率就是他的 倒数,方式1的波特率=2^SMOD/32*(定时器T1溢出率) 。取 SMOD=0,即2^SMOD=1。代入公式, 9600=2^SMOD/32*(定 时器T1溢出率) 解得X=253,即0xfd 。
发送 发送 接收 接收
时间2 时间1
接收 发送
发送 接收
接收 发送
单工
半双工
全双工
演示··· ···
8051串行接口是一个可编程的全双工串行通讯接口。 它可用作异步通讯方式(UART),与串行传送信息的 外部设备相连接,或用于通过标准异步通信协议进行 全双工的8051多机系统,也可以通过同步方式,使 用TTL或CMOS移位寄存器来扩充I/O口。
异步通信的数据格式 :
一个字符帧 空 闲 起 始 位 数据位 校 验 位 停 止 位 空 闲
下一字符 起始位
LSB
MSB
异步通信的特点:不要求收发双方时钟的 严格一致,实现容易,设备开销较小,但 每个字符要附加2~3位用于起止位,各帧 之间还有间隔,因此传输效率不高。
2、同步通信
同步通信时要建立发送方时钟对接收方时钟的直接控制, 使双方达到完全同步。此时,传输数据的位之间的距离均 为“位间隔”的整数倍,同时传送的字符间不留间隙,即 保持位同步关系,也保持字符同步关系。发送方对接收方 的同步可以通过两种方法实现。
8051单片机通过引脚RXD(P3.0,串行数据接收端) 和引脚TXD(P3.1,串行数据发送端)与外界通讯。 SBUF是串行口缓冲寄存器,包括发送寄存器和接收 寄存器。它们有相同名字和地址空间,但不会出现冲 突,因为一个只能被CPU读出数据,一个只能被 CPU写入数据。
1、串行口的控制与状态寄存器
(定时器工作方式2:TLX溢出后自动读取THX的值,不用重装 )
常用波特率初值表
串行口工作之前,应对其进行初始化,主 要是设置产生波特率的定时器1、串行口控 制和中断控制。具体步骤如下:
确定T1的工作方式(编程TMOD寄存器); 计算T1的初值,装载TH1、TL1; 启动T1(编程TCON中的TR1位); 确定串行口控制(编程SCON寄存器);
0 1 1 0 1
数据 时钟
计 算 机 甲
时钟
计 算 机 乙
计 算 机 甲
数据
0 1 1 0 1
数据+时钟
计 算 机 乙
外同步
自同步
二、串行通信的传输方向
1、单工 单工是指数据传输仅能沿一个方向,不能实现反向传输。 2、半双工 半双工是指数据传输可以沿两个方向,但需要分时进行。 3、全双工 全双工是指数据可以同时进行双向传输。
RI:接收中断标志位。在方式0,当接收完第8位数据后,由硬件置位。 在其他方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于 SM2的说明)。RI置位表示一帧数据接收完毕,可用查询的方法获知或 者用中断的方法获知。RI也必须用软件清0。
3、串行口的工作方式
8051单片机的全双工串行口可编程为4种工作方式,现分述如下。 (1)工作方式0 方式0为移位寄存器输入/输出方式。可外接移位寄存器以扩展 I/O口,也可 以外接同步输入/输出设备。8位串行数据则是从RXD输入或输出, TXD用来输出同步脉冲。 输出:串行口数据从RXD引脚输出,TXD引脚输出移位脉冲。 CPU将数据写入发送寄存器时,立即启动发送,将8位数据以 fos/12的固定波特率从RXD输出,低位在前,高位在后。发送完 一帧数据后,发送中断标志TI由硬件置位。 输入:当串行口以方式0接收时,先置位允许接收控制位REN。 此时,RXD为串行数据输入端,TXD仍为同步脉冲移位输出端。 当(RI)=0和(REN)=1同时满足时,开始接收。当接收到第8位数据 时,将数据移入接收寄存器,并由硬件置位RI。
单片机或计算机在串口通信时的速率用波特率表示,它定义 为每秒传输二进制代码的位数,即1波特=1位/秒,单位是 bps(位/秒)。如每秒钟传输240个字符,而每个字符格式 包含10位(1个起始位,1个停止位,8个数据位),这时的 波特率为 10位*240个/秒=2400 bps。
方式1波特率计算方法: 波特率=2^SMOD/32*(定时器T1溢出率)。
(3)工作方式2 方式2为固定波特率的11位UART方式。它比方式1增加 了一位可程控为1或0的第9位数据。 输出:发送的串行数据由RXD端输出一帧信息为11位, 附加的第9位来自SCON寄存器的TB8位,用软件置位或复 位。它可作为多机通信中地址/数据信息的标志位,也可以 作为数据的奇偶校验位。当CPU执行一条数据写入SUBF 的指令时,就启动发送器发送。发送一帧信息后,置位中 断标志TI。 输入:在(REN)=1时,串行口采样RXD引脚,当采样到1 至0的跳变时,确认是开始位0,就开始接收一帧数据。在 接收到附加的第9位数据后,当(RI)=0或者(SM2)=1时,第9 位数据才进入RB8,8位数据才能进入接收寄存器,并由硬 件置位中断标志RI;否则信息丢失,且不置位RI。再过一 位时间后,不管上述条件是否满足,接收电路即行复位, 并重新检测RXD上从1到0的跳变。
TXD RXD 主机 RXD TXD 1号从机 RXD TXD 2号从机 „ „ RXD TXD N号从机
传输距离与传输速率的关系
串行接口或终端直接传送串行信息位 流的最大距离与传输速率及传输线的电气 特性有关 。当传输线使用每0.3m(约1英 尺)有50PF电容的非平衡屏蔽双绞线时, 传输距离随传输速率的增加而减小。当比 特率超过1000 bps 时,最大传输距离迅速 下降,如9600 bps 时最大距离下降到只有 76m(约250英尺)。
REN:接收允许控制位。由软件置位以允许接收,又由软件清0来禁止接 收。
TB8:是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据, 根据需要由软件置1或清0。例如,可约定作为奇偶校验位,或在多机通信 中作为区别地址帧或数据帧的标志位。 RB8:接收到数据的第9位。在方式0中不使用RB8。在方式1中,若 (SM2)=0,RB为接收到得停止位。在方式2或方式3中,RB8为接收到的第 9位数据。 TI:发送中断标志。在方式0中,第8位发送结束时,由硬件置位。在其他 方式的发送停止位前,由硬件置位。TI置位即表示一帧信息发送结束,同 时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的 信息,或用中断的方式来送下一个数据。TI必须用软件清0。
接 收 设 备
D0D7Biblioteka 8位顺次传送发 送 设 备
串行通信的特点:传输线少,长距离传送时成本 低,且可以利用电话网等现成的设备,但数据的 传送控制比并行通信复杂。
数据通信方式
串行通信的基本概念
一、异步通信与同步通信
1、异步通信 异步通信是指通信的发送与接收设备使用各自 的时钟控制数据的发送和接收过程。为使双方的 收发协调,要求发送和接收设备的时钟尽可能一 致。
间隙任意 接 收 10100100 设 备
1 0 10100100 1 0 11100110 1
发 送 0 11100110 设 备
异步通信是以字符(构成的帧)为 单位进行传输,字符与字符之间的间 隙(时间间隔)是任意的,但每个字 符中的各位是以固定的时间传送的, 即字符之间不一定有“位间隔”的整 数倍的关系,但同一字符内的各位之 间的距离均为“位间隔”的整数倍。
无线电培训课
主讲: 技术部部长 姚文发
串行通讯与红外解码
单片机串行通信基础知识
随着多微机系统的广泛应用和计算机网络技术 的普及,计算机的通信功能愈来愈显得重要。 计算机通信是指计算机与外部设备或计算机与 计算机之间的信息交换。 通信有并行通信和串行通信两种方式。而串行 通信又分为同步与异步通信两种,这节课主要讲 的是异步串行通信.在多微机系统以及现代测控 系统中信息的交换多采用串行通信方式。
串行口在中断方式工作时,要进行中断设置 (编程IE、IP寄存器)。
扩展:多机通信
硬件连接 单片机构成的多机系统常采用总线型主从式结构。所谓主从 式,即在数个单片机中,有一个是主机,其余的是从机,从机 要服从主机的调度、支配。80C51单片机的串行口方式2和方 式3适于这种主从式的通信结构。当然采用不同的通信标准时, 还需进行相应的电平转换,有时还要对信号进行光电隔离。在 实际的多机应用系统中,常采用RS-485串行标准总线进行数 据传输。
红外遥控系统
通用红外遥控系统由发射和接收两大部分 组成,应用编/解码专用集成电路芯片来进 行控制操作,如图1所示。发射部分包括键 盘矩阵、编码调制、LED红外发送器;接 收部分包括光、电转换放大器、解调、解 码电路。
遥控发射器及其编码
(2)工作方式1 方式1为波特率可变的10位异步通信接口方式。发送或接收 一帧信息,包括1个起始位0,8个数据位和1个停止位1。 输出:当CPU执行一条指令将数据写入发送缓冲SBUF时, 就启动发送。串行数据从TXD引脚输出,发送完一帧数据后, 就由硬件置位TI。 输入:在(REN)=1时,串行口采样RXD引脚,当采样到1至0 的跳变时,确认是开始位0,就开始接收一帧数据。只有当 (RI)=0且停止位为1或者(SM2)=0时,停止位才进入RB8,8位 数据才能进入接收寄存器,并由硬件置位中断标志RI;否则 信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标 志。
合集下载

红外解码方法简述

红外解码方法简述

红外解码方法简述1 引言低速的红外无线传输是一种廉价的无线通讯/控制方案,在家电领域已经广泛使用。

在嵌入式领域,只要工作环境比较优良,数据量小,传输距离较近(5米以内),同样可以采用红外无线传输。

本站的A Tmega16学习板上设计了红外发射管与接收管,配合站长家中闲置的“HITACHI VM101”型电视遥控器,详细分析一下此遥控器的红外编解码原理与单片机解码方法。

2 红外数据序列采集“HITACHI VM101”型电视遥控器结构非常简单,主芯片是M50560-123FP ,外围配有455kHZ 晶体做为主时钟源,一个红外发射管,一个发射管的驱动三极管以及若干阻容器件。

考虑到此芯片为专用芯片,就算找到芯片资料去啃E 文也对以后没有多大帮助,所以站长采用了最直接的方法——软件采集输出电平变化时间间隔。

按照学习板的红外接收管连接方法,当接收到红外数据时,在A Tmega16的INT0脚上电平为高,电平的上升沿变化可以做为数据接收的开始。

普通使用的红外管载波频率为38kHz-40kHz 之间,这样可以先设计一个n 倍于载波频率的定时器计时,在中断触发以后对INT0脚上的高低电平计时,就可以得到一个完整的红外数据序列。

站长首先采用了110kHz 的定时器来采集数据,计时用了一个16位的变量,得到的一个数据序列如下:922 1384 1440 1498 1555 1613 1669 1727 1784 1842 1899 2072 2129 2187 2243 2416 2473 2531 2588 2761 2818 2991 3047 3221 3277 3451 3507 3565 3622 3795 3852 3910 3966 4140 4196 4369 4426 4484 4541 4714 4771 4944 5000 5058 5115 5173 5230 5288 5344 5402 5459 5517 5573 5747 5803 5861 5918 5976 6033 6206 6262 6436 6492 6666 6722 6895 6952 序列一 110kHz 定时采集序列其中相邻两个数的差值即为电平维持时间。

串口通信+红外通信通过串口发送红外遥控器的解码值到PC

串口通信+红外通信通过串口发送红外遥控器的解码值到PC

串口通信+红外通信通过串口发送红外遥控器的解码值到PC/***************************************************************** *********** @file main.c* @author xr* @date 2014年3月31日22:30:08* @version V1.2.3* @brief 串口通信+红外通信通过串口发送红外遥控器的解码值到PC* @note 单片机STC89C52RC MCU 晶振 11.0592MHZ*************************************************************** ***********/#include <reg52.h>void ConfigUart();void UartSend(unsigned char dat);void delayms(unsigned int xms);extern bit irflag;extern unsigned char ircode[4];extern void ConfigInfrared();void main(){ConfigUart();ConfigInfrared();while (1){if (irflag) //接收到红外数据{irflag = 0;UartSend(ircode[0]); //发送用户码delayms(100);//延时100msUartSend(ircode[2]); //发送键码}}}/*** @brief 延时xms* @param xms* @retval 无*/void delayms(unsigned int xms){unsigned int x, y;for (x = 0; x < xms; x++)for (y = 0; y < 110; y++);}/*** @brief 配置串口通信* @param 无* @retval 无*/void ConfigUart(){TMOD &= 0x0F;//清零T1控制位TMOD |= 0x20;//T1方式2,八位自动重装模式TH1 = 0xFD; //波特率 = 256-1/2^SMOD*T1溢出率 X=256-11059200/12/32/波特率TL1 = TH1;//波特率9600bpsTR1 = 1;ET1 = 0;//只用T1的计数SCON |= 0x50;//串口方式1 SM0 SM1 SM2 REN TB8 RB8 TI RI 0101 0000/*SM0 = 0;SM1 = 1;//方式1 SM2多机通信位REN = 1;//允许接收数据TI = 0;//发送完成中断标志RI = 0;//接收完成中断标志*/ES = 1;//开串口中断EA = 1;//开总中断}/*** @brief 串口发送一个字节数据到PC* @param 待发送数据* @retval 无*/void UartSend(unsigned char dat){SBUF = dat;//while (!TI);//等待发送完成,在中断模式下不需要等待,否则进不了中断}/*** @brief 串口中断* @param 无* @retval 无*/void Uart_ISP() interrupt 4 //串口中断标号是4{if (TI) //等待发送完成{ //发送完成TI = 0;//清零}}/**************************************************************** * @file infrared.c* @author xr* @date 2014年3月31日20:51:23* @version V1.2.3* @brief 红外通信--红外遥控器NEC协议解码* @note 单片机STC89C52RC MCU 晶振 11.0592MHZ************************************************************** */#include <reg52.h>sbit IRD = P3^3;//红外接收检测端口bit irflag = 0;//接收到数据的标志unsigned char ircode[4];//存放红外遥控器发送的用户码,用户码反码键码键码反码/*** @brief 红外配置* @param 无* @retval 无*/void ConfigInfrared()TH0 = 0;TL0 = 0;//清零T0计数TMOD &= 0xF0;TMOD |= 0x01;//T0方式1TR0 = 0;//在没有红外信号之前先关闭T0ET0 = 0;//只用T0的计数//外部中断1IT1 = 1;//设置外部中断触发方式为下降沿触发EX1 = 1;//开启外部中断1}/*** @brief 获得IRD红外检测引脚的高电平时间(空闲时间)* @param 无* @retval 高电平持续的计数值*/unsigned int getHeighTime(){//在检测外部信号前,必须先将IRDIO口拉高IRD = 1;TH0 = 0;TL0 = 0;//清零T0计数TR0 = 1;//开启T0计数while (IRD) //持续高电平{//超时判断if (TH0 > 0x40) //当IRD持续高电平时间17.7ms,远远大于引导码的9ms,是误码{break;//退出}TR0 = 0;//停止计数return (TH0*256 + TL0);//返回高电平计数值}/*** @brief 获得IRD红外检测引脚的低电平时间(载波时间) * @param 无* @retval 低电平持续的计数值*/unsigned int getLowTime(){IRD = 1;//释放IRD,检测外部信号TH0 = 0;TL0 = 0;//清零T0计数TR0 = 1;//开始计数while (!IRD) //持续低电平{if (TH0 > 0x40) //超过18ms就是误码,错误信号{break;}}TR0 = 0;//停止计数return (TH0*256 + TL0);//返回低电平计数值}/*** @brief 外部中断1服务程序,检测红外信号* @param 无* @retval 无void EXINT_ISP() interrupt 2 //外部中断标号2{unsigned char byte;//接收数据unsigned char i, j;unsigned int time;//时间time = getLowTime();//获得载波时间if (time < 7833 || time > 8755) //引导码载波是9ms,这里规定在8.5ms-9.5ms之间是9ms的载波{//范围之外,误码IE1 = 0;//清零外部中断1中断标志,为下一次再进入中断return;//退出中断}//否则是9ms的载波time = getHeighTime();//空闲时间if (time < 3686 || time > 4608) //引导码的空闲时间4.5ms 这里规定4ms-5ms是4.5ms的空闲{IE1 = 0;//清零中断标志return;//退出中断}//否则是4.5ms的空闲//开始接收用户码和键码等for (i = 0; i < 4; i++){for (j = 0; j < 8; j++){time = getLowTime();//载波if (time < 423 || time > 608) //560us的载波和560us的空闲是0 范围460us-660us{IE1 = 0;return;}//560us载波time = getHeighTime();if (time > 423 && time < 608) //560us空闲{//bit '0'byte >>= 1;//低位在前,移入一位0}else if (time > 1198 && time < 1658) //1.68ms的空闲是1 范围 1300us-1800us{//bit '1'byte >>= 1;//移入一位byte |= 0x80;//移入的一位置1}else{//误码IE1 = 0;return;//退出中断}}ircode = byte;}//接收完成irflag = 1;//退出中断时清零中断标志IE1 = 0;}。

STC89C58RD+ 红外遥控解码与串口程序

STC89C58RD+ 红外遥控解码与串口程序

STC89C58RD+ 红外遥控解码与串口程序//以下程序适用于STC89C58RD+ ,使用22.1184MHz晶振,用1838来对红外遥控器解码,1838的1脚接外中断0脚,即单片机P3.2脚//红外遥控器发出的红外信号经过1838处理后输出的是9.5ms低电平(也可能是4.5ms低电平)加4.5ms高电平的前导码,后面8位的地址码,8位的地址反码(也可能是地址码),8位的数据码,8位的数据反码,总共32位码//其中0码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms;1码由0.56ms低电平和1.69ms高电平组合而成,脉冲宽度为2.25ms#include<reg52.h>#include<stdio.h>#include<string.h>unsigned char count;unsigned int Address_Part,Data_Part;unsigned char date;bit Rev_flag;bit Over_flag;//unsigned int time_data[35];//unsigned char time_count;void init_config()//初始化函数{TMOD=0x21;//设置定时器0为工作方式1,定时器1为方式2--8位自动重装PCON |=0x80;//SMOD=1,要产生115200波特率必须置位REN=1;//启动串行接收数据SM0=0;SM1=1;//SM0,SM1设置串行口为工作方式1,10位异步收发器-->1位起始位,8位数据,1位停止位TI=1;//要使用printf()函数,就需要置位,后期不能置0TL1=0xff;//256-(2*fosc/(384*baud));TH1=0xff;//定时器1的初值,22.1184M晶振TR1=1;//启动T1定时器TH0=0x00;TL0=0x00;//设置定时器0初值IT0=1;//设置外中断0为下降沿触发ET0=1;//开定时器0允许中断//ET1=1;//开定时器1允许中断EX0=1;//开外中断0//TR0=1;ES=1;//开串口中断EA=1;//开总中断Rev_flag=0;Over_flag=0;}void main(){init_config();while(1){if(Over_flag){Over_flag=0;printf("Address_Part:%x,Data_Part:%x\n\r",Address_Part,Data_Part);}if(Rev_flag)//判断串口接受到数据,只是把从串口调试助手发过来的数据发回去,测试收发用而已{ES=0;Rev_flag=0;SBUF=date;//发送数据while(!TI);//发送数据完毕才跳出死循环ES=1;// TI=0;}/* if(time_count==40)//把收到的时间th值传给串口打印出来{time_count=0;printf("time:\n\r");for(;time_count<35;time_count++){printf("%d \n\r",time_data[time_count]);}memset(time_data,0,sizeof(time_data));EX0=1;//开外中断0}*/}}void exter() interrupt 0{unsigned int th;unsigned char tl;bit ds;TR0=0;//关定时器0th=TH0;//提取出高8位tl=TL0;//提取出低8位th<<=8;//左移8位th=th|tl;//算出定时器总共的计数值TH0=0x00;//初始值TL0=0x00;/* time_data[time_count]=th;//这段代码的作用是在不知道th的数值是多少为前导码,为0,为1时,把收到的时间th给提取出来,方便传给串口打印出来time_count++;if(time_count==35){time_count=40;EX0=0;}TR0=1;*//*这段判断前导码和0、1的值是12M晶振下的if(th>950&&th<1225)ds=0;//判断0和1else if(th>2050&&th<2345)ds=1;else if(th>13325&&th<13600)//判断前导码*///这段判断前导码和0、1的值是22.1184M晶振下的if(th>1900&&th<2260)ds=0;//判断0和1else if(th>4000&&th<4300)ds=1;else if(th>24900&&th<25350)//判断前导码{Address_Part=0;Data_Part=0;count=0;Over_flag=0;TR0=1;return;}else{TR0=1;return;}//去除干扰,当接收的是准备进前导码时的下降沿和截止码时,该语句起作用,没有该语句,则只能接收一次count++;if(count<16){Address_Part=Address_Part|ds;Address_Part=Address_Part<<1;TR0=1;}else if(count==16){Address_Part=Address_Part|ds;TR0=1;}else if(count<32){Data_Part=Data_Part|ds;Data_Part=Data_Part<<1;TR0=1;}else if(count==32){Data_Part=Data_Part|ds;Over_flag=1;}//接收完32位,后面应该有连续码,但不需要,所以不作处理}void time0() interrupt 1//要是没有该函数,可能会因为溢出而导致解码不正确{TR0=0;}void ser() interrupt 4{if(RI)//一定要加该判断句,不然串口调试助手那里会一直收到数据{RI=0;date=SBUF;//提取数据Rev_flag=1;}}。

红外接收解码-课件

红外接收解码-课件

1 红外遥控系统
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集 成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、 编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、 解码电路。
遥控发射器及其编码 遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,
if(DeCode()==1) // 执行遥控解码功能
THANKS
TR0=1; //开启定时器T0
while(IR==1); //如果是高电平就等待,给引导码高电平计时 TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0;
//保存引导码的高电平长度
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==0);
//如果是低电平就等待,给引导码低电平计时
TR0=0;
//关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平时间
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
红外接收
红外接收头将38K载波信号过虑,得到与发射代码反向接收代码
发射端的“0”和“1”
红外解码的关键就是识别 0和1
1. 解码的关键是如何识别“0”和“1”, 从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始, 不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度 区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低, 说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些, 但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平, 因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。

红外解码说明文档

红外解码说明文档

红外解码说明文档作者:ruihuan_vb@时间:2013-12-71、红外遥控的基本原理红外遥控器发出的红外光信号,所以只能产生1 0 信号。

但是,为防止自然光的干扰,同时为了增大红外管的发射功率,正真发出的“1”信号是:38K的载波信号。

(而0 1 信号的区分就在于对发射管的关闭时间)。

红外一体化接收头接收到信号后会对信号进行滤波,所以一体化接收头输出的信号是经过滤波放大后的电平信号,并且对对电平信号进行了反相输出。

2、一般电平编码的结构红外遥控的数据编码是多种多样的,但是一般都会一这这种情况出现:引导码加数据。

引导码由9ms(可能有时候要设置到9.1ms)的低电平和4.5ms的高电平构成。

“0”信号由0.6ms的低电平和0.6ms的高电平组成;“1”信号由0.6的低低电平和1.2ms的高电平组成。

(注:这里说的电平是说的是红外一体化接收头的输出电平)。

红外一体化接收头的输出波形,示波器保存的图片3、红外遥控的电路设计1)发射电路红外遥控的发射电路比较简单,但是要想做的比较好还是有要注意的地方的。

NPN 三极管直接拉红外发射头就可以构成一个红外发射电路了。

但是,要注意的是:驱动红外发射管要加隔离电阻,并且这个隔离电阻不能太大,因这个隔离电阻决定了红外发射的功率。

发射电路的关键就在这里了,这个发射管的隔离电阻的阻值不要超过10欧姆,否则发射距离会非常近的,并且还有注意发射信号的载波的占空比不要设为1/2 最好是1/3 (这个好像是跟一体化接收头的原理有关的,而且将占空白降低方便增大发射功率)。

2)红外接收电路红外接收电路比较简单,一般用一个一体化接收头接到单片机的引脚就可以了。

我们这用过的型号是:HS0038B。

4、如何利用单片机的外设来实现对应的功能红外解码功能:因为红外解码的第一步骤是对电平长度的检测,因而最好是利用单片机的捕获功能来检测电平的长度,然后再根据电平长度来判断其意义(建议:不要检测双边沿,最好是检测一个周期的电平,例如下降沿的时间间隔)。

串口通信发送红外遥控器解码值

串口通信发送红外遥控器解码值

串口通信发送红外遥控器解码值本程序所用的原理图下载: 点这里,单片机芯片使用的stc89c52;找到数码管的原理图即可.这是一整个单片机开发板的电路图其他的忽略./*************************************************** ********************************************** * @filemain.c* @authorxr* @date2014年3月31日10:26:47* @versionV1.2.3* @brief红外通信 NEC协议进行红外遥控器解码显示用户码和键码到数码管上* @note单片机STC89C52RC MCU 晶振 11.0592MHZ************************************************* ********************************************** */#include ;//红外输出数据口sbit IRD = P3^3;//外部中断引脚bit irflag = 0;unsigned char ircode[4];//接收解码得到的数据unsigned char code LedTable[] = {0xC0, //&quot;0&quot;0xF9, //&quot;1&quot;0xA4, //&quot;2&quot;0xB0, //&quot;3&quot;0x99, //&quot;4&quot; 0x92, //&quot;5&quot; 0x82, //&quot;6&quot; 0xF8, //&quot;7&quot; 0x80, //&quot;8&quot; 0x90, //&quot;9&quot; 0x88, //&quot;A&quot; 0x83, //&quot;B&quot; 0xC6, //&quot;C&quot; 0xA1, //&quot;D&quot; 0x86, //&quot;E&quot;0x8E//&quot;F&quot;};unsigned char LedBuff[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//数码管显示缓冲区unsigned char thr0, tlr0;void ConfigTimer0(unsigned int xms);void ConfigTimer1();void main(){ConfigTimer0(1); //定时1msConfigTimer1();while (1){if (irflag)//接收到红外数据,则刷新显示{LedBuff[5] = LedTable[ircode[0] >;>; 4];//取用户码的高4位字节LedBuff[4] = LedTable[ircode[0] & 0x0F];//取用户码的低四位字节LedBuff[1] = LedTable[ircode[2] >;>; 4];//取键码的高四位LedBuff[0] = LedTable[ircode[2] & 0x0F];//取键码的低四位}}}/*** @brief定时器T0配置* @param定时时间xms* @retval无*/void ConfigTimer0(unsigned int xms){unsigned int tmp;tmp = 65536-xms*11059200/12/1000;thr0 = (unsigned char)(tmp >;>; 8);tlr0 = (unsigned char)(tmp & 0x00FF);TMOD &= 0xF0;TMOD |= 0x01;//T0方式1TH0 = thr0;TL0 = tlr0;TR0 = 1;EA = 1;ET0 = 1;//设置定时器T0的中断优先级高于外部中断的优先级//IP中断优先级寄存器 PT2 PS PT1 PX1 PT0 PX0PT0 = 1;//提高T0的优先级,优先进行数码管刷新,消除数码管显示抖动}/*** @brief数码管刷新* @param无* @retval无*/void refresh(){static unsigned char j = 0;P0 = 0xFF;//消隐P1 = (0x08 | j);//000 0 1 ADDR2 ADDR1 ADDR0P0 = LedBuff[j++];if (j >;= 6)j = 0;}/*** @briefT0中断服务* @param无* @retval无*/void Timer0_ISP() interrupt 1{TH0 = thr0;TL0 = tlr0;refresh();//数码管刷新}/**********************红外解码*************************************/ /*** @brief配置定时器T1,开启外部中断,T1用来计数* @param无* @retval无*/void ConfigTimer1(){TMOD &= 0x0F;//清零T1控制位TMOD |= 0x10;//T1方式1TH1 = 0;TL1 = 0;//初始化计数值为0TR1 = 0;//在没有进入外部中断前,先关闭定时器T1 ET1 = 0;//关闭T1中断,只用来计数IT1 = 1;//设置外部中断为下降沿触发中断EX1 = 1;//开启外部中断}/*** @brief获得高电平时间(空闲时间)* @param无* @retval无*/unsigned int getHeighTime(){//在检测外部电平之前,先将红外检测引脚拉高释放IRD = 1;TH1 = 0;TL1 = 0;//重新清零TR1 = 1;//打开定时器T1开始计数while (IRD){//进行超时判断,若高电平时间大于9ms,即引导码时间,则直接退出if (TH1 >; 0x40) //(0x40*256) * (12/11059200) s = 17.7ms{break;//退出}}TR1 = 0;//关闭计数return (TH1*256 + TL1);//返回IRD引脚持续的高电平时T1计数值}/*** @brief获取低电平时间(载波)* @param无* @retval无*/unsigned int getLowTime(){//释放IRD检测引脚IRD = 1;TH1 = 0;TL1 = 0;//清零T1计数值TR1 = 1;//启动T1计数while (!IRD){if (TH1 >; 0x40) //TL1计数满则进位TH1,时间:TH1*256*12/11059200 s = 17.7ms{ //时间大于了NEC协议的引导码载波时间9ms,进行强制退出,避免假等待break;}}TR1 = 0;//关闭计数return (TH1*256 + TL1);//返回低电平持续的计数值每计数一次是一个机器周期的时间即1.08us}/*** @brief外部中断服务,检测红外信号* @param无* @retval无*/void ExINT_ISP() interrupt 2 //外部中断1中断标号为2{unsigned int time;//时间unsigned char i, j;unsigned char byte = 0;time = getLowTime();//获取低电平T1计数值,即引导码的9ms载波if ((time ; 8755)) //范围8.5-9.5msX=0.0085/(12/11059200){//错误引导码IE1 = 0;//清零外部中断标志return;//退出中断}//符合引导码的9mstime = getHeighTime();//获取高电平时间if ((time ; 4608)) //范围4ms-5ms{//不是4.5ms的空闲IE1 = 0;//清零外部中断return;//退出中断}//是正确的引导码for (i = 0; i ; 645)) //范围350us-700us{IE1 = 0;//清零外部中断标志return;//退出中断time = getHeighTime();//空闲时间if ((time >; 322) && (time ;>;= 1;//地位在前,先接收低位}else if ((time >; 1198) && (time ;>;= 1;byte |= 0x80;//高位置1}else{//无效码IE1 = 0;return;}}ircode = byte;//接收数据}//全部接收完毕irflag = 1;IE1 = 0;//清零外部中断标志位}。

AVR单片机捕获中断实现红外线解码

AVR单片机捕获中断实现红外线解码摘要:AVR单片机是Atmel公司推出的一个单片机系列。

由于该系列单片机的集成度高,因此,其软/硬件设计都变得更加简洁。

文中介绍通过AVR单片机的捕获中断来实现红外线通讯解码的一种方法。

关键词:AVR;红外线解码;输入捕获中断1 红外线编码红外线编码是数据传输和家用电器遥控常用的一种通讯方法,其实质是一种脉宽调制的串行通讯。

家电遥控中常用的红外线编码电路有μPD6121G型HT622型和7461型等。

本文就以这些电路的编码格式来讨论怎样使用AVR单片机的捕获中断功能来实现其解码。

红外线通讯的发送部分主要是把待发送的数据转换成一定格式的脉冲,然后驱动红外发光管向外发送数据。

接收部分则是完成红外线的接收、放大、解调,还原成同步发射格式相同(但高、低电位刚好相反的脉冲信号。

这些工作通常由一体化的接收头来完成,主要输出TTL兼容电平。

最后通过解码把脉冲信号转换成数据,从而实现数据的传输。

图1是一个红外线遥控制系统的原理框图。

图2示出该红外遥控系统的编码格式。

图中,μPD6121G遥控器的二进制“0”由0.56ms的间隔加0.565ms的脉冲表示;二进制“1”由0.56ms的间隔加1.685ms的脉冲表示。

每次发送的32二进制码可分成两部分,其中前16位是遥控器辨识码,主要用于区别不同遥控器,后16位是操作码。

这两个部分的后8位都是前8位的反码,用作数据校验。

每帧数据以9ms的间隔加4.5ms的脉冲作为数据头。

2 AVR单片机AVR系列单片机是Atmel公司于1997年推出的一款全新配置的、采用精简指令(RISC-Redued Instruction Set CPU)结构的新型8位单片机。

由于AVR 单片机采用单指令操作,所以,在相同时钟的情况下,AVR的指令周期只有8051型机的1/2,而且AVR采用两极指令流水线,可以在执行当前指令的同时获取下一条指令,所以具备1MI/s/MHz的调整处理能力。

红外串行通信

应该选择10−3 pF 数量级的电容,由于需要的电容太小,而且这种振荡电
路容易受到电源电压波动的影响,所以我们又选择了 555 定时器来设计振 荡电路。555 多谐振荡器的主要优点是其频率和占空比可调,方便调试。 在设计调制电路时,要认真考虑如何有效的利用 74HC00 的 4 个与非们进 行信号的调制。刚开始,我们先把被调制信号与载波脉冲进行与非后再取 反,发射电路的功率放大电路选的是 NPN 型三极管,这样做的结果是, 当被调制信号为 1 时,发射红外脉冲,当被调制信号为 0 时,不发射红外 脉冲,这样红外接收管的输出就必须要经过取反后才能进行电平转换,而
图 2 TFMS5380 内部结构框图
图 3 TFMS5380 输入输出特性
1.3 信号调制
信号调制电路由 555 定时器和 74HC00 与非门组成。由 555 定时器组 成频率和占空比可调的多谐振荡器产生 38KHz 的脉冲,由 74HC00 与非 门将经过电平转换的 RXD 信号调制到 38KHz 的脉冲上,然后在送到发射 电路进行发射。其过程如图 4 所示。
4
邹爱龙 学号:20072180
专业综合实践报告
红外串行通信
图 6 串口设置和实验效果 调试时不断的改变两电路板的距离,观察其传输的效果,并测量其最 大传输距离。然后改变波特率和电阻 R4 的值,继续进行调试。 经过实验,我们发现红外串行通信的最大波特率为 1200,当波特率 大于 1200 时,红外传输的出错率大大增加。这与前面的所述相一致。当 波特率为 1200,R4 阻值为 30 欧姆时,传输距离约为 15cm 到 20cm。波 特率减小,数据传输的正确率增加;传输距离增加,数据传输的正确率下 降;减小 R4 的阻值,最大传输距离增加。

红外遥控及串口Microsoft Office Word 文档

智能红外遥控开关原理及设计发布时间:2010-10-17 发布人:21世纪电子网0 引言红外遥控是当前使用最为广泛的通信和控制手段之一,由于其结构简单、体积小、功耗低、抗干扰能力强、可靠性高及成本低等优点而广泛应用于家电产品、工业控制和智能仪器系统中。

然而市场上的绝大部分遥控器都是针对各自特定的遥控对象设计的,不能直接应用于通用的智能仪器研发及其更一般的控制场合。

通常情况下,一般家庭所使用的电视机、空调、VCD/DVD等家用电器都使用了红外遥控器,而这些红外遥控器都是针对各自产品所设计的,从而导致了一般家庭中拥有数个遥控器,那么,能否将这些遥控器的功能进行复用,进而减少遥控器的数量,使遥控器的功能更加强大,就显得十分必要了。

电源开关广泛应用于家庭、工厂、仓库、以及办公室等场所。

传统的机械式电源开关存在接触电阻大、易磨损、可靠性低以及寿命短等缺点,特别是当家用电器的遥控器繁多的情况下,如果能借助这些遥控器设计开关用于代替传统的机械式电源开关,不仅节约了成本,而且操作方便。

使用电视机等家用电器的遥控器实现开关操作,安装和代换都很方便,可以用它代换家居中非常普及的墙壁开关,从而提高遥控器在家电领域的实用价值。

1 工作原理智能红外遥控开关主要由红外接收、放大整形、微控制器、开关控制以及降压电源等模块组成,其原理框图如图1所示。

智能红外遥控开关的功能是将常见家用电器的遥控器,如电视机、VCD/DVD等,由用户任意指定一个按键作为这个红外遥控开关的控制键。

使用时,用户按下智能红外遥控开关的“学习”按键,然后再对准遥控开关的红外接收头按下遥控器上指定的这个开关控制按键,遥控器发出的红外编码信号经过红外接收头接收后,再经过放大整形,输入到微控制器,微控制器通过内置的E2PROM记住遥控器这个指定按键的编码。

那么,用户下次使用时,当按下遥控器这个指定按键后,其发出的红外编码信号同样经过红外接收头,放大整形后输入到微控制器,由微控制器发出控制信号控制开关控制模块里面继电器的导通与断开,进而控制输出电压的通断。

红外遥控系统原理及解码程序

红外遥控系统原理及单片机红外线遥控是目前使用最广泛的一种通信和遥控手段。

由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。

工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

1 红外遥控系统通用红外遥控系统由发射和接收两大部分组成。

应用编/解码专用集成电路芯片来进行控制操作,如图1所示。

发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。

图1 红外线遥控系统框图2 遥控发射器及其编码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理(一般家庭用的DVD、VCD、音响都使用这种编码方式)。

当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。

这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。

图2 遥控码的“0”和“1” (注:所有波形为接收端的与发射相反)上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。

然后再通过红外发射二极管产生红外线向空间发射,如图3示。

图3 遥控信号编码波形图UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。

该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。

UPD6121G最多额128种不同组合的编码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档