找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3105|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

433M無線STC單片機(jī)解碼程序,外部中斷方式

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:193324 發(fā)表于 2023-2-13 11:22 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
最近需要用到433M的單片機(jī)解碼,上網(wǎng)搜了一下。大部分的程序都是基于定時(shí)器定時(shí)檢測。感覺邏輯不夠嚴(yán)謹(jǐn)。對于新手理解起來也比較困難。
我首先開了一個(gè)us級的定時(shí)器,持續(xù)計(jì)數(shù)。不需要打開中斷。
然后配置好對應(yīng)的接收芯片的管腳。配置為外部中斷。觸發(fā)方式為上升沿,下降沿都觸發(fā)。
在外部中斷函數(shù)里面,記錄當(dāng)前定時(shí)器的計(jì)數(shù)值,然后清零計(jì)數(shù)器。
定義一個(gè)狀態(tài)機(jī)
state = 0時(shí):默認(rèn)狀態(tài),檢測是否為高電平。如果為高電平代表為上升沿,判斷同步信號。
state = 1時(shí):檢測是否為低電平,如果為低電平,表示為下降沿,此時(shí)記錄的時(shí)間為高電平的持續(xù)時(shí)間。判斷是否符合同步信號的高電平時(shí)間要求。符合進(jìn)入下一狀態(tài)
state = 2時(shí):檢測管腳是否為高電平,如果為高電平,表示為上升沿,此時(shí)記錄的時(shí)間為低電平持續(xù)時(shí)間。判斷是否符合同步信號的低電平時(shí)間要求。符合進(jìn)入接收狀態(tài)。不符合,回到初始狀態(tài)。
以此類推....具體可以看單片機(jī)程序

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


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


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

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

  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ìn)中斷時(shí)已經(jīng)清除標(biāo)志
  5. {
  6.                 uint8_t  de = 0;                                                    //管腳的狀態(tài)
  7.                 uint32_t holdTime  = 0;                                    //持續(xù)的時(shí)間
  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:                        //同步頭高電平時(shí)間結(jié)束的時(shí)候
  22.                                 if( de == 0                //檢測到下降沿,并判斷持續(xù)的時(shí)間
  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:                //同步信號低電平時(shí)間結(jié)束時(shí),上升沿
  35.                         {
  36.                                 if( de == 1
  37.                                         && holdTime >= SYNC_L_MIN
  38.                                         && holdTime <= SYNC_L_MAX)    //判斷同步低電平時(shí)間是否符合要求
  39.                                 {
  40.                     //符合要求,清0接收到的位數(shù)和數(shù)據(jù)。準(zhǔn)備開始接收
  41.                                         bitNums = 0;   
  42.                                         valueTmp= 0;
  43.                                         state = 3;
  44.                                 }
  45.                                 else
  46.                                 {
  47.                     //不符合要求直接回到狀態(tài)1,不用回到狀態(tài)0,因?yàn)椴恍枰袛嗤叫盘柕母唠娖?br />
  48.                     //持續(xù)時(shí)間,低電平滿足需求即可
  49.                                         state = 1;
  50.                                 }
  51.                         }
  52.                         break;
  53.                         case 3:                //信號高電平結(jié)束時(shí)
  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的低電平時(shí)間是否符合要求
  86.                         {
  87.                                 if( de == 1
  88.                                         && holdTime >= DAT1_L_MIN
  89.                                         && holdTime <= DAT1_L_MAX)
  90.                                 {
  91.                     //符合數(shù)據(jù)1的低電平時(shí)間要求,回到3重新接收下一個(gè)數(shù)據(jù)。
  92.                                         state = 3;
  93.                                 }
  94.                                 else
  95.                                 {
  96.                                         state = 1;        
  97.                                 }
  98.                         }
  99.                         break;
  100.                         case 5:        //判斷數(shù)據(jù)0的低電平時(shí)間是否符合要求
  101.                         {
  102.                                 if( de == 1
  103.                                         && holdTime >= DAT0_L_MIN
  104.                                         && holdTime <= DAT0_L_MAX)
  105.                                 {
  106.                     //符合要求,接收下一個(gè)數(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. }
復(fù)制代碼

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:914666 發(fā)表于 2023-2-13 21:05 | 只看該作者
好使嗎?我看了好多的這個(gè)例子315一樣用嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:193324 發(fā)表于 2023-2-14 09:22 | 只看該作者
315的沒有試過。433的可以
回復(fù)

使用道具 舉報(bào)

地板
ID:82067 發(fā)表于 2023-2-14 16:24 | 只看該作者
一般原因是外界的干擾太多了,使用中斷后,單片機(jī)根本就沒法做其他任務(wù)了
回復(fù)

使用道具 舉報(bào)

5#
ID:28752 發(fā)表于 2023-2-14 21:16 | 只看該作者
超再生等模塊,全是噪聲,能正常解碼???
回復(fù)

使用道具 舉報(bào)

6#
ID:193324 發(fā)表于 2023-2-16 09:21 | 只看該作者
grb7906 發(fā)表于 2023-2-14 21:16
超再生等模塊,全是噪聲,能正常解碼???

可以的。 沒有接收到是正常數(shù)據(jù)時(shí),全是噪聲的
回復(fù)

使用道具 舉報(bào)

7#
ID:1098406 發(fā)表于 2023-12-5 11:09 | 只看該作者
holdtime是100us增加一嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:287224 發(fā)表于 2023-12-12 14:16 | 只看該作者
yinds5092 發(fā)表于 2023-2-13 21:05
好使嗎?我看了好多的這個(gè)例子315一樣用嗎

433,315跟軟件沒有關(guān)系的
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表