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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2374|回復: 6
收起左側

單片機紅外遙控的功能如何設置?程序有問題

[復制鏈接]
ID:473410 發表于 2019-2-18 17:59 | 顯示全部樓層 |閱讀模式
板子上有一個紅外線接受設備,以及一個遙控,就想用遙控上的各個按鍵實現不同的功能,設計了一個通過遙控上電源按鍵的開關來控制LED燈亮滅的小程序,但是燒上程序之后,只能實現一次LED燈的亮滅。就是一開始燈是滅的,按一下就亮了,然后無論怎么按都不滅,不明白是怎么回事,希望大家解答一下,或者能幫忙修改一下。初學51單片機,請多指教!

單片機源程序如下:
  1. /**************************************************************************************
  2. *                              紅外通信實驗                                                                                                  *
  3. 實現現象:下載程序后,數碼管顯示紅外遙控鍵值數據
  4. 注意事項:        紅外遙控器內的電池絕緣片一定要抽掉                                                                                                                                                         
  5. ***************************************************************************************/

  6. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  7.       

  8. typedef unsigned int u16;          //對數據類型進行聲明定義
  9. typedef unsigned char u8;

  10. sbit IRIN=P3^2;
  11. sbit led=P2^0;

  12. u8 IrValue[6];
  13. u8 Time;

  14. /*******************************************************************************
  15. * 函 數 名         : delay
  16. * 函數功能                   : 延時函數,i=1時,大約延時10us
  17. *******************************************************************************/
  18. void delay(u16 i)
  19. {
  20.         while(i--);      
  21. }


  22. /*******************************************************************************
  23. * 函數名         : IrInit()
  24. * 函數功能                   : 初始化紅外線接收
  25. * 輸入           : 無
  26. * 輸出                  : 無
  27. *******************************************************************************/

  28. void IrInit()
  29. {
  30.         IT0=1;//下降沿觸發
  31.         EX0=1;//打開中斷0允許
  32.         EA=1;        //打開總中斷
  33.         IRIN=1;//初始化端口
  34. }


  35. /*******************************************************************************
  36. * 函 數 名       : main
  37. * 函數功能                 : 主函數
  38. * 輸    入       : 無
  39. * 輸    出             : 無
  40. *******************************************************************************/
  41. void main()
  42. {      
  43.         IrInit();
  44.         while(1);
  45. }

  46. /*******************************************************************************
  47. * 函數名         : ReadIr()
  48. * 函數功能                   : 讀取紅外數值的中斷函數
  49. * 輸入           : 無
  50. * 輸出                  : 無
  51. *******************************************************************************/

  52. void ReadIr() interrupt 0
  53. {
  54.         u8 j,k;
  55.         u16 err;
  56.         Time=0;                                         
  57.         delay(700);        //7ms
  58.         if(IRIN==0)                //確認是否真的接收到正確的信號
  59.         {         
  60.                
  61.                 err=1000;                                //1000*10us=10ms,超過說明接收到錯誤的信號
  62.                 /*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時
  63.                 侯,程序死在這里*/      
  64.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過去                 
  65.                 {                       
  66.                         delay(1);
  67.                         err--;
  68.                 }
  69.                 if(IRIN==1)                        //如果正確等到9ms低電平
  70.                 {
  71.                         err=500;
  72.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過去
  73.                         {
  74.                                 delay(1);
  75.                                 err--;
  76.                         }
  77.                         for(k=0;k<4;k++)                //共有4組數據
  78.                         {                              
  79.                                 for(j=0;j<8;j++)        //接收一組數據
  80.                                 {

  81.                                         err=60;               
  82.                                         while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
  83.                                         {
  84.                                                 delay(1);
  85.                                                 err--;
  86.                                         }
  87.                                         err=500;
  88.                                         while((IRIN==1)&&(err>0))         //計算高電平的時間長度。
  89.                                         {
  90.                                                 delay(10);         //0.1ms
  91.                                                 Time++;
  92.                                                 err--;
  93.                                                 if(Time>30)
  94.                                                 {
  95.                                                         return;
  96.                                                 }
  97.                                         }
  98.                                         IrValue[k]>>=1;         //k表示第幾組數據
  99.                                         if(Time>=8)                        //如果高電平出現大于565us,那么是1
  100.                                         {
  101.                                                 IrValue[k]|=0x80;
  102.                                         }
  103.                                         Time=0;                //用完時間要重新賦值                                                      
  104.                                 }
  105.                         }
  106.                 }
  107.                 if(IrValue[2]!=~IrValue[3])
  108.                 {
  109.                         return;
  110.                 }
  111.         }
  112.         led=0;
  113.         if(IrValue[2]==45)                                //45為紅外遙控電源鍵的數值
  114.         {
  115.                 delay(100);
  116.                 if(IrValue[2]==45)                        //45為紅外遙控電源鍵的數值
  117.                         led=~led;
  118.         }                       
  119. }
復制代碼


回復

使用道具 舉報

ID:164602 發表于 2019-2-19 09:41 | 顯示全部樓層
紅外通訊中,很重要的是時間的判斷。
看了你的程序,與板子所給的例程沒什么變化,但你把延時程序改了,這就有很大的問題了。
原來的延時函數為:
void DelayMs(unsigned int x)   //0.14ms誤差 0us
{
unsigned char i;
  while(x--)
{
  for (i = 0; i<13; i++)
{}
}
}
你改成了:
void delay(u16 i)
{
        while(i--);      
}
但你的輸入只大了10倍,如原程序是70,你的新程序給了700,不夠啊
另外,延時函數時間的多少,與晶振有關哦

只有把這些時間段搞清楚,再改寫,怎么都有理的。
回復

使用道具 舉報

ID:96072 發表于 2019-2-19 10:02 | 顯示全部樓層
if(IrValue[2]==45)                        //45為紅外遙控電源鍵的數值                         led=~led;   這樣就可以
回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:473410 發表于 2019-2-19 15:12 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2019-2-19 09:41
紅外通訊中,很重要的是時間的判斷。
看了你的程序,與板子所給的例程沒什么變化,但你把延時程序改了,這 ...

我沒有改這個延時函數啊,原本的里程貌似就是這樣。你說的那個延時應該怎么改,我沒明白
回復

使用道具 舉報

ID:473410 發表于 2019-2-19 15:14 | 顯示全部樓層
HEIZI555 發表于 2019-2-19 10:02
if(IrValue[2]==45)                        //45為紅外遙控電源鍵的數值                         led=~le ...

不行啊,我試了,還是只能亮滅一次,之后一直亮
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜影院中文字幕 | 亚洲视频精品 | 国产精品国产亚洲精品看不卡15 | 99久久精品免费看国产高清 | 毛片区| 精品国产乱码久久久久久88av | 99精品在线免费观看 | 天堂一区 | 久久久久国产一级毛片 | 91视频网址| 日韩精品一区二区久久 | 一级片av | 亚洲人成在线观看 | 中文字幕欧美日韩一区 | 亚洲精品一区二区网址 | 欧美精品日韩精品国产精品 | 观看av| 日韩一区二区三区在线观看视频 | 精产国产伦理一二三区 | 亚洲综合色网站 | 欧美成人激情 | 亚洲激精日韩激精欧美精品 | 一区二区三区欧美在线 | 91精品国产91久久久久久 | 天天操天天操 | 欧美日韩国产一区 | 欧亚av在线| 成人av鲁丝片一区二区小说 | 亚洲电影一级片 | 国产亚洲欧美在线视频 | 国产精品成人一区二区三区 | 黄色三级毛片 | av网址在线播放 | 韩国av影院 | 老司机狠狠爱 | 国产成人精品a视频一区www | 日韩一区二区在线播放 | 美日韩精品 | 欧美二区三区 | 特级生活片 | 九色在线视频 |