音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

[原創(chuàng)]C51紅外遙控解碼子程序

作者:lihai813 欄目:單片機

用了一個外部中斷和一個定時器。

感覺寫得太長,哆嗦一點。不過還好,能正確解碼。

/////////////////////////////////////////////////
/* 遙控外部0中斷******************************/
/////////////////////////////////////////////////
void int0remoter() interrupt 0
{
    TR1 = 0;//停止計時
    if(((TL1+TH1*256) == 0) || (connt >= 33))
    {
        connt = 0;
        TH1 = 0;
        TL1 = 0;
        TR1 = 1;
        return; //遙控第一次下降沿中斷
    }

    if(connt == 0 )
    {
        if(((TL1+TH1*256) > (13500-DELTA)) && ((TL1+TH1*256) < (13500+DELTA)))
        {
            connt++;
            TH1 = 0;
            TL1 = 0;
            TR1 = 1;
            return;//成功測到紅外頭,加1退出中斷
        }
        connt = 0;
        TR1 = 0;
        TH1 = 0;
        TL1 = 0;
        return;//沒有測到正確紅外頭,清0退出中斷
    }
/////////////////////////////////////////////////////
    if(connt != 0)
    {
        if(connt <= 8)
        {
            if(((TL1+TH1*256) > (1125-DELTA)) && ((TL1+TH1*256) < (1125+DELTA)))
            {
                ir_data1 >>= 1;
                connt++;
                TH1 = 0;
                TL1 = 0;
                TR1 = 1;
                return;//讀到0退出中斷
            }
            if(((TL1+TH1*256) > (2250-DELTA)) && ((TL1+TH1*256) < (2250+DELTA)))
            {
                ir_data1 >>= 1;
                ir_data1 |= 0x80;
                connt++;
                TH1 = 0;
                TL1 = 0;
                TR1 = 1;
                return;//讀到1退出中斷
            }
            connt = 0;
            TR1 = 0;
            TH1 = 0;
            TL1 = 0;
            return;//錯誤,清0退出中斷
        }
//////////////////////////////////////////////////////
        if(connt > 8 && connt <=16)
        {
            if(((TL1+TH1*256) > (1125-DELTA)) && ((TL1+TH1*256) < (1125+DELTA)))
            {
                ir_data2 >>= 1;
                connt++;
                TH1 = 0;
                TL1 = 0;
                TR1 = 1;
                return;//讀到0退出中斷
            }
            if(((TL1+TH1*256) > (2250-DELTA)) && ((TL1+TH1*256) < (2250+DELTA)))
            {
                ir_data2 >>= 1;
                ir_data2 |= 0x80;
                connt++;
                TH1 = 0;
                TL1 = 0;
                TR1 = 1;
                return;//讀到1退出中斷
            }
            connt = 0;
            TR1 = 0;
            TH1 = 0;
            TL1 = 0;
            return;//錯誤,清0退出中斷
        }
//////////////////////////////////////////////////////
        if(connt > 16 && connt <=24)
        {
            if(((TL1+TH1*256) > (1125-DELTA)) && ((TL1+TH1*256) < (1125+DELTA)))
            {
   &nb

2樓: >>參與討論
lihai813

注意:

程序中DELTA是誤差值250。

絕對本人原創(chuàng),希望大家支持,別忘了回帖頂上來。

3樓: >>參與討論
ynkmsj
恭喜!進步真快,可以用C編程了!你編的不算羅嗦,我編的3310遙控接收比你的還復雜,你這是什么型號的遙控?
提點建議:if(connt != 0),比較合理的寫法是if(!connt),connt是位變量,if語句判斷結果0為假,1為真,表面上看來if(connt == 0)、if(connt != 0)、if(connt != 1)、if(connt != 1)更好理解,但是,比較混亂,如果判斷connt為真:if(connt)就可以了,本論壇有C語言編程規(guī)范,寫的很好。
TL1+TH1*256的意思是TH1左移8次加TL1得到INT型數(shù)據(jù),比較費機器周期,建議你用聯(lián)合。
4樓: >>參與討論
lihai813

還是得謝謝版主你的指點啊,我這段時間利用休息時間學習了一下,一點點的做,到今天我把一個電子鐘總算是全做好了,功能是:4位數(shù)碼管平時顯示小時和分鐘,接收到遙控時解碼并顯示系統(tǒng)碼和地址碼3秒后再顯示時間。還是用2個按鍵調時間,遙控接收和按鍵都會有蜂鳴器提示,整點也是蜂鳴提示。

我這遙控就是家里一般彩電DVD機的遙控器啊,9MS+4.5MS的頭那種。

不好意思,我的那CONNT不是位變量,是一個CHAR變量,一些語句的寫法怎么才更好,可能要慢慢來,呵呵。希望以后還是要多多指點。

TH1+TH1*256要怎么樣來聯(lián)合??

5樓: >>參與討論
ynkmsj

哦,connt是CHAR變量,那你初學C寫成if( connt != 0x00 ),一眼就能看出connt是CHAR變量,不過,這是個習慣問題,C語言的書寫太隨意了。

聯(lián)合好久沒有用過了,從我的程序里復制了一段:

先定義聯(lián)合數(shù)組
uCHAR w ,u ;
union {
           uint i ;
           uCHAR a[2] ;
         }xyz ;

執(zhí)行下面的程序i就可以得到由TH1、TH0組合的int數(shù)據(jù):

uint i ;
xyz.a[0] = TH0;
xyz.a[1] = TL0;
i = xyz.i ;

別看程序羅嗦,匯編部分極簡單,不需要任何運算就得到int數(shù)據(jù)。

6樓: >>參與討論
藍夢天蝎
謝謝……    樓主充分貫徹了網(wǎng)絡的最大優(yōu)點——資源共享~~~
7樓: >>參與討論
vcdii
精彩!精彩!再精彩!互相切磋切磋再切磋,彼此鼓歷再鼓歷,我來自MIT
8樓: >>參與討論
lihai813

怎么好的帖子還給沉下去了?

9樓: >>參與討論
zhanshen

TH1+TH1*256要怎么樣來聯(lián)合?

是什么意思。


10樓: >>參與討論
lihai813

版主說的可能是C里面的結構,把多個變量組合起來,我沒用過,也不懂,以后再研究這個。

11樓: >>參與討論
qilihuaqiqi

很不錯哦

還有好多看不怎么明白

12樓: >>參與討論
zwt659
是長了點了,改后在發(fā)一次,呵。。。。。。。。。。。。
13樓: >>參與討論
lihai813

好,我就把我改過後的發(fā)出來!

/////////////////////////////////////////////////
/* 遙控外部0中斷******************************/
/////////////////////////////////////////////////
void int0remoter() interrupt 0
{
TR1 = 0;//停止計時
if(((TL1+TH1*256) == 0) || (connt >= 33))
{
  connt = 0;
  TH1 = 0;
  TL1 = 0;
  TR1 = 1;
  return; //遙控第一次下降沿中斷
}
////////////////////////////////////////
if(connt == 0 )
{
  if(((TL1+TH1*256) > (13500-DELTA)) && ((TL1+TH1*256) < (13500+DELTA)))
  {
   connt++;
   TH1 = 0;
   TL1 = 0;
   TR1 = 1;
   return;//成功測到紅外頭,加1退出中斷
  }
  connt = 0;
  TH1 = 0;
  TL1 = 0;
  TR1 = 0;
  return;//沒有測到正確紅外頭,清0退出中斷
}
///////////////////////////////////////
if(connt >= 1 && connt < 9)
{
  ir_data1 >>= 1;
  ir_data1 |= ir_read_one_bit();
  return;
}
///////////////////////////////////////////
if(connt >= 9 && connt < 17)
{
  ir_data2 >>= 1;
  ir_data2 |= ir_read_one_bit();
  return;
}
//////////////////////////////////////////
if(connt >= 17 && connt < 25)
{
  ir_data3 >>= 1;
  ir_data3 |= ir_read_one_bit();
  return;
}
///////////////////////////////////////////
if(connt >= 25 && connt < 33)
{
  ir_data4 >>= 1;
  ir_data4 |= ir_read_one_bit();
  if(connt == 33) ir_succeed();
  return;
}
}
//////////////////////////////////////////////////////
void ir_succeed()
{  
if((IR_SYSCODE1 == ir_data1) && (IR_SYSCODE2 == ir_data2))
{
  if(ir_data3 == ~ir_data4)
  {
   ir_data = ir_data3;
   ir_enable = 1;
  }
}
}
/////////////////////////////////////////////////////
unsigned CHAR ir_read_one_bit()
{
if(((TL1+TH1*256) > (1125-DELTA)) && ((TL1+TH1*256) < (1125+DELTA)))
{
  connt++;
  TH1 = 0;
  TL1 = 0;
  TR1 = 1;
  return(0x00);//讀到0退出
}
if(((TL1+TH1*256) > (2250-DELTA)) && ((TL1+TH1*256) < (2250+DELTA)))
{
  connt++;
  TH1 = 0;
  TL1 = 0;
  TR1 = 1;
  return(0x80);//讀到1退出
}
connt = 34;//這樣下次中斷產(chǎn)生時認為是新的遙控
TH1 = 0;
TL1 = 0;
TR1 = 0;
return(0xff);//錯誤,退出
}
//////////////////////////////////////////////////
void timer1_int() interrupt 3
{
connt = 0;
TR1 = 0;
TL1 = 0;
TH1 = 0;//定時中斷溢出清0
}

14樓: >>參與討論
我是誰

呵呵,很好,互相學習!

參與討論
昵稱:
討論內容:
 
 
相關帖子
請匯編高手指點
剛學單片機啊,好多不明白啊?
[分享]給大家看看國外這哥們做的表
報警種類設置程序一點疑問!誰會請指導
[求助]很簡單的問題,但我想不到```
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號