| 
  |||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe  | 
  
這一個數(shù)據(jù)折騰了我五天 | 
  
| 作者:ihafd 欄目:單片機 | 
因為這個數(shù)據(jù),折騰了我5天,每天起床第一時間就開始想:為什么.但一直找不到原因,為個數(shù)據(jù)我感到非常失敗啊! 程序可能有點不好看,但只要做過遙控器解碼的朋友一看就懂了。很簡單的。請幫幫小弟吧,無限感激! 我的做法是如下: 把一個數(shù)據(jù)(8位)通過無線模塊發(fā)射出去.然后接收下來,距離100米,然后通過LED顯示就可以了.多么簡單的一個電路啊! 無線模塊是不帶編碼的那種,只有一個數(shù)據(jù)腳,我把要發(fā)的數(shù)據(jù)用單片機參考SAA3010遙控編碼格式編碼后發(fā)送.然后接收就參考了程序匠人的<關于狀態(tài)機的SAA3010解碼程程>.做解碼. 總體上是正常的.可以順利收發(fā)數(shù)據(jù),但有一種數(shù)據(jù)就老是接收失敗.如果這個數(shù)據(jù)最后三位是011那就會接收失敗,例如:0x03、0x33、0xBB.等都收不到。為什么。? //**數(shù)據(jù)發(fā)送程序****// //數(shù)據(jù)編碼完全按照SAA3013遙控編碼芯片格式編碼編寫 //用示波器分析過。發(fā)送數(shù)據(jù)沒有錯。 #include<reg51.h> typedef unsigned CHAR uCHAR; typedef unsigned int uint; void delay(uCHAR i); //短延時 void longdelay(uCHAR i);//長延時。 uCHAR data_code,d1,TEMP,dd;//全局變量。 sbit RX=P3^7; //數(shù)據(jù)輸出口。 void sent_begin(); //發(fā)送開始碼 void sent_data(uCHAR i);//發(fā)送數(shù)據(jù)碼。 void sent1(); //發(fā)送1 void sent0(); //發(fā)送0。 sbit key1=P3^7; sbit key2=P1^6; main() { uCHAR W1; TMOD=0x01; //下時器0方式1 TH0=0xFC; //844us延時。 TL0=0xBA; key1=1; longdelay(20); //0。5延時。 if(key2==1) key1=1; //0。5延時? else key1=0; longdelay(20); while(1) { dd=P1; //把P1口的數(shù)據(jù)發(fā)送出去。 for(W1=0;W1<2;W1++) { sent_begin(); //發(fā)開始碼。 sent_data(dd); //發(fā)數(shù)據(jù)碼。 delay(40); } } } //**********發(fā)送開始碼**********//[此數(shù)據(jù)格式按照SAA3010遙控編碼芯片編寫] void sent_begin() { uCHAR dd; TR0=1; RX=1; TF0=0; TH0=0xFC; TL0=0xBA; while(!TF0); RX=0; TF0=0; // 1243us TH0=0xFC; TL0=0xBA; while(!TF0); RX=1; TF0=0; //2087 (2087-1243=844)us TH0=0xFC; TL0=0xBA; while(!TF0); RX=0; TF0=0; //2931 TH0=0xFC; TL0=0xBA; while(!TF0); RX=1; TF0=0; //3775 TH0=0xFC; TL0=0xBA; while(!TF0); TF0=0; TH0=0xFC; TL0=0xBB; while(!TF0); for(dd=0;dd<4;dd++) { RX=0; TF0=0; //5464 (5463-3775= 1688)us TH0=0xFC; TL0=0xBA; while(!TF0); RX=1; TF0=0; //6308 TH0=0xFC; TL0=0xBD; while(!TF0); } RX=0; TF0=0; //1220us TH0=0xFC; TL0=0xD3; //適當咸小計數(shù)時間,留給下面的語句運行用。 while(!TF0); RX=0; } ////////////////////////////////////////////////////// //***********發(fā)送數(shù)據(jù)碼**************//{按照SAA3010遙控編碼芯片編寫] void sent_data(uCHAR i) { for(d1=0;d1<8;d1++) { TEMP=i<<d1; if((TEMP&0x80)==0x80) sent1(); else sent0(); } // RX=0; } //***發(fā)送1碼******// void sent1() { RX=0; TF0=0; //13065us (13065-12220=845)us TH0=0xFC; TL0=0xBA; while(!TF0); RX=1; TF0=0; //13909us TH0=0xFC; TL0=0xD7; //適當咸小定時時間,以供下面的語句運行使用。 while(!TF0); } //********發(fā)送0碼**********// void sent0() { RX=1; TF0=0; //14754us TH0=0xFC; TL0=0xBA; while(!TF0); RX=0; //15597us TF0=0; TH0=0xFC; TL0=0xDD; //適當咸小定時時間,以供下面的語句運行使用。 while(!TF0); } //****延時函數(shù)*****// void delay(uCHAR i) { uCHAR dd,tj; for(dd=3000;dd>0;dd--) for(tj=55;tj>0;tj--) for(;i>0;i--); } void longdelay(uCHAR i) { uint k1,k2; for(k1=500;k1>0;k1--) //500 for(k2=80;k2>0;k2--) for(;i>0;i--); } //**接收解碼程度********// #include<reg51.h> typedef unsigned CHAR uCHAR; uCHAR ykcode; // bit ykok; uCHAR ykbnum; //已接收數(shù)據(jù)收位。 uCHAR ykdelay; //數(shù)據(jù)延時接收。 uCHAR ykbtc; // 中斷時ykbtc=TH1. bdata uCHAR ykcodeTEMP; sbit ykcodeTEMP0=ykcodeTEMP^0; sbit YKIO=P3^2; //外部中斷0。 void YkInit(void); //初始化 uCHAR YkGetcode(void);//返回據(jù)據(jù)碼。 void led_show(uCHAR); //顯示。 bit YkTest(void); //檢查有沒有接收到數(shù)據(jù)。 //********初始化 void YkInit(void) { TMOD=0x11; SCON=0x00; TH1=0; TL1=0; IE|=0x89; IP|=0x01; //INTO中斷優(yōu)先。 TCON|=0x41; ykcodeTEMP=0; ykdelay=0; } //*********返回據(jù)據(jù)碼。 uCHAR YkGetcode(void) { return(ykcode); } //*********檢查有沒有接收到數(shù)據(jù)? bit YkTest(void) { return(ykok); } //*********接收中斷函數(shù)****************//[是參考程序匠人的基于狀態(tài)機的SAA3010解碼程序] void intx0() interrupt 0 using 2 { ykbtc=TH1; TH1=0;TL1=0;TR1=1;ET1=1; SWITCH(ykbnum) { case(0): ykbnum=1; break; case(1): if(ykbtc==6) {ykbnum=2;} else ykbnum=0; break; case(2): if(ykbtc==9||ykbtc==6) ykbnum=3; else ykbnum=0; break; case(3): if(ykbtc==9||ykbtc==6) ykbnum=4; else ykbnum=0; default: if(ykbnum<7) &nb  | 
  
| 2樓: | >>參與討論 | 
| 作者: ihafd 于 2006/4/29 14:03:00 發(fā)布:
         基本上是正常的. 就是,最后三位是011時才不能接收.  | 
  |
| 3樓: | >>參與討論 | 
| 作者: ihafd 于 2006/4/29 21:23:00 發(fā)布:
         還在調試中,還是找不到原因. !!  | 
  |
  | 
    
 
  | 
  
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |