找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 31|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C52單片機(jī)遙控器加按鍵控制代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1151185 發(fā)表于 2025-6-17 18:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "IR.h"
#include "beep.h"
sbit key1=P3^1;   
unsigned char LEDNum; //如果不賦初值,結(jié)果也是0。放在這里是全局變量,其實(shí)它函數(shù)都可以調(diào)用。
unsigned char Address;
unsigned char Command;

void main()
{
    IR_Init();
    P2=~0x01;
        while(1)
        {
if(IR_GetDataFlag() || IR_GetRepeatFlag())        //如果收到數(shù)據(jù)幀或者收到連發(fā)幀        
                {
                Address=IR_GetAddress();                //獲取遙控器地址碼
                Command=IR_GetCommand();                //獲取遙控器命令碼                        
        if(Command==0x43)
                  {
                        
                        Command=0;//檢測(cè)松手
                 
                        beep_alarm(1000,10);
                        LEDNum++;//LEDNum自增位移
                        if(LEDNum>=8)//限制LEDNum自增范圍
                        LEDNum=0;//位移超過(guò)8位重新
                        P2=~(0x01<<LEDNum);//LED的第LEDNum位點(diǎn)亮         
                          
                  }        
          }

if( key1==0)//判斷第一次按下按鍵引腳的電平
{  
   delay(20);
   while(key1==1);//檢測(cè)松手
   delay(20);
   beep_alarm(1000,10);
   LEDNum++;//LEDNum自增位移
   if(LEDNum>=8)//限制LEDNum自增范圍
   LEDNum=0;//位移超過(guò)8位重新
   P2=~(0x01<<LEDNum);//LED的第LEDNum位點(diǎn)亮         
    }
   }
}

  1. #include <REGX52.H>
  2. #include "Timer0.h"
  3. #include "Int0.h"

  4. unsigned int IR_Time;
  5. unsigned char IR_State;

  6. unsigned char IR_Data[4];
  7. unsigned char IR_pData;

  8. unsigned char IR_DataFlag;
  9. unsigned char IR_RepeatFlag;
  10. unsigned char IR_Address;
  11. unsigned char IR_Command;

  12. /**
  13.   * @brief  紅外遙控初始化
  14.   * @param  無(wú)
  15.   * @retval 無(wú)
  16.   */
  17. void IR_Init(void)
  18. {
  19.         Timer0_Init();
  20.         Int0_Init();
  21. }

  22. /**
  23.   * @brief  紅外遙控獲取收到數(shù)據(jù)幀標(biāo)志位
  24.   * @param  無(wú)
  25.   * @retval 是否收到數(shù)據(jù)幀,1為收到,0為未收到
  26.   */
  27. unsigned char IR_GetDataFlag(void)//獲取數(shù)據(jù)標(biāo)志
  28. {      
  29.         if(IR_DataFlag>20)//收到數(shù)據(jù)幀時(shí)間
  30.         {   
  31.                 IR_DataFlag=0;
  32.                 return 1;
  33.         }
  34.         return 0;
  35. }

  36. /**
  37.   * @brief  紅外遙控獲取收到連發(fā)幀標(biāo)志位
  38.   * @param  無(wú)
  39.   * @retval 是否收到連發(fā)幀,1為收到,0為未收到
  40.   */
  41. unsigned char IR_GetRepeatFlag(void)//獲取重復(fù)標(biāo)志
  42. {
  43.         if(IR_RepeatFlag)
  44.         {   
  45.                 IR_RepeatFlag=0;
  46.                 return 1;
  47.         }
  48.         return 0;
  49. }

  50. /**
  51.   * @brief  紅外遙控獲取收到的地址數(shù)據(jù)
  52.   * @param  無(wú)
  53.   * @retval 收到的地址數(shù)據(jù)
  54.   */
  55. unsigned char IR_GetAddress(void)//獲取地址
  56. {
  57.         return IR_Address;
  58. }

  59. /**
  60.   * @brief  紅外遙控獲取收到的命令數(shù)據(jù)
  61.   * @param  無(wú)
  62.   * @retval 收到的命令數(shù)據(jù)
  63.   */
  64. unsigned char IR_GetCommand(void)//獲取命令
  65. {
  66.         return IR_Command;
  67. }

  68. //外部中斷0中斷函數(shù),下降沿觸發(fā)執(zhí)行
  69. void Int0_Routine(void) interrupt 0
  70. {
  71.         if(IR_State==0)                                //狀態(tài)0,空閑狀態(tài)
  72.         {
  73.                 Timer0_SetCounter(0);        //定時(shí)計(jì)數(shù)器清0
  74.                 Timer0_Run(1);                        //定時(shí)器啟動(dòng)
  75.                 IR_State=1;                                //置狀態(tài)為1
  76.         }
  77.         else if(IR_State==1)                //狀態(tài)1,等待Start信號(hào)或Repeat信號(hào)
  78.         {
  79.                 IR_Time=Timer0_GetCounter();        //獲取上一次中斷到此次中斷的時(shí)間
  80.                 Timer0_SetCounter(0);        //定時(shí)計(jì)數(shù)器清0
  81.                 //如果計(jì)時(shí)為13.5ms,則接收到了Start信號(hào)(判定值在12MHz晶振下為13500,在11.0592MHz晶振下為12442)
  82.                 if(IR_Time>12442-500 && IR_Time<12442+500)
  83.                 {
  84.                         IR_State=2;                        //置狀態(tài)為2
  85.                 }
  86.                 //如果計(jì)時(shí)為11.25ms,則接收到了Repeat信號(hào)(判定值在12MHz晶振下為11250,在11.0592MHz晶振下為10368)
  87.                 else if(IR_Time>10368-500 && IR_Time<10368+500)
  88.                 {
  89.                         IR_RepeatFlag=1;        //置收到連發(fā)幀標(biāo)志位為1
  90.                         Timer0_Run(0);                //定時(shí)器停止
  91.                         IR_State=0;                        //置狀態(tài)為0
  92.                 }
  93.                 else                                        //接收出錯(cuò)
  94.                 {
  95.                         IR_State=1;                        //置狀態(tài)為1
  96.                 }
  97.         }
  98.         else if(IR_State==2)                //狀態(tài)2,接收數(shù)據(jù)
  99.         {
  100.                 IR_Time=Timer0_GetCounter();        //獲取上一次中斷到此次中斷的時(shí)間
  101.                 Timer0_SetCounter(0);        //定時(shí)計(jì)數(shù)器清0
  102.                 //如果計(jì)時(shí)為1120us,則接收到了數(shù)據(jù)0(判定值在12MHz晶振下為1120,在11.0592MHz晶振下為1032)
  103.                 if(IR_Time>1032-500 && IR_Time<1032+500)
  104.                 {
  105.                         IR_Data[IR_pData/8]&=~(0x01<<(IR_pData%8));        //數(shù)據(jù)對(duì)應(yīng)位清0
  106.                         IR_pData++;                        //數(shù)據(jù)位置指針自增
  107.                 }
  108.                 //如果計(jì)時(shí)為2250us,則接收到了數(shù)據(jù)1(判定值在12MHz晶振下為2250,在11.0592MHz晶振下為2074)
  109.                 else if(IR_Time>2074-500 && IR_Time<2074+500)
  110.                 {
  111.                         IR_Data[IR_pData/8]|=(0x01<<(IR_pData%8));        //數(shù)據(jù)對(duì)應(yīng)位置1
  112.                         IR_pData++;                        //數(shù)據(jù)位置指針自增
  113.                 }
  114.                 else                                        //接收出錯(cuò)
  115.                 {
  116.                         IR_pData=0;                        //數(shù)據(jù)位置指針清0
  117.                         IR_State=1;                        //置狀態(tài)為1
  118.                 }
  119.                 if(IR_pData>=32)                //如果接收到了32位數(shù)據(jù)
  120.                 {
  121.                         IR_pData=0;                        //數(shù)據(jù)位置指針清0
  122.                         if((IR_Data[0]==~IR_Data[1]) && (IR_Data[2]==~IR_Data[3]))        //數(shù)據(jù)驗(yàn)證
  123.                         {
  124.                                 IR_Address=IR_Data[0];        //轉(zhuǎn)存數(shù)據(jù)
  125.                                 IR_Command=IR_Data[2];
  126.                                 IR_DataFlag=1;        //置收到連發(fā)幀標(biāo)志位為1
  127.                         }   
  128.                         Timer0_Run(0);                //定時(shí)器停止
  129.                         IR_State=0;                        //置狀態(tài)為0
  130.                 }
  131.         }
  132. }
復(fù)制代碼

原理圖: 無(wú)
仿真: 無(wú)
代碼: LED遙控長(zhǎng)按.7z (29.46 KB, 下載次數(shù): 0)

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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