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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1982|回復: 4
打印 上一主題 下一主題
收起左側

單片機紅外遙控的程序修改,求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:100826 發表于 2021-3-26 16:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用STC15F104  紅外遙控  功能正常   需要修改 按鍵長按一直輸出低電平   放開恢復高電平  2路這個功能  其它不變有時間的老大幫忙修改

由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現方法與思路,理清頭緒后我自己來寫程序去實現


#include <STC15F104E.H>
#define CPU_Fosc 12//STC15F104E  
#define M   1//???1T??
#define Tc 250 //250us??
#define Th (65536-CPU_Fosc*Tc/M)/256
#define Tl (65536-CPU_Fosc*Tc/M)%256
#define uchar unsigned char
#define uint  unsigned int
#define ulong  unsigned long
/*
#define ma1 0xbf01 //???/???
*/

sbit K1=P3^0;//K1
sbit K2=P3^1;//K2
sbit K3=P3^2;//K3
sbit K4=P3^3;//K4
sbit KZ=P3^4;//繼電器1
sbit IR=P3^5; //紅外接收
bit  IR_ok,state;
ulong longcode;
uint OKCode;
uint Tick,step;
uchar  Count;
bit   IRsync;
bit   IRb,IRa,IR_ok;
void Delay(uint t);
uchar reverse8( uchar c );
void InitTimer();
void main()
{
    P3=0xff;
    InitTimer();
    while(1)
    {
        if(IR_ok)
        {
            if(OKCode==0xff5c) //
            {

                 KZ=~KZ;

            }
        

                          if(OKCode==0xff18) //K1
            {
                K1=0;
                Delay(50);
                K1=1;              
             }
                          if(OKCode==0xff1a) //K2
            {
                K2=0;
                Delay(50);
                K2=1;              
             }
                          if(OKCode==0xff1b) //K3
            {
                K3=0;
                Delay(50);
                K3=1;              
             }
                          if(OKCode==0xff17) //K4
            {
                K4=0;
                Delay(50);
                K4=1;            
             }


                        
            IR_ok=0;
        }
    }
}
void InitTimer()
{
    AUXR=0xc0;
    TMOD = 0x00;
    TH0=Th;
    TL0=Tl;
    EA=ET0=TR0=1;
}
void timer0() interrupt 1
{
    if(IR_ok)
    {
        return;
    }
    IRb = IRa;     //??????
    IRa = IR;     //??????
    ++step;
    if(IRb && !IRa)         //?????(???,???)
    {
        Tick = step;
        step=0;
        if(Tick>(14000/Tc))
        {
            IRsync=0;
        }
        else if(IRsync)
        {
            if(Tick>(3000/Tc))
            {
                IRsync=0;
            }
            else
            {
                longcode<<=1;
                if(Tick>(1500/Tc))
                {
                    longcode|=1;
                }
                if (--Count==0)
                {
                    uchar x,y;
                    x= longcode;
                    y= longcode>>8;
                    if(x=~y)
                    {
                        OKCode =longcode>>8;
                        OKCode=reverse8(OKCode/256)*256|reverse8(OKCode);
                        IRsync=0;
                        IR_ok=1;
                    }
                }
            }
        }
        else if(Tick>(13500/Tc-2)&&Tick<(13500/Tc+2))
        {
            IRsync=1;
            Count=32;
        }
    }
}
uchar reverse8( uchar c )
{
    c = ( c & 0x55 ) << 1 | ( c & 0xAA )>> 1;
    c = ( c & 0x33 ) << 2 | ( c & 0xCC )>> 2;
    c = ( c & 0x0F ) << 4 | ( c & 0xF0 )>> 4;
    return c;
}
void Delay(uint t)
{
    uchar a,b;
    for(; t>0; t--)
        for(b=222; b>0; b--)
            for(a=12; a>0; a--)
            {
                ;
            }
}                                                               


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:68800 發表于 2021-3-27 00:05 | 只看該作者
修改按鍵碼處理程序位置,檢測到處理碼就置低電平,然后開啟一個定時器。在一定時間內入果繼續檢測到這個碼就把定時器時間復位重新開始計時直到放開按鍵,定時器中斷后置高電平
回復

使用道具 舉報

板凳
ID:89515 發表于 2021-3-27 01:14 來自手機 | 只看該作者
這個與你的紅外解碼程序沒什么關系。當你按下某個按鍵時,單片機解碼,如果一直按下就是紅外連續按鍵功能,但鍵碼并沒有變,只要鍵碼沒變就一直輸出低電平就行了,按鍵釋放鍵碼歸零輸出高電平。前提是必須有連續按鍵的解碼功能,這個就多兩三行代碼。
回復

使用道具 舉報

地板
ID:897199 發表于 2021-3-27 10:08 | 只看該作者
中斷服務函數的問題,完成一個接收后,IR_OK=1,而前面又有if(IR_Ok) return,主程序未處理完遙控指令前,沒有執行IR_OK=0,所以程序不會再接收遙控信號。
回復

使用道具 舉報

5#
ID:100826 發表于 2021-3-28 12:06 | 只看該作者
xiaomo1513 發表于 2021-3-27 10:08
中斷服務函數的問題,完成一個接收后,IR_OK=1,而前面又有if(IR_Ok) return,主程序未處理完遙控指令前,沒 ...

是不是IR_OK=0改為IR_OK=1  就可以?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩av黄色 | 九九热免费观看 | 亚洲每日更新 | 精品一区二区三区四区在线 | 国产精品久久一区 | www狠狠干 | 精品伊人久久 | 91精品国产综合久久久久久丝袜 | 亚洲国产激情 | 日韩色在线 | 日本成人福利视频 | 日韩成人在线一区 | 国产91av视频在线观看 | 特级毛片 | 午夜影视网 | 国产精品国产精品国产专区不片 | 国产在线精品一区二区三区 | 国产免费一区二区三区 | 日韩a在线 | 亚洲欧美第一视频 | 九九99靖品| 国产精品久久久久久久免费观看 | 日韩在线视频一区 | 亚洲精品美女视频 | 午夜小视频免费观看 | 草久久久 | 国产精品欧美一区二区三区 | 精品亚洲一区二区 | 国产羞羞视频在线观看 | 一级毛片视频在线 | 国精产品一品二品国精在线观看 | av官网在线 | 日韩福利一区 | 一区二区中文 | 精品一区国产 | 91精品国产手机 | 中文字幕国产精品 | 久久天天综合 | 国产伦精品一区二区三毛 | 一区天堂| 中文字幕一区二区三区四区五区 |