久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1530|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)問大家,我用stc15單片機(jī)代替pt2272解碼,為什么不能實(shí)現(xiàn)按鍵5按下電機(jī)開

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:803579 發(fā)表于 2020-7-29 09:43 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
請(qǐng)問大家,我用stc15單片機(jī)代替pt2272解碼,為什么不能實(shí)現(xiàn)按鍵5按下電機(jī)開,松開電機(jī)停。現(xiàn)在是按下它就開,松開也停,但是長(zhǎng)按的話就是電機(jī)有停頓,開了停然后又開,以下是我的代碼,請(qǐng)大神幫忙看看怎么改。萬分感謝,已經(jīng)困擾我好多天了。
#include "PT2262.h"
#include "EEPROM.h"

uchar MA1,MA2,MA3;                   /*用來記錄地址碼(占16位)和鍵碼(占8位)(MA1、MA2、MA3各8個(gè)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;                 /*定時(shí)器T0,工作模式1,16位定時(shí),不自動(dòng)重裝,TL0、TH0全用*/
         TR0  = 0;                       /*(可位尋址)關(guān)閉定時(shí)器T0運(yùn)行*/
// EX1  = 1;                      /*允許外部中斷1中斷*/
         IT1  = 0;                       /*IT1=0 --上升沿和下降沿均可觸發(fā)中斷;  IT1=1  ----下降沿觸發(fā)*/
         EA   = 1;                        /*(可位尋址)開啟總中斷*/
        }

void PT2262_R(void)     /*外部中斷1入口函數(shù)*/
        {


                        /*PT2262發(fā)碼為窄高+寬低+窄高+寬低=0    /寬高+窄低+寬高+窄低=1 /窄高+寬低+寬高+窄低=F
                         數(shù)值表示:    00 = 0 / 11 = 1 / 01 = F
                         反碼表示:    11 = 0 / 00 = 1 / 10 = F(本例所用)*/
                        bit err = 0;
                        uchar I = 0;                   /*用來記錄位數(shù),正常會(huì)收到24位*/
                        uchar TL,TH;                          /*用來記錄每位的低電平總時(shí)長(zhǎng)*/
                        uint L,M,S,K;                  /*W用于學(xué)習(xí)鎖碼進(jìn)入,識(shí)別單個(gè)遙控;*/
                        char bat[5]={0};
                /*判斷是否想再次進(jìn)入學(xué)習(xí)的狀態(tài)*/       
                        if(P55 != 1)
                        {
                                /*以下語句用于:當(dāng)按下學(xué)習(xí)鍵時(shí)進(jìn)入學(xué)習(xí)狀態(tài),學(xué)習(xí)狀態(tài)進(jìn)入時(shí)間5s*/
                                if(W)
                                {
                                        studyInit1();
                                }
                        }
                        MA1=0;
//                        EX1 = 0;                                                                                  /*先關(guān)閉中斷*/
                        TR0 = 1; /*啟動(dòng)定時(shí)器計(jì)數(shù)器0*/
                        if(TimeCount > 0)            /*當(dāng)按鍵按下釋放后該值不在賦值就同通過遞減直到該值等于0*/
                                {
                                        TimeCount--;                        /*等于0后表示按鍵釋放*/
                                               
                                }       
                        while(WuXian_IN == 0);       /*如果為0一直等待,等待高電平出現(xiàn)*/
                        while(I<24)                 /*共接收24位*/
                        {
                                        TR0 = 1;  
                                        while(WuXian_IN == 0);        /*等待高電平到來*/
                                        TL = TL0;
                                        TH = TH0;
                                        TH0 = TL0 = 0;             /*記錄低電平長(zhǎng)度*/
                                        L = TH;
                                        L = ((L << 8) + TL);    /*將計(jì)時(shí)器的高低8位合并*/
                                        if(I == 0)                 /*處理同步位*/
                                        {
                                                        if(L > 2360)          /*確認(rèn)是引導(dǎo)頭(判斷同步位低電平時(shí)長(zhǎng)31a)/2360*/
                                                        {
                                                                        M = L / 31;       /*M即4a亦即是窄電平的時(shí)長(zhǎng)*/
                                                       
                                                        }
                                                        else                  /*不符合規(guī)則(出錯(cuò))*/
                                                        {
                                                                         I = TR0 = TH0 = TL0 = 0;
                                                                        err = 1;
                                                                        break;
                                                        }
                                        }
                                        else
                                        {
                                         /* 短555 長(zhǎng)1666
                                                        4.7M的振蕩電阻時(shí)同步位的低電平時(shí)長(zhǎng)為L(zhǎng)=15378uS;即31a
                                                        4.7M的振蕩電阻時(shí)窄電平時(shí)長(zhǎng)為M=492uS;即4a
                                                        4.7M的振蕩電阻時(shí)寬電平時(shí)長(zhǎng)為1488uS即12a
                                                        以下語句即判斷窄電平與寬電平的寬度是否合格
                         
                                                                窄電平時(shí)長(zhǎng)為M即 M=4a;a為一個(gè)振蕩頻率, fosc=(2x1000x16/Rosc(KΩ))KHz,fosc單位為KHz, (Rosc為振蕩電阻,單位為KΩ),則一個(gè)振蕩周期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)負(fù)(M-M/4)一個(gè)振蕩周期a=M/4;

                                                        程序中寬電平的誤差范圍為正(M * 3 + M / 2)負(fù)(M * 3 - M / 2) 兩個(gè)振蕩周期2a=M/2;
                                         */
                                                        if(((L < M - M / 4) && (L > M + M / 4)) || ((L < M * 3 - M / 2) && (L > M * 3 + M / 2)))  
                                                        {
                                                                /*如果窄電平小于4a與大小4a或?qū)掚娖叫∮?2a與大小12a則表示出錯(cuò)*/
                                                                /* 窄電平的誤差范圍為正(M+M/4)負(fù)(M-M/4)一個(gè)振蕩周期a=M/4;*/
                                                                         I = TR0 = TH0 = TL0 = 0;/*寬電平的誤差范圍為正(M * 3 + M / 2)負(fù)(M * 3 - M / 2) 兩個(gè)振蕩周期2a=M/2;*/
                                                                        err = 1;
                                                                        break;
                                                        }
                                        }
                                        while(WuXian_IN == 1);     /*等待低電平到來*/
                                        TH = TH0;
                                        TL = TL0;
                                        TH0 = TL0 = 0;
                                        L = TH;
                                        L = ((L << 8) + TL);       /*將計(jì)時(shí)器的高低8位合并*/
                                        /*以下語句即判斷是窄電平是否合格(4.7M的振蕩電阻時(shí)窄電平時(shí)長(zhǎng)為492uS即4a)    */
                                        if(((L > (M - M / 4)) && (L < (M + M / 4))))/*如果此時(shí)為4a則本位為0  短492uS*/
                                        {                                           /*窄電平的誤差范圍為正(M+M/4)負(fù)(M-M/4)一個(gè)振蕩周期a=M/4;*/
                                                        I++;
                                                        MA1 <<= 1;    /*本位置0*/
                                        }
                                        /*以下語句即判斷寬電平是否合格(4.7M的振蕩電阻時(shí)寬電平時(shí)長(zhǎng)為1488uS即12a)    */
                                        else if(((L > (M * 3 - M / 2)) && (L < (M * 3 + M / 2))))/*如果此時(shí)為12a則本位為1  長(zhǎng)1488uS*/
                                        {               /*寬電平的誤差范圍為正(M * 3 + M / 2)負(fù)(M * 3 - M / 2) 兩個(gè)振蕩周期2a=M/2;*/
                                                        I++;
                                                        MA1 <<= 1;
                                                        MA1++;                /*本位置1*/
                                        }
                                        else                    /*已不是4a也不是12a則不符合規(guī)表示出錯(cuò)*/
                                        {
                                                        I = 0;
                                                        TR0 = TH0 = TL0 = 0;
                                                        err = 1;
                                                        break;
                                        }
                                        if(I == 8)
                                        {
                                                MA3 = MA1; /*每二位對(duì)應(yīng)PT2262的一個(gè)引腳,bit7/bit6二位對(duì)應(yīng)PT2262的1腳,類推對(duì)應(yīng)PT2262的1~4腳*/
                                                K=1;           /* 11 = 接+ / 00 = 接地 / 01 = 懸空*/
                                                /*以下if(W==0)語句作用:將PT2262的編碼送進(jìn)W,鎖定編碼,用途為鎖定遙控編號(hào)*/
                                                if(W==0)
                                                        {
                                                                if(MA3)
                                                                {
                                                                        W=MA3;
                                                                        IapEraseSector(IAP_ADDRESS);
                                                                        Delay(10);
                                                                        IapProgramByte(IAP_ADDRESS, (BYTE)MA3);
                                                                }
                                                                K=0;
                                                        }
                                                        /*以下if(W)為:將新進(jìn)入的遙控信號(hào)裝在S*/
                                                if(W)
                                                {
                                                        S=MA3;
                                                }

                                        }
                                        if(I == 16)
                                        {
                                                MA2 = MA1;              /*每二位對(duì)應(yīng)PT2262的一個(gè)引腳,bit7/bit6二位對(duì)應(yīng)PT2262的5腳,類推*/
                                                                                                                                                /*對(duì)應(yīng)PT2262的5~8腳 / 11 = 接+ / 00 = 接地 / 01 = 懸空*/
                                        }
                                        if(I == 24)               /*24位已收完則解碼結(jié)束*/
                                        {
                                               
                                                /*以下if(S==W)為:斷定進(jìn)入的遙控信號(hào)是否為之前鎖住的遙控編碼*/
                                                if(S==W&&K==1)
                                                {               
//                                                        HL=MA1;
                                                        if(TimeCount == 0)    /*為0表示是新的一次按下對(duì)其進(jìn)行處理,如過該值大于0表示已經(jīng)按下不在處理*/
                                                        {       
                                                                        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每按一次會(huì)發(fā)出4組相同的編碼防止按鍵沒放開直在取反,保證按1次只做1次處理*/       
                                        break;
                                        }
                        }
                       
                        TR0 = TH0 = TL0 = 0;  /*關(guān)閉定時(shí)器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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:804115 發(fā)表于 2020-7-29 12:07 | 只看該作者
你的代碼太多太亂了,看不下去,給你提供下解決思路吧!
從電機(jī)停的原因查起來,弄明白你的電機(jī)在什么觸發(fā)條件下停止轉(zhuǎn)動(dòng),然后分析都是哪里進(jìn)行了觸發(fā)。

我沒玩過2262和2272,所以不知道收發(fā)原理,我猜測(cè)有兩種方式:
1. 按下按鍵后不松開,2262就會(huì)一幀一幀的連續(xù)發(fā)送按下此按鍵對(duì)應(yīng)的值到2272,如果松開就停止發(fā)送,2272在一定時(shí)間后檢測(cè)不到該鍵值數(shù)據(jù)后則認(rèn)為按鍵釋放;
2. 按下按鍵不松開,2262只發(fā)送一幀按下鍵值信息,松開時(shí)再發(fā)送一幀松開鍵值信息;
我認(rèn)為第一種可能性更大,如果是第一種的話,那么你只需要好好理一下2272判斷按鍵釋放的那個(gè)檢測(cè)時(shí)間是否不合理,導(dǎo)致判斷到了釋放,進(jìn)而有停止電機(jī)轉(zhuǎn)動(dòng)。適當(dāng)增大這個(gè)時(shí)間試試。
另外,你按下按鍵不松開時(shí)是否有抖動(dòng)、無線信號(hào)是否穩(wěn)定、代碼中2272的解碼過程和電機(jī)控制之間是否會(huì)互相搶MCU的時(shí)間,造成偶爾解碼不正確出現(xiàn)比較大的收不到數(shù)據(jù)幀的空檔期。
另外,你在中斷中進(jìn)行了串口初始化和串口輸出數(shù)據(jù),這是必然會(huì)影響低優(yōu)先級(jí)程序解碼的,因?yàn)樗麄儗儆诒容^大的延時(shí)。作為一個(gè)優(yōu)秀的工程師,需要盡量避免中斷中出現(xiàn)較長(zhǎng)時(shí)間的處理任務(wù)。
祝你好運(yùn)!
回復(fù)

使用道具 舉報(bào)

板凳
ID:803579 發(fā)表于 2020-7-29 12:23 | 只看該作者
有人可以幫忙看看程序哪里有問題嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:803579 發(fā)表于 2020-7-29 15:41 | 只看該作者
1692483014 發(fā)表于 2020-7-29 12:07
你的代碼太多太亂了,看不下去,給你提供下解決思路吧!
從電機(jī)停的原因查起來,弄明白你的電機(jī)在什么觸發(fā) ...

按照你的方法可以,謝謝你
回復(fù)

使用道具 舉報(bào)

5#
ID:804115 發(fā)表于 2020-8-1 02:31 | 只看該作者
啊h啊 發(fā)表于 2020-7-29 15:41
按照你的方法可以,謝謝你

哈哈,客氣客氣
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧洲精品一区 | 国产综合av | 日本一本在线 | 日本精品免费 | 欧美久久视频 | 99精品视频一区二区三区 | 色久影院 | 91麻豆精品国产91久久久更新资源速度超快 | 亚洲国产一区二区三区在线观看 | 国产一区在线免费观看视频 | 国产精品99久久免费观看 | 国产成人综合久久 | 97综合在线 | 国产区在线观看 | 狠狠干狠狠插 | 久久久久九九九女人毛片 | 无毛av| 精品一二区 | 日韩av黄色 | 一区二区三区免费 | 精品国产一区二区久久 | 视频一区二区三区中文字幕 | 国产日韩欧美二区 | 久久国| 97超碰免费 | 国产精品污www一区二区三区 | 91精品国产麻豆 | 久久99精品久久 | 视频一区二区在线观看 | 久久99久久久久 | 色天天综合 | 亚洲福利在线观看 | 国产成人aⅴ | 精品国产免费人成在线观看 | 日韩电影一区二区三区 | 中文字幕一区二区三区在线视频 | 午夜欧美日韩 | 在线观看国产精品视频 | 欧美日韩精品亚洲 | 久久久天堂 | 日韩福利一区 |