微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 一个红外解码 返回串口显示的程序

一个红外解码 返回串口显示的程序

时间:10-02 整理:3721RD 点击:

  1. #include <reg52.h>
  2. typedef unsigned char uint8;
  3. sbit Ir_Pin = P3^2;
  4. uint8 Ir_Buf[4]; //用于保存解码结果
  5. void uart_init(void)
  6. {
  7.     TMOD = 0x21;   //0010 0001 定时器1工作2 定时器0工作方式1
  8.     SCON = 0x50;   
  9.     TH1 = 0xFD;         
  10.     TL1 = 0xFD;
  11.     TR1 = 1;
  12. }

  13. void UART_Send_Byte(uint8 dat)
  14. {
  15.         SBUF = dat;
  16.         while(TI == 0);   
  17.            TI = 0;
  18. }

  19. unsigned int Ir_Get_Low()
  20. {
  21.         TL0 = 0;
  22.         TH0 = 0;
  23.         TR0 = 1;
  24.         while (!Ir_Pin && (TH0&0x80)==0);  
  25.                      
  26.         TR0 = 0;           
  27.         return (TH0 * 256 + TL0);
  28. }

  29. unsigned int Ir_Get_High()
  30. {
  31.         TL0 = 0;
  32.         TH0 = 0;
  33.         TR0 = 1;
  34.         while (Ir_Pin && (TH0&0x80)==0);
  35.         TR0 = 0;
  36.         return (TH0 * 256 + TL0);
  37. }


  38. main()
  39. {
  40.         unsigned int temp;
  41.         char i,j;

  42.         uart_init();
  43.        
  44.         while (1)
  45.         {
  46. start:
  47.                 while (Ir_Pin);

  48.                 temp = Ir_Get_Low();
  49.                 if ((temp < 7833) || (temp > 8755))  //引导脉冲低电平8500~9500us
  50.                         goto start;
  51.                 temp = Ir_Get_High();
  52.                 if ((temp < 3686) || (temp > 4608))  //引导脉冲高电平4000~5000us   检测引导码
  53.                         goto start;

  54.                 for (i=0; i<4; i++) //4个字节
  55.                 {
  56.                         for (j=0; j<8; j++) //每个字节8位
  57.                         {
  58.                                 temp = Ir_Get_Low();
  59.                                 if ((temp < 184) || (temp > 737)) //200~800us   低电平不在560us左右
  60.                                         goto start;

  61.                                 temp = Ir_Get_High();
  62.                                 if ((temp < 184) || (temp > 1843)) //200~2000us         高电平1680us
  63.                                         goto start;

  64.                                 Ir_Buf[i] >>= 1;
  65.                                 if (temp > 1032) //1120us         写“1”
  66.                                         Ir_Buf[i] |= 0x80;
  67.                         }
  68.                 }

  69.                 UART_Send_Byte(Ir_Buf[0]);
  70.                 UART_Send_Byte(Ir_Buf[1]);
  71.                 UART_Send_Byte(Ir_Buf[2]);
  72.                 UART_Send_Byte(Ir_Buf[3]);
  73.         }
  74. }



复制代码

void UART_Send_Byte(uint8 dat)
{
        SBUF = dat;
        while(TI == 0);   
           TI = 0;
}
这段的意思是什么?
不是发送完一个8位数据会机械置1要软件清零吗

需要软件清0.发送完了会自动标志位1.如果你还需要下次继续发送,那么TI久需要被手动清0.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top