找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4626|回复: 2
打印 上一主题 下一主题
收起左侧

315MPT2262软件解码,求大神指导程序修改,解码率很低

[复制链接]
跳转到指定楼层
楼主
ID:85091 发表于 2015-8-3 22:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/**************************************
*         PT2262软件解码              *
*           解码晶振4M                *
**************************************/
#include <STC12C5A60S2.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint irtime;
uchar dfnum; //接收次数
uchar dfstart;           //接收开始标志
uint dfdata[24];  //数据收集存放区
uchar dfcode[3];  //解码完成存放区
uchar bitnum;           //接收位选
uchar dfdataok;                //数据收集完成标志
uchar dfcodeok;                //解码完成标志
sbit LED1 = P0^1;  //前导码判断成功开始数据接收指示
sbit LED2 = P0^2; //解码指示
sbit LED3 = P0^3;//解码成功指示
sbit df_in = P3^2;
sbit LED01 = P1^0;
sbit LED02 = P1^1;
sbit LED03 = P1^2;
sbit LED04 = P1^3;
uchar b; //接收次数标志
/******************************************
*               延时函数                  *
******************************************/
void delay_ms(uint a)                //@12.000MHz
{
        unsigned char i, j;
        for(;a !=0 ; a--)
        {
                _nop_();
                _nop_();
                i = 12;
                j = 168;
                do
                {
                        while (--j);
                } while (--i);
        }
}
/*******************************
*          初始化定时器0       *
*******************************/
void time0init()
{
        TMOD = TMOD|0x01;  //设置定时器为16位
        TH0= 0;
        TL0 =0;
//        ET0 = 1;   //开启定时器0中断
        EA = 1;
        TR0 = 1;
}
/*******************************
*          初始化外部中断0     *
*******************************/
void INT0init()
{
        IT0 =1;          //设置下降延触发
        EX0 = 1;        //开启中断
        EA = 1;
}
/********************************************************************
*                            串口初始化                             *
*       速率:9600                     晶振:4M
********************************************************************/

void init_rs232()  
{
          PCON &= 0x7f;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xfe;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0f;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xF3;                //设定定时初值
        TH1 = 0xF3;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器

           REN = 0;    //开启串口数据接收功能

           EA = 1;           //开启总中断
           ES = 1;           //开启串口中断
           TR1 = 1;        //定时器启动   
}
/*******************************************************************
*                      串口数据传输函数                            *
*******************************************************************/

void datas_pass(uchar tring)
{
         
                   SBUF = tring;
                  while(~TI);
                   TI = 0;

}
/****************************
*          解码             *
****************************/
void dfpros(void)  //解码
{
        uchar k,i,j;
        uchar value;
        k = 0;
        for(j = 0 ; j<3 ;j++)
        {
                for(i = 0; i <8 ;i++)
                {
                        value =value>>1;
                        if(dfdata[k]>250)
                        {
                                 value =value|0x80;
                        }
                        k++;
                }
               
                dfcode[j] = value;

       
        }
        dfcodeok =1;

}
/*********************************
*            主函数              *
*********************************/
void main()
{
        uchar a;
        INT0init();
        time0init();
        init_rs232();
         LED1 = 1;  //前导码判断成功开始数据接收指示
        LED2 = 1; //解码指示
         LED3 = 1;
//        YS = 1;
        while(1)
        {
                 if(dfdataok == 1)
                 {
                        LED2 =~LED2;
                        dfpros();
                                a = dfcode[2];
                                datas_pass(a);
                        dfdataok = 0;
                 }
                 if(dfcodeok ==1)
                 {
                                 a = dfcode[2];
                                datas_pass(a);
                          if(a == 0x0c)
                          {
                                  LED01 = ~LED01;
                          }
                          if(a == 0xc0)
                          {
                                  LED02 = ~LED02;
                          }
                           if(a == 0x03)
                          {
                                  LED03 = ~LED03;
                          }
                           if(a == 0x30)
                          {
                                  LED04 = ~LED04;
                          }
                                dfcodeok =0;
                }
                 delay_ms(4);
        }
}
/****************************
*           定时器0         *
****************************/
void time0()interrupt 1
{
         irtime++;
}

/****************************
*           外部中断0       *
****************************/
void INT0i()interrupt 0
{
        uchar i;
         EX0 = 0;
         df_in =1;
         TH0 = 0;
         TL0 = 0;
         TR0 = 1;
                while(df_in==0&&TF0 ==0);
                while(df_in==1&&TF0==0);
                TR0 = 0;
                if(TF0 ==1)
                {
                        goto end;       
                }
                irtime = TH0;
                irtime =irtime <<8;
                irtime = irtime +TL0;
                if(irtime>3400&& irtime < 4300  ) //检测引导码
                {
                       
                        LED1 = ~LED1;
                        dfstart =1;       
                                       
                }
                else //同步头判断失败就直接退出程序
                {
                        goto end;       
                }

                if(dfstart == 1)   //同步头判断成功解码开始
                {       
                        for(i = 0;i<24;i++)
                        {
                        while(df_in == 1);
                                TH0 = 0;
                                 TL0 = 0;
                                TR0 = 1;
                                while(df_in==0);
                                TR0 = 0;
                                if(TF0 ==1)
                                {
                                        b=0;
                                        goto end;
                                }
                                irtime = TH0;
                                irtime =irtime <<8;
                                irtime = irtime +TL0;
                                dfdata[i] =irtime;
                                while(df_in == 1);
                         }
                        dfstart =0;  //数据收集完成将同步标志位置0。
                          if(b == 2)
                          {
                                dfdataok=1;
                                b =0;
                        }
                        b++;
                }
               
end:
        TF0=0;
        EX0 = 1;
        TR0 = 0;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:85091 发表于 2015-8-3 22:21 | 只看该作者
解码距离,和解码成功率都很低,这是怎么回事?
回复

使用道具 举报

板凳
ID:66287 发表于 2015-8-4 08:49 | 只看该作者
能正确解码,只是解码距离短,还是干扰所致,先换电源试试。有些人调试单片机时用电池供电就是基于这种考虑,解决后再攻关电源
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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