找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请问大家,我用stc15单片机代替pt2272解码,为什么不能实现按键5按下电机开

[复制链接]
跳转到指定楼层
楼主
ID:803579 发表于 2020-7-29 09:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问大家,我用stc15单片机代替pt2272解码,为什么不能实现按键5按下电机开,松开电机停。现在是按下它就开,松开也停,但是长按的话就是电机有停顿,开了停然后又开,以下是我的代码,请大神帮忙看看怎么改。万分感谢,已经困扰我好多天了。
#include "PT2262.h"
#include "EEPROM.h"

uchar MA1,MA2,MA3;                   /*用来记录地址码(占16位)和键码(占8位)(MA1、MA2、MA3各8个bit位)*/
uchar TimeCount;
unsigned int TimeCount1=1;
unsigned int flag_key,flag;
unsigned int qq,FF,zz,W,vv;
extern unsigned int IN_COUNT;


void Init()
        {
         TMOD = 0x01;                 /*定时器T0,工作模式1,16位定时,不自动重装,TL0、TH0全用*/
         TR0  = 0;                       /*(可位寻址)关闭定时器T0运行*/
// EX1  = 1;                      /*允许外部中断1中断*/
         IT1  = 0;                       /*IT1=0 --上升沿和下降沿均可触发中断;  IT1=1  ----下降沿触发*/
         EA   = 1;                        /*(可位寻址)开启总中断*/
        }

void PT2262_R(void)     /*外部中断1入口函数*/
        {


                        /*PT2262发码为窄高+宽低+窄高+宽低=0    /宽高+窄低+宽高+窄低=1 /窄高+宽低+宽高+窄低=F
                         数值表示:    00 = 0 / 11 = 1 / 01 = F
                         反码表示:    11 = 0 / 00 = 1 / 10 = F(本例所用)*/
                        bit err = 0;
                        uchar I = 0;                   /*用来记录位数,正常会收到24位*/
                        uchar TL,TH;                          /*用来记录每位的低电平总时长*/
                        uint L,M,S,K;                  /*W用于学习锁码进入,识别单个遥控;*/
                        char bat[5]={0};
                /*判断是否想再次进入学习的状态*/       
                        if(P55 != 1)
                        {
                                /*以下语句用于:当按下学习键时进入学习状态,学习状态进入时间5s*/
                                if(W)
                                {
                                        studyInit1();
                                }
                        }
                        MA1=0;
//                        EX1 = 0;                                                                                  /*先关闭中断*/
                        TR0 = 1; /*启动定时器计数器0*/
                        if(TimeCount > 0)            /*当按键按下释放后该值不在赋值就同通过递减直到该值等于0*/
                                {
                                        TimeCount--;                        /*等于0后表示按键释放*/
                                               
                                }       
                        while(WuXian_IN == 0);       /*如果为0一直等待,等待高电平出现*/
                        while(I<24)                 /*共接收24位*/
                        {
                                        TR0 = 1;  
                                        while(WuXian_IN == 0);        /*等待高电平到来*/
                                        TL = TL0;
                                        TH = TH0;
                                        TH0 = TL0 = 0;             /*记录低电平长度*/
                                        L = TH;
                                        L = ((L << 8) + TL);    /*将计时器的高低8位合并*/
                                        if(I == 0)                 /*处理同步位*/
                                        {
                                                        if(L > 2360)          /*确认是引导头(判断同步位低电平时长31a)/2360*/
                                                        {
                                                                        M = L / 31;       /*M即4a亦即是窄电平的时长*/
                                                       
                                                        }
                                                        else                  /*不符合规则(出错)*/
                                                        {
                                                                         I = TR0 = TH0 = TL0 = 0;
                                                                        err = 1;
                                                                        break;
                                                        }
                                        }
                                        else
                                        {
                                         /* 短555 长1666
                                                        4.7M的振荡电阻时同步位的低电平时长为L=15378uS;即31a
                                                        4.7M的振荡电阻时窄电平时长为M=492uS;即4a
                                                        4.7M的振荡电阻时宽电平时长为1488uS即12a
                                                        以下语句即判断窄电平与宽电平的宽度是否合格
                         
                                                                窄电平时长为M即 M=4a;a为一个振荡频率, fosc=(2x1000x16/Rosc(KΩ))KHz,fosc单位为KHz, (Rosc为振荡电阻,单位为KΩ),则一个振荡周期T=1/fosc

                                                        例如常用振荡电阻为4.7M;则振荡频率a=fosc=1/(2x1000x16/4700)=6.8KHz ,则振荡周期T=1/6.8K=147uS,即窄电平M=a=4T=588us;则宽电平3xM=3a=1764us;

                                                        程序中窄电平的误差范围为正(M+M/4)负(M-M/4)一个振荡周期a=M/4;

                                                        程序中宽电平的误差范围为正(M * 3 + M / 2)负(M * 3 - M / 2) 两个振荡周期2a=M/2;
                                         */
                                                        if(((L < M - M / 4) && (L > M + M / 4)) || ((L < M * 3 - M / 2) && (L > M * 3 + M / 2)))  
                                                        {
                                                                /*如果窄电平小于4a与大小4a或宽电平小于12a与大小12a则表示出错*/
                                                                /* 窄电平的误差范围为正(M+M/4)负(M-M/4)一个振荡周期a=M/4;*/
                                                                         I = TR0 = TH0 = TL0 = 0;/*宽电平的误差范围为正(M * 3 + M / 2)负(M * 3 - M / 2) 两个振荡周期2a=M/2;*/
                                                                        err = 1;
                                                                        break;
                                                        }
                                        }
                                        while(WuXian_IN == 1);     /*等待低电平到来*/
                                        TH = TH0;
                                        TL = TL0;
                                        TH0 = TL0 = 0;
                                        L = TH;
                                        L = ((L << 8) + TL);       /*将计时器的高低8位合并*/
                                        /*以下语句即判断是窄电平是否合格(4.7M的振荡电阻时窄电平时长为492uS即4a)    */
                                        if(((L > (M - M / 4)) && (L < (M + M / 4))))/*如果此时为4a则本位为0  短492uS*/
                                        {                                           /*窄电平的误差范围为正(M+M/4)负(M-M/4)一个振荡周期a=M/4;*/
                                                        I++;
                                                        MA1 <<= 1;    /*本位置0*/
                                        }
                                        /*以下语句即判断宽电平是否合格(4.7M的振荡电阻时宽电平时长为1488uS即12a)    */
                                        else if(((L > (M * 3 - M / 2)) && (L < (M * 3 + M / 2))))/*如果此时为12a则本位为1  长1488uS*/
                                        {               /*宽电平的误差范围为正(M * 3 + M / 2)负(M * 3 - M / 2) 两个振荡周期2a=M/2;*/
                                                        I++;
                                                        MA1 <<= 1;
                                                        MA1++;                /*本位置1*/
                                        }
                                        else                    /*已不是4a也不是12a则不符合规表示出错*/
                                        {
                                                        I = 0;
                                                        TR0 = TH0 = TL0 = 0;
                                                        err = 1;
                                                        break;
                                        }
                                        if(I == 8)
                                        {
                                                MA3 = MA1; /*每二位对应PT2262的一个引脚,bit7/bit6二位对应PT2262的1脚,类推对应PT2262的1~4脚*/
                                                K=1;           /* 11 = 接+ / 00 = 接地 / 01 = 悬空*/
                                                /*以下if(W==0)语句作用:将PT2262的编码送进W,锁定编码,用途为锁定遥控编号*/
                                                if(W==0)
                                                        {
                                                                if(MA3)
                                                                {
                                                                        W=MA3;
                                                                        IapEraseSector(IAP_ADDRESS);
                                                                        Delay(10);
                                                                        IapProgramByte(IAP_ADDRESS, (BYTE)MA3);
                                                                }
                                                                K=0;
                                                        }
                                                        /*以下if(W)为:将新进入的遥控信号装在S*/
                                                if(W)
                                                {
                                                        S=MA3;
                                                }

                                        }
                                        if(I == 16)
                                        {
                                                MA2 = MA1;              /*每二位对应PT2262的一个引脚,bit7/bit6二位对应PT2262的5脚,类推*/
                                                                                                                                                /*对应PT2262的5~8脚 / 11 = 接+ / 00 = 接地 / 01 = 悬空*/
                                        }
                                        if(I == 24)               /*24位已收完则解码结束*/
                                        {
                                               
                                                /*以下if(S==W)为:断定进入的遥控信号是否为之前锁住的遥控编码*/
                                                if(S==W&&K==1)
                                                {               
//                                                        HL=MA1;
                                                        if(TimeCount == 0)    /*为0表示是新的一次按下对其进行处理,如过该值大于0表示已经按下不在处理*/
                                                        {       
                                                                        switch(MA1)
                                                                        {
                                                                                        case 0xC0:                                                                                                /*单键KEY1*/                          
                                                                                                        Delay_Nms(100);
                                                                                                        if(MA1==0xC0)
                                                                                                        {
                                                                                                               
                                                                                                                Uart_Send_String("K1\r\n");
                                                                                                                flag_key=1;zz=1;qq++;FF++;
                                                                                                                INT_CLKO |= 0x20;               /*(EX3 = 1)使能INT3中断*/
                                                                                                                IN_COUNT=0;
                                                                                                        }
                                                                                                        break;
                                                                                        case 0x30:                                                                                        /*单键KEY2*/     
                                                                                                        Delay_Nms(100);
                                                                                                        if(MA1==0x30)
                                                                                                        {
                                                                                                                Uart_Send_String("K2\r\n");
                                                                                                                flag_key=2;zz=1;
                                                                                                                IN_COUNT=0;qq++;FF++;
                                                                                                                INT_CLKO |= 0x20;
                                                                                                        }
                                                                                                        break;
                                                                                        case 0xF0:                                                                                /*单键KEY3*/   
                                                                                                        Delay_Nms(50);
                                                                                                        if(MA1==0xF0)
                                                                                                        {
                                                                                                                Uart_Send_String("K3\r\n");
                                                                                                                flag_key=3;zz=1;
                                                                                                                IN_COUNT=0;qq++;FF++;
                                                                                                                INT_CLKO |= 0x20;   
                                                                                                        }
                                                                                                        break;
                                                                                        case 0x0C:                                                                                /*单键KEY4*/   
                                                                                                        Delay_Nms(50);
                                                                                                        if(MA1==0x0C)
                                                                                                        {
                                                                                                                Uart_Send_String("K4\r\n");
                                                                                                                flag_key=4;zz=1;
                                                                                                                IN_COUNT=0;qq++;FF++;
                                                                                                                INT_CLKO |= 0x20;      
                                                                                                        }
                                                                                                        break;
//                                                                                        case 0xCC:                                                                                /*单键KEY5*/     
//                                                                                                        Delay_Nms(50);
//                                                                                                        if(MA1==0xCC)
//                                                                                                        {
////                                                                                                                P32=1;P11=0;
////                                                                                                                Uart_Send_String("K5\r\n");
//                                                                                                                flag_key=5;IN_COUNT=0;
//                                                                                                                INT_CLKO |= 0x20;              
//                                                                                                        }
//                                                                                                        break;
//                                                                                        case 0x3C:                                                                                /*单键KEY6*/     
//                                                                                                        Delay_Nms(50);
//                                                                                                        if(MA1==0x3C)
//                                                                                                        {
////                                                                                                                P32=0;P11=1;
////                                                                                                                Uart_Send_String("K6\r\n");
//                                                                                                                flag_key=6;IN_COUNT=0;
//                                                                                                                INT_CLKO |= 0x20;            
//                                                                                                        }
//                                                                                                        break;
                                                                                        case 0xFC:                                                                                /*单键KEY7*/   
                                                                                                        Delay_Nms(50);
                                                                                                        if(MA1==0xFC)
                                                                                                        {
                                                                                                               
                                                                                                                Uart_Send_String("K7\r\n");
                                                                                                                flag_key=7;IN_COUNT=0;
//                                                                                                                INT_CLKO |= 0x20;            
                                                                                                        }
                                                                                                        break;
                                                                                        case 0x03:                                                                                /*单键KEY8*/     
                                                                                                        Delay_Nms(50);
                                                                                                        if(MA1==0x03)
                                                                                                        {
                                                                                                               
                                                                                                                Uart_Send_String("K8\r\n");
                                                                                                                flag_key=8;IN_COUNT=0;
//                                                                                                                INT_CLKO |= 0x20;              
                                                                                                                                                                       
                                                                                                        }
                                                                                                        break;       
//                                                                                        case 0xc3:                                                                                /*组合键KEY8+KEY1*/
//                                                                                                        Delay_Nms(100);
//                                                                                                        if(MA1==0xc3)
//                                                                                                        {
//                                                                                                                Uart_Send_String("K8+K1\r\n");
//                                                                                                                flag_key=9;                               
//                                                                                                        }
//                                                                                                        break;
//                                                                                        case 0x33:                                                                                        /*组合键KEY8+KEY2*/
//                                                                                                        Delay_Nms(100);
//                                                                                                        if(MA1==0x33)
//                                                                                                        {
//                                                                                                                Uart_Send_String("K8+K2\r\n");
//                                                                                                                flag_key=10;                               
//                                                                                                        }
//                                                                                                        break;       
                                                                        }
                                                        }
                                                        if(TimeCount!=0)
                                                        {       
                                                                                if(MA1==0xc3)
                                                                                {
                                                                                        IN_COUNT=0;
//                                                                                        Uart_Send_String("K8+K1\r\n");
                                                                                        flag_key=9;       
                                                                                }
                                                                                if(MA1==0x33)
                                                                                {
                                                                                        IN_COUNT=0;
//                                                                                        Uart_Send_String("K8+K2\r\n");
                                                                                        flag_key=10;               
                                                                               
                                                                                }

                                                                                if(MA1==0xCC)
                                                                                {
                                                                                        P32=1;P11=0;
                                                                                        Uart_Send_String("K5\r\n");
                                                                                        TimeCount1=0;flag=5;
                                                                                        Timer2Init();         
                                                                                }
                                                       
                                                                                if(MA1==0x3C)
                                                                                {
                                                                                        P32=0;P11=1;
                                                                                        Uart_Send_String("K6\r\n");
                                                                                        TimeCount1=0;flag=6;       
                                                                                        Timer2Init();
                                                                                }
                                                        }
                                                }
                                        key1_function();
                                        TimeCount = 25;     /*PT2262每按一次会发出4组相同的编码防止按键没放开直在取反,保证按1次只做1次处理*/       
                                        break;
                                        }
                        }
                       
                        TR0 = TH0 = TL0 = 0;  /*关闭定时器T0,并重置TH0、TL0*/
        }
       
       
void t2int() interrupt 12           
{

                        char buf[10]={0};
                       
                        T2L = 0xCD;               
                        T2H = 0xD4;       
                       
                                TimeCount1++;                       
                                UART1_Init(9600);                       
                                        if(TimeCount1>2000)
                                        {
                                                TimeCount1=0;         
                                                        sprintf(buf,"int12:%d\r\n",TimeCount1);
                                                        Uart_Send_String(buf);
                                                        P11=0;P32=0;
                                                        IE2 &= 0xfb;  
                                        }
//IE2 &= 0xfb;
}


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

使用道具 举报

沙发
ID:804115 发表于 2020-7-29 12:07 | 只看该作者
你的代码太多太乱了,看不下去,给你提供下解决思路吧!
从电机停的原因查起来,弄明白你的电机在什么触发条件下停止转动,然后分析都是哪里进行了触发。

我没玩过2262和2272,所以不知道收发原理,我猜测有两种方式:
1. 按下按键后不松开,2262就会一帧一帧的连续发送按下此按键对应的值到2272,如果松开就停止发送,2272在一定时间后检测不到该键值数据后则认为按键释放;
2. 按下按键不松开,2262只发送一帧按下键值信息,松开时再发送一帧松开键值信息;
我认为第一种可能性更大,如果是第一种的话,那么你只需要好好理一下2272判断按键释放的那个检测时间是否不合理,导致判断到了释放,进而有停止电机转动。适当增大这个时间试试。
另外,你按下按键不松开时是否有抖动、无线信号是否稳定、代码中2272的解码过程和电机控制之间是否会互相抢MCU的时间,造成偶尔解码不正确出现比较大的收不到数据帧的空档期。
另外,你在中断中进行了串口初始化和串口输出数据,这是必然会影响低优先级程序解码的,因为他们属于比较大的延时。作为一个优秀的工程师,需要尽量避免中断中出现较长时间的处理任务。
祝你好运!
回复

使用道具 举报

板凳
ID:803579 发表于 2020-7-29 12:23 | 只看该作者
有人可以帮忙看看程序哪里有问题吗
回复

使用道具 举报

地板
ID:803579 发表于 2020-7-29 15:41 | 只看该作者
1692483014 发表于 2020-7-29 12:07
你的代码太多太乱了,看不下去,给你提供下解决思路吧!
从电机停的原因查起来,弄明白你的电机在什么触发 ...

按照你的方法可以,谢谢你
回复

使用道具 举报

5#
ID:804115 发表于 2020-8-1 02:31 | 只看该作者
啊h啊 发表于 2020-7-29 15:41
按照你的方法可以,谢谢你

哈哈,客气客气
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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