⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hongwai_2.c

📁 用C8051F020读取红外遥控
💻 C
字号:
/****************************************************/
/***  题目:基于C8051F020单片机***红外遥控编码***
/***  方法:扫描法 
/***  创建:杨占刚
/***  时间:08_04_16  
/***  注解;0xAA:0键控制;0xAB:1键控制;0xAC:2键控制;0xAD:3键控制;0xB2:4键控制
            0xB3:5键控制;0xB4:6键控制;0xB5:7键控制;0xCA:8键控制;0xCB:9键控制
*******************************************************/

#include "c8051f020.h"
#include "stdio.h"

#define BAUDRATE 115200
#define SYSCLK 22114800
#define uchar unsigned char

sbit   P36=P3^6;
static uchar data IRCode[3],IRCON,IRCON2;  //定义静态变量
static uchar data key_number;


void SYSCLK_Init(void)
{   
  int i  = 0;      //定义延时变量
  OSCXCN = 0x67;   //启动外部振荡器22.1184MHz晶体
  for (i = 0; i < 3000; i++);   // Wait 1ms for initialization
  while ((OSCXCN & 0x80) == 0); //等待晶体振荡器稳定
  OSCICN = 0x88;  //使能时钟丢失检测器,检测到时钟丢失时间大于100ms将触发复位,使能外部时钟为系统时钟
} 

void PORT_Init(void)
{
   WDTCN   = 0xde;
   WDTCN   = 0xad; 
   XBR0    = 0x04;
   XBR2    = 0x40;
}

void Timer1_Init(void)
{
  TMOD  = 0x21; //定时T1方式2,为波特率发生器 115200
  TH1   = 0xF4;  //按波特率设置初值
  SCON0 = 0X50; //URAT0方式1,允许接收
  CKCON|= 0x10; // 
  PCON |= 0X80; //SMOD00=1
  TI0=0;
} 


void Delay(uchar j)
{
  unsigned int de,i;
  if(j)//这里起到按键值正确后会有一个延时,防止重复按键
    {
      for(i=0; i<1000; i++)
      for(de=0; de<200; de++);
      j--;
    }
}  

void main(void)
{
  SYSCLK_Init();
  PORT_Init();
  Timer1_Init();
  P5=0X18;
  EA=0;
  key_number=10;
  while(P36==1);
  while(P36==0)
  { 
  	EA=1;
    ET0 = 1;  //定时器0中断打开
    TH0 = 0XFA;
    TL0 = 0X05;//T0 产生800us的定时中断 
    for (IRCON=0; IRCON<3; IRCON++)
         IRCode[IRCON] = 0;
    IRCON = 0;  
    IRCON2 = 0; //计数清零
    TR0 = 1;    //开始计数
	while(1)
	{
	 if(key_number!=10)
     break;
	}
  }
}



//定时器0溢出中断
void Timer0(void) interrupt 1
{
  TR1 = 1; //激活定时1,产生波特率	    
  TH0 = 0XFA;
  TL0 = 0X05;//T0 产生800us的定时中断 
  if(IRCON<3) 
  {
   if(IRCON2<8)
   {
    IRCON2++;
    IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
    IRCode[IRCON]=IRCode[IRCON] | P36; //每八次填满一个字节,一个字节存放遥控编码4个位
   }
   else
   {
    IRCON++; //填满一个字节,指向下一个变量[注意: 这里会抛弃一个脉冲周期 不接收 ]
    IRCON2=0; //计数清零
   }
  }
  else
  {
   //第一字节是引导码起始位、控制位等 后两个字节有意义 (IRCode[1]不都是0x55只是现在方便判断)  最后一位是编码末尾的前半位
   TR1 = 1;
   TR0 = 0; //关闭定时器
   ET0 = 0; //定时器0中断关闭
   SBUF0=IRCode[2];
   while(TI0!=0);
   TI0=0;
   if((IRCode[1]!=0xFF) && (IRCode[2]!=0xFF))
     {
      if(IRCode[1] == 0x55)
       {
        switch(IRCode[2])
        {
         case 0xAA:    //0键控制
              key_number=0;
              P5=0X00;
              Delay(1);
              break;
         case 0xAB:    //1键控制
              key_number=1;
              P5=0X01;
              Delay(1);
              break;
         case 0xAC:    //2键控制
              key_number=2;
              P5=0X02;
              Delay(1);
              break;
         case 0xAD:   //3键控制
              P5=0X04;
              key_number=3;
              Delay(1);
              break;
         case 0xB2:   //4键控制
              P5=0X08;
              key_number=4;
              Delay(1);
              break;
         case 0xB3:   //5键控制
              P5=0X10;
              key_number=5;
              Delay(1);
              break;
         case 0xB4:   //6键控制
              P5=0X20;
              key_number=6;
              Delay(1);
              break;
         case 0xB5:   //7键控制
              P5=0X40;
              key_number=7;
              Delay(1);
              break;
         case 0xCA:   //8键控制
              P5=0X80;
              key_number=8;
              Delay(1);
              break;
         case 0xCB:   //9键控制
              key_number=9;
              P5=0XFF;
              Delay(1);
              break;
         default:
              break; 
       }
     printf("key_number is:%d",key_number%256);
	 printf("\n");
     printf("\n");
      }
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -