51单片机教程论坛

产品购买方式和介绍

本公司淘宝网店

返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料  电子技术产品介绍如何购买 进入论坛

yaokong.asm 遥控器测试程序按任意键试验版数码管指示灯闪烁。任意遥控器均可!
n6221.asm 为配套的红外线遥控(P3.7)显示数码管1234567890的程序 
n6221b.asm 遥控器控制显示0123456789abcdef数据保持
n6221c.asm 遥控器控制30个io的led点亮,可由此控制继电器实现家电的遥控

单片机系统中的红外通信接口

摘要:本文结合复费率电能表中红外通信的设计实从事贸易,介绍了单片机系统中红外通信的软硬件设计方法,并给出了具体的电路原理和通信源程序。

关键词:单片机,红外通信,遥控

在许多基于单片机的应用系统中,系统需要实现遥控功能,而红外通信则是被采用较多的一种方法。一般市场上的摇控器协议简单、保密性不强、抗干扰能力较弱。这里,我们介绍一种基于字节传输的红外遥控系统,可以适合于各种复杂的应用场合。

红外通信的基本原理

红外通信的基本原理是发送端将基带二进制信号调制为一系列的脉冲串信号,通过红外发射管发射红外信号。常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。本系统采用的为永时市制方法。数据比特的传送仿照不带奇侧校验的RS232通信,首先产生一个同步头,然后接着8位数据比特


硬件电路设计

复费率电能表系统可分为手持遥控器和复费率电能表两部分.手持遥控器为发射部分,其基本电路如图2所示。采用塑封的SE303ANC-发射二极管,波长为940nm。CPU按照协议规定导通或截止发射二极管,从而产生特定频率的发射信号,这里选用的频率为38.9kHz。复费率电能表红外接收部分的基本电路如图3所示。接收管采用日本光电子公司的PIC-12034,其接收频率为37.9kHz,它直接将37.9kHz的调制信号解调为基带信号,提供缎带接收CPU。该芯片接收灵敏度高,性能稳定。其基本工作过程为:当接收至37.9kHz信号时,输出低电平,否则输出为高电平。电能表部分采用的是51系列单片机,以中断方式检测接收信号。这里的非门对收信号起整形作用。


软件设计

发射部分的程序相对来说非常简单,主要是生产不同时间间隔的37.9kHz脉冲串信号控制发射管的通断。在发射端,CPU不断扫描键盘,一旦发现有键按下,即启动发射子程序将相应的数值发送出。在我们的设计中,采用的是4×4的小键盘,正如和0~F编码对应,为了提高可靠性,采用最简单的纠错编码――将每位数重复发送一次,即和键盘数字对应的编码为00~FF。这样,一个键值要发送8比特。接收端接收满8比特信号后,再进行纠错处理,不正确的碥码认为无效。收足规定的号码后,即调用号码分析程序进行处理。当每收至一个脉冲串信号后即启动一个定时器。下次中断发生时,通过定时器的计数值判断是0还是1。如果定时器溢出,则清除本次接收的号码,恢复到接收初始状态。接收部分的基本程序流程如图4所示。

在程序设计时,应该注意MCU的中断方式采用下降沿触发:接收端通过T0计数值来判断发送比特,一般采用硬判决,即取0和1比特时宽的平均值为竟决门限A,当T0值大于A时判接收信号为0,小于A时判为1。

复费率电能表中的红外接收程序(MCU为Intel 8052,采用C语言编写)见程序清单。

结语

以上设计方案在复费率电能表中应用后,效果良好,达至了设计要求。整个系统外围元件少,调试方便;软件工作量也较小。如果应用来传送大量数据时,还可以根据需要改变相应的编码形式,提高数据传送速率。

通信源程序
#include<reg52.h>
#include<intrins.h>
#include<absacc.h>
#pragma OPTIMIZE(5,SPEED)
sbit RECV=P3^3;
bdata unsigned char SIGN,RECVBYTE;
sbit RECVBG=SING^0;
sbit US1AT=SIGN^6;
sbit RECVBITO=RECVBYTE^0;
unsigned char RECVBIT;

timer0() interrupt 1 ∥entrance:8*n+3=0Bh;
{
IE=0x8d; ∥1(EA)0(X)0(X)0(X)-1(ET1)1(EX1)0(ET0)1(EX0)
RECVBG=0;
}

EX-INT1() interrupt 2 ∥接收红外信号
{
TCON=0x45; ∥0(TF1)1(TR1)0(TF0)1(TR0)-0(IE1)1(IT1)0(IE0)1(IT0)
If(RECVBG==0) {RECVBG=1;
RECVBIT=8;
}
eles{BECVBYTE=RECVBYTE<<1;
if(TH0<=4)RECVBIT0=1;
else RECVBIT0=0;
RECVBIT--;
If(RECVBIT==0) {RECVBG=0;
US1AT=1;
}
}
TH0=0;
TL0=0;
TCON=0x55; ∥0(TF1)1(TR1)0(TF0)1(TR0)-0(IE1)1(IT1)0(IE0)1(IT0)
IE=0x8f; ∥Enable the timer0 interrupt
}

void main(){
RECVBYTE=O;
SIGN=O;
TMOD=0x11;
TCON=0x55; ∥0(TF1)1(TR1)0(TF0)1(TR0)-0(IE1)1(IT1)0(IE0)1(IT0)
IP=0x00;
IE=0x8d; ∥1(EA)0(X)0(X)0(X)-1(ET1)1(EX1)0(ET0)1(EX0)
∥基本循环程序
while(1) {

.(略)

if(US1AT==1{∥红外接收处理

.(略)

}
}
}