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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助!單片機紅外接收異常 上電后第一次正常

[復制鏈接]
跳轉到指定樓層
樓主
ID:325735 發表于 2020-2-4 09:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
上電后第一次識別是正常的,第二次識別有一部分按鍵就會識別錯誤! 請高手指點下!

單片機源程序如下:

  1. #include "stc15f2k60s2.h"

  2. #include <intrins.h>

  3. #include "delay.h"
  4. #include "hongwaifashe.h"

  5. #define uchar        unsigned char
  6. #define UINT        unsigned int

  7. uchar setdata[3];//發送紅外用的   用戶碼 用戶碼 數據碼

  8. uchar IRtime;          //儲存檢測紅外高低電平持續時間
  9. uchar IRcord[4];  //儲存解碼后的4個字節數據
  10. uchar IRdata[33]; //包含起始碼在內的33位數據
  11. bit IRpro_ok;          //解碼后4個字節數據接收完成標志位
  12. bit IRok;                  //33位數據接收完成標志

  13. uchar RX_Data[]=0;        //用于串口1接收數據數組保存變量定義
  14. uchar TX_Data[]=0;

  15. //======================================================================
  16. /*        Variable definition */
  17. //======================================================================
  18. /* 串口1相關變量定義 */
  19. #define FOSC 22118400L        //系統晶振頻率(單位:HZ)
  20. #define BAUD 9600                //串口1波特率

  21. #define NONE_PARITY         0                                //無校驗
  22. #define ODD_PARITY         1                                //奇校驗
  23. #define EVEN_PARITY         2                                //偶校驗
  24. #define MARK_PARITY         3                                //標記校驗
  25. #define SPACE_PARITY 4                                //空白校驗
  26. #define PARITYBIT          NONE_PARITY        //定義校驗位(無校驗)

  27. #define S1_S0 0x40        //P_SW1.6
  28. #define S1_S1 0x80        //P_SW1.7

  29. UINT CNT_RX;        //用于串口1接收數據計數保存變量定義
  30. UINT DAT_RX;        //用于串口1接收數據保存變量定義
  31. UINT JDE_RX;        //用于串口1接收數據判斷保存變量定義
  32. UINT DAT_Check;        //用于串口1發送的HDT數據的校驗和計算保存變量定義

  33. /* 串口中斷變量定義 */
  34. uchar K,H;                                //用于循環計數變量定義




  35. //======================================================================
  36. /*        Function declaration */
  37. //======================================================================
  38. void INIT_UART(void);                //串口初始化子函數定義(定時器中斷2)
  39. void SEND_UART(uchar DAT);        //串口發送數據子函數定義


  40. /***********************************************************************/
  41. //======================================================================
  42. //        MAIN FUNCTION
  43. //======================================================================
  44. /***********************************************************************/

  45. void time0() interrupt 1
  46. {
  47.         IRtime++;//255us
  48.         
  49.                 if(IRtime==100)     {CNT_RX=0;                JDE_RX=1; }
  50.         
  51. }

  52. //外部中斷0 存入33次脈寬
  53. void int0() interrupt 0
  54. {
  55.         static uchar i;//靜態變量用于存入33次數據計數
  56.         static bit startflag;//開始儲存脈寬標志位
  57.         if(startflag)
  58.         {
  59.                 /*判斷引導碼,如果是引導碼則從起始碼開始存*/
  60.                 if((IRtime < 63) && (IRtime >= 33))        i = 0;                    //
  61.                 IRdata[i] = IRtime;//以TO溢出的次數來計算脈寬把這個時間存放在數組中
  62.                 IRtime = 0;//計數清零
  63.                 i++;//計數脈寬存入次數自加
  64.                 if(i == 33)           //i等于33那么就表示已經存入了33次脈寬
  65.                 {
  66.                         IRok = 1; //脈寬檢查完成
  67.                         i = 0;          //把脈寬計數清零準備下次存入
  68.                 }
  69.         }
  70.         else
  71.         {
  72.                 IRtime = 0;          //定時器0計數清零
  73.                 startflag = 1;//開始處理標志位置1
  74.         }

  75.                                 
  76.                                 
  77.                                 
  78. }

  79. //把提取的33次脈寬進行解碼 NEC協議
  80. void IRcordpro()
  81. {
  82.         uchar i;//i是用于計數處理4個字節
  83.         uchar j;//j用于計數處理1個字節的8位數據
  84.         uchar k;//k用于計數處理33次脈寬
  85.         k = 1;//從第一位脈寬開始處理,丟掉起始碼
  86.         for(i = 0; i < 4; i++)
  87.         {
  88.                 for(j = 0; j < 8; j++)
  89.                 {
  90.                         //如果脈寬大于數據0標準的1125us那么就判定為數據1
  91.                         if(IRdata[k] > 5      
  92.                                                                                                 
  93.                                                                                                               ) IRcord[i] |= 0x80;//寫1
  94.                         //只能右移7次,如果右移8次則會把第一位數據移出去
  95.                         if(j < 7) IRcord[i] >>= 1;
  96.                         k++; //處理下一次脈寬
  97.                 }
  98.         }
  99.         IRpro_ok = 1;//解碼完成
  100. }




  101. void main(void)
  102. {
  103.     /*===========================================================
  104.     ===========================================================*/
  105.         //上電,IO口初始化
  106.         P3M1=0x00; P3M0=0x00;        //準雙向IO口
  107.         P5M1=0x00; P5M0=0xff;        //推挽
  108.         P3=P5=0xFF;

  109.     //上電,定時器中斷0初始化
  110.            AUXR|=0x80;        //定時器時鐘為1T模式
  111.     TMOD&=0xF0;        //定時計數器0, 工作方式1
  112.     TL0 = 0xF8;                //設置定時初值
  113.           TH0 = 0xE9;                //設置定時初值                //設置定時初值  255us
  114.           ET0=1;            //允許定時/計數器0 中斷
  115.     TR0=1;            //啟動定時/計數器0 中斷
  116.         
  117.         
  118.      //上電,允許外部中斷0
  119.       IT0 = 1;//設置外部中斷0跳變沿觸發方式
  120.       EX0 = 1;//開外部中斷0中斷
  121.         
  122.         
  123.     //上電,串口中斷初始化
  124.     INIT_UART();        //串口中斷初始化
  125.                
  126.            EA=1;                        //打開總中斷
  127.         
  128.         /*===========================================================
  129.     ===========================================================*/        
  130.         while(1)
  131.         {
  132.                 uchar i; //計數串口發送字節數

  133.                
  134.                  if(IRok)//判斷33次脈寬是否提取完成
  135.                 {
  136.                          IRcordpro();//根據脈寬解碼出4個字節的數據
  137.                         IRok = 0;//清零脈寬檢查完成標志位等待下一次脈寬檢查
  138.                         if(IRpro_ok)//判斷解碼是否完成
  139.                         {
  140.                                                                
  141.                                                                                                         
  142.                                                                                                         
  143.                                                                                                         
  144. //                                                                                                        if(   IRcord[2]==~IRcord[3] )                        
  145. //                                                                                                                                
  146. //                                                                                                                        {        
  147.                                                                                                                                  
  148.                                                                                                                                 
  149.                                                                                                                    for(i = 0; i < 4; i++) //串口發送4個字節數據

  150.                                                                                                                                              SEND_UART(IRcord[i]) ;

  151. //                                }
  152. //                                                                                                
  153.                                                                                                                                  IRpro_ok = 0;//清零解碼標志位
  154.                                                                                                         
  155.                                                                                                         
  156.                                                                                                                    for(i = 0; i < 4; i++){
  157.                                  IRdata[i]=0;}
  158.                                                                                                         
  159.                         }
  160.                 }
  161.                
  162.                         

  163.                
  164.         
  165.         if(JDE_RX==2)   // 接收到指令
  166.        {
  167.                      
  168.                        if(RX_Data[1]==0xf1)
  169.                        
  170.                                                                  
  171.                        {
  172.         
  173.                    setdata[0]=  RX_Data[2] ;
  174.              setdata[1]=  RX_Data[3] ;
  175.              setdata[2]=  RX_Data[4] ;
  176.         
  177.                     hongwaifashe(  );


  178.                                                                  JDE_RX=1;   //  允許接收
  179.                                                                     CNT_RX=0;   // 接收數量清零
  180.                                                                  
  181.          }

  182.                  }                 
  183.                                  
  184.                                  
  185.                                  

  186.    }//while
  187.         
  188. }//main


  189. /***********************************************************************/
  190. //======================================================================
  191. //        UART interrupt service routine
  192. //  數據格式:0xFF,0x0A,0x05,0x06,0x00,0x00
  193. //======================================================================
  194. /***********************************************************************/
  195. void Uart_Isr() interrupt 4 using 1
  196. {
  197.         if(RI)
  198.   {
  199.                 RI=0;                                //清除RI位
  200.                 DAT_RX=SBUF;        //讀取串口1數據
  201.                
  202.                 /* 串口1接收數據和判斷數據結束 */
  203.                 if(JDE_RX==1)        //接收數據保存判斷
  204.                 {
  205.                         IRtime=0;  //計時器清零
  206.                         
  207.                         if((DAT_RX==0xFA)&(CNT_RX==0))         //避免少發數據出錯情況           每次接到FA 就會清空
  208.                         {
  209.                                                                                                                                                 
  210.                                 for(K=0;K<8;K++){RX_Data[K]=0;}        //串口接收的數據清0
  211.                   }
  212.                                                         
  213.                         RX_Data[CNT_RX]=DAT_RX;
  214.                         
  215.                         CNT_RX++;  //接收數量+1
  216.                         
  217.                         if(CNT_RX==5)  //接收5個字節
  218.                         {
  219.                                    
  220.                                 JDE_RX=2;                //串口接收數據判斷變量置2 接收完畢
  221.                         }
  222.                         
  223.                         
  224.                         
  225.                 }
  226.                
  227.   }
  228.         //if(TI){ TI=0; }        //清除TI位
  229. }



  230. /***********************************************************************/
  231. //======================================================================
  232. //  子函數定義
  233. //======================================================================
  234. /***********************************************************************/
  235. //串口初始化子函數定義(定時器中斷2)
  236. void INIT_UART(void)
  237. {
  238.         ACC = P_SW1;
  239.         ACC &= ~(S1_S0 | S1_S1);        //S1_S0=0 S1_S1=0
  240.         P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
  241.         
  242.         if(PARITYBIT==NONE_PARITY){ SCON = 0x50; }                                                                                                                //8位可變波特率
  243.         if((PARITYBIT==ODD_PARITY)|(PARITYBIT==EVEN_PARITY)|(PARITYBIT==MARK_PARITY)){ SCON = 0xda; }        //9位可變波特率,校驗位初始為1
  244.         if(PARITYBIT==SPACE_PARITY){ SCON = 0xd2; }                                                                                                                //9位可變波特率,校驗位初始為0
  245.         
  246.         PCON = 0x80;                                     //波特率不倍增
  247.         T2L = (65536-(FOSC/4/BAUD));        //設置波特率重裝值
  248.     T2H = (65536-(FOSC/4/BAUD))>>8;
  249.     AUXR |= 0x14;                                        //T2為1T模式, 并啟動定時器2
  250.     AUXR |= 0x01;                       //選擇定時器2為串口1的波特率發生器
  251.     ES = 1;                             //使能串口1中斷
  252. }


  253. //串口發送數據子函數定義
  254. void SEND_UART(UCHAR DAT)
  255. {
  256.         SBUF=DAT;
  257.         while(!TI);        //等特數據傳送
  258.         TI=0;                //清除數據傳送標志
  259. }
復制代碼





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

使用道具 舉報

沙發
ID:689921 發表于 2020-2-4 13:55 來自手機 | 只看該作者
各連接處固定后上電  接觸松動  造成局部電壓不穩
回復

使用道具 舉報

板凳
ID:689962 發表于 2020-2-4 15:41 | 只看該作者
我以前在學單片機,看著你的代碼感覺我自己要加油呀
回復

使用道具 舉報

地板
ID:325735 發表于 2020-2-4 18:10 | 只看該作者
電路沒有虛連的情況,只要上電第一次解碼  肯定是正常的,第2次開始 有一部分按鍵的數據或者數據反碼 就會出現一位的錯誤
就是說解碼部分運行一次就不正常了!~
回復

使用道具 舉報

5#
ID:325735 發表于 2020-2-4 18:12 | 只看該作者
而且我試過解碼成功發送完畢后,我從新執行一次上電初始化的內容也不管用
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产偷自在线观看 | 亚洲欧美综合 | 欧美精品一二区 | 亚洲欧美日韩精品久久亚洲区 | 久色网 | 国产在线一区二区 | 欧美日韩视频在线播放 | www.狠狠干 | 日韩欧美精品在线播放 | 国内精品久久久久久 | 亚洲成人免费 | 国产精品视频 | 荷兰欧美一级毛片 | 欧美成年人网站 | 日韩精品久久久久久 | 国产精品国产a | 色橹橹欧美在线观看视频高清 | 天堂男人av | 欧美精品一区二区在线观看 | 影音先锋中文字幕在线观看 | 高清人人天天夜夜曰狠狠狠狠 | 自拍偷拍在线视频 | 亚洲一区二区三区高清 | 黄色大片在线播放 | 蜜臀久久99精品久久久久野外 | www.久久艹| 九九天堂网 | 精品熟人一区二区三区四区 | 国产精品久久久久久一区二区三区 | 亚洲成人av | 国产精品1区 | 国产黄色小视频在线观看 | 国产一区二区三区在线看 | 国产999精品久久久久久 | 少妇精品久久久久久久久久 | av影音 | 日韩一区二区在线播放 | 国产一区二区自拍 | 精品乱人伦一区二区三区 | 国产视频中文字幕 | 在线色网|