菜鸟做的无线开关(PT2262遥控器,315M超再生模块,软解码)

2020-01-20 19:11发布


(原文件名:0001.jpg)


(原文件名:0002.jpg)


(原文件名:0003.jpg)


(原文件名:0004.jpg)


#include "TYPEDEF.H"
#include "STC89C5X.H"
#include "INTRINS.H"

sfr P1M1 = 0x92;

#define ONSwitch()     P1M1 |= 0x10; P1_4 = 1
#define OFFSwitch()    P1M1 &= 0xEF; P1_4 = 0

INT8U RFLevel0;
INT8U RFLevel1;
INT8U RFStep;
INT8U RFBuf[25];
//
INT8U KeyAge;
INT8U KeyFlag;
INT8U SwitchState;
INT16U TimeOut;

//void Soft_Rst(void);
void SystemInit(void);
//INT8U  Read_Flash_Byte(INT16U addr);
//void Write_Flash_Byte(INT8U byte, INT16U addr);
//void Erase_Flash_Sector(INT16U addr);

/*
* Main function
*/
int main(void)
{
        SystemInit();
        while(1) {
                if(TF1) {
                        TF1 = 0;

                        RFLevel1 = RFLevel0;
                        RFLevel0 = P3 & 0x80;

                        if(RFStep == 0) {
                                if(RFLevel0 == 0) {
                                        RFBuf[0]++;
                                } else {
                                        if(RFBuf[0] >= 60) {
                                                RFBuf[++RFStep] = 1;
                                        } else {
                                                RFBuf[0] = 0;
                                        }
                                }
                        } else {
                                if(RFLevel0 != 0) {
                                        if(++RFBuf[RFStep] == 0) {
                                                RFStep   = 0;
                                                RFBuf[0] = 0;
                                        }
                                } else if(RFLevel1 != 0) {
                                        if(++RFStep > 24) {
                                                RFLevel0 = RFBuf[0] / 15;
                                                RFLevel1 = 0;
                                                if(RFBuf[1]  < RFLevel0) RFLevel1++;
                                                if(RFBuf[2]  > RFLevel0) RFLevel1++;
                                                if(RFBuf[3]  < RFLevel0) RFLevel1++;
                                                if(RFBuf[4]  > RFLevel0) RFLevel1++;
                                                if(RFBuf[5]  < RFLevel0) RFLevel1++;
                                                if(RFBuf[6]  > RFLevel0) RFLevel1++;
                                                if(RFBuf[7]  < RFLevel0) RFLevel1++;
                                                if(RFBuf[8]  > RFLevel0) RFLevel1++;
                                                if(RFBuf[9]  < RFLevel0) RFLevel1++;
                                                if(RFBuf[10] > RFLevel0) RFLevel1++;
                                                if(RFBuf[11] < RFLevel0) RFLevel1++;
                                                if(RFBuf[12] > RFLevel0) RFLevel1++;
                                                if(RFBuf[13] < RFLevel0) RFLevel1++;
                                                if(RFBuf[14] > RFLevel0) RFLevel1++;
                                                if(RFBuf[15] < RFLevel0) RFLevel1++;
                                                if(RFBuf[16] > RFLevel0) RFLevel1++;
                                                if(RFBuf[17] < RFLevel0) RFLevel1++;
                                                if(RFBuf[18] < RFLevel0) RFLevel1++;
                                                if(RFBuf[19] < RFLevel0) RFLevel1++;
                                                if(RFBuf[20] < RFLevel0) RFLevel1++;
                                                if(RFBuf[21] < RFLevel0) RFLevel1++;
                                                if(RFBuf[22] < RFLevel0) RFLevel1++;
                                                if(RFBuf[23] > RFLevel0) RFLevel1++;
                                                if(RFBuf[24] > RFLevel0) RFLevel1++;
                                                if(RFLevel1 >= 24) {
                                                        KeyAge++;
                                                        TimeOut  = 0;
                                                        RFStep   = 0;
                                                        RFBuf[0] = 0;
                                                        if((KeyFlag == 0) && (KeyAge >= 1)) {
                                                                KeyFlag = 1;
                                                                if(SwitchState == 0) {
                                                                        SwitchState = 1;
                                                                        ONSwitch();
                                                                } else {
                                                                        SwitchState = 0;
                                                                        OFFSwitch();
                                                                }
                                                        }
                                                }
                                        } else {
                                                RFBuf[RFStep] = 0;
                                        }
                                }
                        }
               
                        if(++TimeOut > 6000) {
                                TimeOut = 0;
                                KeyAge  = 0;
                                KeyFlag = 0;
                        }
                }
        }
}

/*
* Initializtion System
*/
void SystemInit(void)
{
        IE = 0x00;
        TMOD = 0x21;
        TH1  = 0xEC;
        TR1  = 1;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
60条回答
Clinging
1楼-- · 2020-01-21 00:18
发现了STC 11和12系列中断有BUG,如果中断间隔很小,频繁中断时容易死机,不知道大家有没碰到
cmyldd
2楼-- · 2020-01-21 05:07
我一直在用啊,没有发现问题啊
Jason022
3楼-- · 2020-01-21 06:53
 精彩回答 2  元偷偷看……
Clinging
4楼-- · 2020-01-21 07:29
回复【3楼】Jason022
-----------------------------------------------------------------------

我用中断,结果上电工作几分钟就死机了,后来只好放在main函数了,你说的多种遥控应该是指数据速率不一样的吧?要兼容,采集速率要做成动态的,根据同步头的长度动态调整采集速率。我用的是内部时钟,精度很差,1L的代码就是动态决定采集速率的
Clinging
5楼-- · 2020-01-21 09:21
回复【2楼】cmyldd
-----------------------------------------------------------------------

有个产品,串口中断很频繁(最快时大概1MS中断一次),用89C54,从未发现过问题,换成11F16,非常容易死机,原因至今没找到,晶体用的是32.768M的
xnliuxiwen
6楼-- · 2020-01-21 10:38
1MS中断一次?BAUD是多少?9600的话那基本上一直在处理串口中断?CPU还有时间做其它事情?