一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2444|回复: 4
收起左侧

[51单片机] 用51单片机模拟HS2240发码(串口丢包检测是亮点)

[复制链接]
发表于 2013-6-12 12:05 | 显示全部楼层 |阅读模式
/***********************************************************************************
                        用51单片机模拟HS2240发码
CPU:    89S52
波特率:9600
晶振:    11.0592M
不用一个定时器来检测串口丢包
用串口助手以字符方式发送以下代码,串口会返回如下代码,并在P1.0端口输出对应的高低电平
当发码为1则高电平975uS/低电平325uS;当发码为0则低电平325uS/高电平975uS;按HS2240的
编码方式在发码前会先发一个同步位即低电平325uS/高电平10mS。
以下为四个按键码,前面20个为地址码,后面4个为键码,E为串口发码指令码
            *******************0001E
            *******************0100E
            *******************0010E
            *******************1000E
按下k1发出:*******************0001    撒防键码
按下k2发出:*******************0100    寻车键码
按下k3发出:*******************0010    启动键码
按下k4发出:*******************1000    设防键码

星号是本人遥控器的地址码用0或1代替
以下时序是HS2240的1~8脚的振荡电阻为2M供12V时的
2M供12V时规格上说发送1位数据的(高+低电平)为1360uS ± 20%
一帧码的宽度为32*1360uS
程序设计:红尘有你 QQ:691477940                    2013-06-10
/***********************************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//以下为11.0592Mhz晶振时用逻辑分析仪实测的定时初值(按键与串口)
#define HTH0_975uS (65536 - 870) / 256;    //端口输出高电平时专用
#define HTL0_975uS (65536 - 870) % 256;    //端口输出高电平时专用854
#define LTH0_975uS (65536 - 838) / 256;    //端口输出低电平时专用854
#define LTL0_975uS (65536 - 838) % 256;    //端口输出低电平时专用
#define HTH0_325uS (65536 - 282) / 256;    //端口输出高电平时专用
#define HTL0_325uS (65536 - 282) % 256;    //端口输出高电平时专用265
#define LTH0_325uS (65536 - 248) / 256;    //端口输出低电平时专用265
#define LTL0_325uS (65536 - 248) % 256;    //端口输出低电平时专用
#define TH0_10mS  (65536 - 9200) / 256;    //端口输出低电平时专用
#define TL0_10mS  (65536 - 9200) % 256;    //端口输出低电平时专用
/***********************************************************************************/
#define RxIn 25                    //串口接收数据长度
sbit P2240 = P1^0;
sbit LED = P1^7;
sbit k1 = P3^4;        //撒防
sbit k2 = P3^5;        //寻车
sbit k3 = P3^6;        //启动
sbit k4 = P3^7;        //设防
char SBUF_DATA[RxIn];
code char k1dat[24] = "*******************0001";    //撒防
code char k2dat[24] = "*******************0100";    //寻车
code char k3dat[24] = "*******************0010";    //启动
code char k4dat[24] = "*******************1000";    //设防
/***********************************************************************************/
void Delay10ms()        //@11.0592MHz
{
    uchar i,j;
    i = 18;
    j = 235;
    do
    {
        while(--j);
    } while(--i);
}
/***********************************************************************************/
void p2240_0()            //发射0 函数
{
    P2240 = 1;
    TH0 = HTH0_325uS;    //
    TL0 = HTL0_325uS;    //
    TR0 = 1;
    while(TR0);            //高电平 $   
    P2240 = 0;
    TH0 = LTH0_975uS;    //
    TL0 = LTL0_975uS;    //
    TR0 = 1;
    while(TR0);            //低电平 $   
}
/***********************************************************************************/
void p2240_1()            //发射1 函数
{
    P2240 = 1;
    TH0 = HTH0_975uS;    //
    TL0 = HTL0_975uS;    //
    TR0 = 1;
    while(TR0);            //高电平 $   
    P2240 = 0;
    TH0 = LTH0_325uS;    //
    TL0 = LTL0_325uS;    //
    TR0 = 1;
    while(TR0);            //低电平 $   
}
/***********************************************************************************/
void p2240_e()            //发射同步
{
    P2240 = 1;
    TH0 = HTH0_325uS;    //
    TL0 = HTL0_325uS;    //
    TR0 = 1;
    while(TR0);            //高电平 $   
    P2240 = 0;
    TH0 = TH0_10mS;        //
    TL0 = TL0_10mS;        //
    TR0 = 1;
    while(TR0);            //低电平 $   
}
/***********************************************************************************/
void PUTF(char STR)
{
    if(STR == '0')
        p2240_0();            //= 0发射0 函数
    else if(STR == '1')
        p2240_1();            //= 1发射1 函数
}
/***********************************************************************************/
void send_char_com(unsigned char ch)
{
    SBUF = ch;
    while(TI == 0);
    TI =  0 ;
}
/***********************************************************************************/
void test()        //发射数据
{
    static uchar i,j;
    ES = 0;
     for(j = 0;j <= 4;j++)        //发送5次
    {
        p2240_e();                //发射同步码
        for(i = 0;i < 24;i++)    //发送24个数据
        {
            PUTF(SBUF_DATA);
        }
    }
    for(i = 0;i < 24;i++)        //发送24个数据
    {
        send_char_com(SBUF_DATA);    //发送回电脑端
    }
    SBUF_DATA[24] = 0;
    ES = 1;
}
/***********************************************************************************/
void send_dat(uchar *k)
{
    static uchar i,j;
    ES = 0;
    for(j = 0;j <= 4;j++)        //发送5次
    {
        p2240_e();                //发射同步码
        for(i = 0;i < 24;i++)    //发送24个数据
        {
            PUTF(k);
        }
    }
    ES = 1;
}
/***********************************************************************************/
void init()
{
    TMOD = 0x21;           
    SCON = 0x50;
    TH1 = TL1 = 0xFD;            //11.0592MHz波特率设为9600
    TH0 = TL0 = 0x00;
    TR0 = RI = TI = 0;            //清发送标志
    ET0 = TR1 = ES = EA = 1;
}
/***********************************************************************************/
bit UART_RI = 0;
void main()
{
    P2240 = 0;
    init();
    while(1)
    {
        if(UART_RI)
        {
            UART_RI = 0;
            test();    //发射数据
        }
        if(!k1)//撒防
        {
            Delay10ms();
            if(!k1)//撒防
            {
                send_dat( & k1dat);
            }
            while(!k1);
        }
        if(!k2)//寻车
        {
            Delay10ms();
            if(!k2)//寻车
            {
                send_dat( & k2dat);
            }
            while(!k2);
        }
        if(!k3)//启动
        {
            Delay10ms();
            if(!k3)//启动
            {
                send_dat( & k3dat);
            }
            while(!k3);
        }
        if(!k4)//设防
        {
            Delay10ms();
            if(!k4)//设防
            {
                send_dat( & k4dat);
            }
            while(!k4);
        }
    }
}
/***********************************************************************************/
void ser() interrupt 4//以下方式不用个定时器来检测丢包
{
    uint bt;uchar i;
    ES = 0;
    if(RI)
    {   
        for(i = 0;i < RxIn;i++)    //接收24数据   
        {
            for(bt = 0;(bt < 200)&&(!RI);bt++);//判断bt本身和RI后再加bt  
            if(bt >= 199)    //接收超时,结束接收
            {
                if(SBUF_DATA[24]== 'E')
                {
                    UART_RI = 1;
                }
                break;
            }
            RI = 0;
            SBUF_DATA = SBUF;
        }
        if(SBUF_DATA[24]== 'E')
        {
            UART_RI = 1;
        }
        else
        {
            UART_RI = 0;        //接收成功标志位置1
        }
    }
    else if(TI) TI = 0;    //如果是发送中断将标志位清0
    ES = 1;
}
/***********************************************************************************/
void Timer1() interrupt 1//TR0
{
    TR0 = 0;
}
/***********************************************************************************/

发表于 2013-6-12 12:36 | 显示全部楼层
这个是单片机io驱动红外发射管发送红外编码的吗?呵呵支持。。。
程序看着挺好。
现在新型的单片机已经自带ir DA协议,红外调制只要设几个寄存器就行,发数据就直接扔寄存器里就发出去了。STM全线支持irDA
发表于 2013-6-12 17:00 来自手机 | 显示全部楼层
你用什么解码呀?
发表于 2013-6-12 17:02 来自手机 | 显示全部楼层
你用什么解码呀?
 楼主| 发表于 2013-7-14 14:13 | 显示全部楼层
gaojxp 发表于 2013-6-12 17:02
你用什么解码呀?

上面的是发码过程,已然有了发码的编码时序,解码嘛你可以参考https://www.yleee.com.cn/thread-6632-1-1.html让PT2262无线解码不再神秘,让菜鸟们都能做解码程序

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-6-11 03:35 , Processed in 0.073692 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表