51单片机串口转红外接收数据异常

2020-01-23 14:29发布

本帖最后由 优享家 于 2014-7-20 21:47 编辑

芯片采用的是STC15
1、串口转红外发射程序:管脚为P3.1

//波特率为1200bps 22.184MHz 用于红外
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        TL1 = 0x00;                //设定定时初值
        TH1 = 0xEE;                //设定定时初值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1

//串口发送数据
void SendChar(uchar n)
{
                ES = 0;         //发送时关中断
                CR = 1;         // 38K调制中断       
                       SBUF = ~n;        //采用的NPN型,此处要取反操作
                while (!TI);//发送数据
                TI=0;
                while(P36 == 0);
                CR = 0;         // 38K调制中断
                ES = 1;

}

//38K调制  管脚为P3.6
#define        T38KHZ                                                (uint)(FOSC/(4 * 38000) + 0.5)  //四舍五入
void IR_Modulate_Init(void)
{
        CMOD = 0x02;       //设置PCA时钟源为SYSclk / 2
        CCON = 0;                        //初始化PCA寄存器,PCA寄存器停止、清除CF标记、清除模块中断标志
        CL = 0;                                //复位PCA寄存器
        CH = 0;                                //复位PCA寄存器
        IR_Modulate_Value = T38KHZ;       
        CCAP1L =  IR_Modulate_Value;          //低8位
        CCAP1H =  IR_Modulate_Value >> 8; //高8位
        IR_Modulate_Value += T38KHZ;
        IP=0X80;                //设置为最高优先级
        AUXR1 = 0x10;        //        CCP调整为管脚P3.6,发送38K脉冲
        CCAPM1 = 0X4D;  //
        CR = 0;                               
}

void  PCA_isr() interrupt 7 using 2
{
        CCF1 = 0;
        CCAP1L =  IR_Modulate_Value;          //低8位
        CCAP1H =  IR_Modulate_Value >> 8; //高8位
        IR_Modulate_Value += T38KHZ;
//                SendChar('0');       
}

//串口调制发送的数据:
                SendStr("12345");
                Delay(60000);
                SendChar('1');
2、用红外发送,接收头接收,接收头接收数据用串口转TTL工具直接接收至电脑,采集到如下数据
发送的数据为ASCII 12345  1,但是接收的数据存在多种 且看起来没有规律
发送  31 32 33 34 35 31
         1   2  3   4   5   1
接收(波特率一致)
        21 19 86 63 F3 CC
        31 19 06 1A CD CC
        21 19 86 63 F3 CC
        0C 19 46 63 C3 CC
        21 19 46 63 E3 21
        21 19 86 63 E3 63
        8C C6 46 63 F3 CC
        21 19 46 63 F3 8C
        63 19 46 C3 F3 0C
转成二进制
发送  00110001001100100011001100110100001101010011  0001
接收  00100001000110011000011001100011111100111100  1100
        00110001000110010000011000011010110011011100  1100
        00100001000110011000011001100011111100111100  1100
        00001100000110010100011001100011110000111100  1100
        00100001000110010100011001100011111000110010  0001
        00100001000110011000011001100011111000110110  0011
        10001100110001100100011001100011111100111100  1100
        00100001000110010100011001100011111100111000  1100
        01100011000110010100011011000011111100110000  1100


3、已经排查的问题:
1)、38K调制波形,用示波器测量P3.6调制管脚的波形为26.2us波形是正确的
2)、单片机的串口信息直接用串口转TTL工具接电脑,接收的串口信息是正确的
3)、已经可以正常收发,那硬件电路应该是没有问题的

4、问题是:
1)为何会出现一样的发送信息,为何波特率一致情况下会存在多种接收
2)接收头是否有特殊的频率,我更改了下频率比如38k改为38.4K效果类似
3)是否还有其他问题没有被我考虑到


注:搭建的硬件电路暂时只有一个红外发送二极管
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
lcw_swust
2020-01-25 01:53
优享家 发表于 2014-7-21 16:35
但是我关掉了P36  38K调制
                while(P36 == 0);
                CR = 0;         // 38K调 ...


在关调制前,1位起始位+8位数据位+0.5位停止位已经发出去了。
由于起始位是低电平,红外LED不发光,接收端为高电平,接收端不认为这是起始位,
可能后面的数据成了起始位,所以无法保证数据的正确性.

一周热门 更多>