標題: 433M無線STC單片機解碼程序,外部中斷方式 [打印本頁]

作者: haxiny    時間: 2023-2-13 11:22
標題: 433M無線STC單片機解碼程序,外部中斷方式
最近需要用到433M的單片機解碼,上網(wǎng)搜了一下。大部分的程序都是基于定時器定時檢測。感覺邏輯不夠嚴謹。對于新手理解起來也比較困難。
我首先開了一個us級的定時器,持續(xù)計數(shù)。不需要打開中斷。
然后配置好對應的接收芯片的管腳。配置為外部中斷。觸發(fā)方式為上升沿,下降沿都觸發(fā)。
在外部中斷函數(shù)里面,記錄當前定時器的計數(shù)值,然后清零計數(shù)器。
定義一個狀態(tài)機
state = 0時:默認狀態(tài),檢測是否為高電平。如果為高電平代表為上升沿,判斷同步信號。
state = 1時:檢測是否為低電平,如果為低電平,表示為下降沿,此時記錄的時間為高電平的持續(xù)時間。判斷是否符合同步信號的高電平時間要求。符合進入下一狀態(tài)
state = 2時:檢測管腳是否為高電平,如果為高電平,表示為上升沿,此時記錄的時間為低電平持續(xù)時間。判斷是否符合同步信號的低電平時間要求。符合進入接收狀態(tài)。不符合,回到初始狀態(tài)。
以此類推....具體可以看單片機程序

  1. #define SYNC_H_MIN   0           //同步信號高電平持續(xù)時間 最低范圍
  2. #define SYNC_H_MAX   600       //同步信號高電平持續(xù)時間 最高范圍


  3. #define SYNC_L_MIN  8000       //同步信號低電平持續(xù)時間的最小值
  4. #define SYNC_L_MAX  10997    //同步信號高電平持續(xù)時間的最大值,符合這個范圍都判定有效。


  5. #define DAT1_H_MIN     800    //數(shù)據(jù)1的高電平持續(xù)時間最小值  
  6. #define DAT1_H_MAX   1063   //數(shù)據(jù)1的高電平持續(xù)時間最大值
  7. #define DAT1_L_MIN      220    //數(shù)據(jù)1的低電平持續(xù)時間最小值
  8. #define DAT1_L_MAX    400     //數(shù)據(jù)1的低電平持續(xù)時間最大值   

  9. #define DAT0_H_MIN     220
  10. #define DAT0_H_MAX    400
  11. #define DAT0_L_MIN      800
  12. #define DAT0_L_MAX    1063
復制代碼

  1. uint32_t bitNums  = 0;    //已經(jīng)接收的位數(shù)。
  2. uint32_t valueTmp = 0;    //接收的數(shù)據(jù)。
  3. uint32_t value = 0;  

  4. void Ext_INT1 (void) interrupt INT1_VECTOR                //進中斷時已經(jīng)清除標志
  5. {
  6.                 uint8_t  de = 0;                                                    //管腳的狀態(tài)
  7.                 uint32_t holdTime  = 0;                                    //持續(xù)的時間
  8.                
  9.                 Timer1_Stop();
  10.                 holdTime  = (TH1<<8) | TL1;
  11.                 TH1= 0;TL1 =0;
  12.                 de = P33;            //讀取IO口狀態(tài)
  13.                 Timer1_Run();
  14.                

  15.                 switch(state)
  16.                 {
  17.                         case 0:               
  18.                                 if(de == 1)         //如果是高電平,那么是上升沿
  19.                                         state= 1;
  20.                         break;
  21.                         case 1:                        //同步頭高電平時間結束的時候
  22.                                 if( de == 0                //檢測到下降沿,并判斷持續(xù)的時間
  23.                                         && holdTime  >= SYNC_H_MIN
  24.                                         && holdTime  <= SYNC_H_MAX)
  25.                                 {
  26.                                         state = 2;
  27.                                 }
  28.                                 else
  29.                                 {
  30.                                         state = 1;
  31.                                 }
  32.                                        
  33.                         break;
  34.                         case 2:                //同步信號低電平時間結束時,上升沿
  35.                         {
  36.                                 if( de == 1
  37.                                         && holdTime >= SYNC_L_MIN
  38.                                         && holdTime <= SYNC_L_MAX)    //判斷同步低電平時間是否符合要求
  39.                                 {
  40.                     //符合要求,清0接收到的位數(shù)和數(shù)據(jù)。準備開始接收
  41.                                         bitNums = 0;   
  42.                                         valueTmp= 0;
  43.                                         state = 3;
  44.                                 }
  45.                                 else
  46.                                 {
  47.                     //不符合要求直接回到狀態(tài)1,不用回到狀態(tài)0,因為不需要判斷同步信號的高電平
  48.                     //持續(xù)時間,低電平滿足需求即可
  49.                                         state = 1;
  50.                                 }
  51.                         }
  52.                         break;
  53.                         case 3:                //信號高電平結束時
  54.                                 if(de == 0)
  55.                                 {
  56.                                         valueTmp <<= 1;
  57.                                        
  58.                                         if(holdTime >= DAT1_H_MIN && holdTime <= DAT1_H_MAX)
  59.                                         {
  60.                                                 valueTmp += 1;                //符合數(shù)據(jù)1的高部分
  61.                                                 state = 4;
  62.                                         }
  63.                                         else if(holdTime >= DAT0_H_MIN && holdTime <= DAT0_H_MAX)
  64.                                         {
  65.                                                                         //符合數(shù)據(jù)0的高部分
  66.                                                 state = 5;
  67.                                         }
  68.                                         else
  69.                                         {
  70.                                                 state = 1;
  71.                                                 break;
  72.                                         }
  73.                                         bitNums += 1;
  74.                                         if(bitNums >= 24)
  75.                                         {   
  76.                         value = valueTmp;       //保存接收到的數(shù)據(jù)。
  77.                                                 state = 1;
  78.                                         }
  79.                                 }
  80.                                 else
  81.                                 {

  82.                                         state = 1;
  83.                                 }
  84.                         break;
  85.                         case 4:                //判斷數(shù)據(jù)1的低電平時間是否符合要求
  86.                         {
  87.                                 if( de == 1
  88.                                         && holdTime >= DAT1_L_MIN
  89.                                         && holdTime <= DAT1_L_MAX)
  90.                                 {
  91.                     //符合數(shù)據(jù)1的低電平時間要求,回到3重新接收下一個數(shù)據(jù)。
  92.                                         state = 3;
  93.                                 }
  94.                                 else
  95.                                 {
  96.                                         state = 1;        
  97.                                 }
  98.                         }
  99.                         break;
  100.                         case 5:        //判斷數(shù)據(jù)0的低電平時間是否符合要求
  101.                         {
  102.                                 if( de == 1
  103.                                         && holdTime >= DAT0_L_MIN
  104.                                         && holdTime <= DAT0_L_MAX)
  105.                                 {
  106.                     //符合要求,接收下一個數(shù)據(jù)。
  107.                                         state = 3;
  108.                                 }
  109.                                 else
  110.                                 {
  111.                                         state = 1;
  112.                                 }
  113.                         }                        
  114.                         break;
  115.                         default:
  116.                                 state = 0;
  117.                         break;
  118.                 }
  119.         
  120. }
復制代碼


作者: yinds5092    時間: 2023-2-13 21:05
好使嗎?我看了好多的這個例子315一樣用嗎
作者: haxiny    時間: 2023-2-14 09:22
315的沒有試過。433的可以
作者: kissdb    時間: 2023-2-14 16:24
一般原因是外界的干擾太多了,使用中斷后,單片機根本就沒法做其他任務了
作者: grb7906    時間: 2023-2-14 21:16
超再生等模塊,全是噪聲,能正常解碼???
作者: haxiny    時間: 2023-2-16 09:21
grb7906 發(fā)表于 2023-2-14 21:16
超再生等模塊,全是噪聲,能正常解碼???

可以的。 沒有接收到是正常數(shù)據(jù)時,全是噪聲的
作者: lzwwry    時間: 2023-12-5 11:09
holdtime是100us增加一嗎
作者: 昨天的明天    時間: 2023-12-12 14:16
yinds5092 發(fā)表于 2023-2-13 21:05
好使嗎?我看了好多的這個例子315一樣用嗎

433,315跟軟件沒有關系的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1