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

📄 pt2221.lst

📁 PT2221 红外解码 C 程序
💻 LST
字号:
C51 COMPILER V7.06   PT2221                                                                11/09/2008 23:19:36 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE PT2221
OBJECT MODULE PLACED IN PT2221.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PT2221.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /********************************************************************
   2          name: PT2221 红外解码 C 程序
   3          红外一体化接收头 + 89S51
   4          用c做延时的32路红外遥控解码程序,程序中提供了两种实现延时的方法:
   5          1. 加入 intrins.h 头文件后,用for循环和_nop_ 联合组成的精确延时;
   6          2. 用 while(--i); 实现的精确延时
   7          红外一体化接收头接P3.2 (INT0)
   8          P1.7作工作指示用,解码成功后BZ响一次,同时,若解码值为01的话,会取反P1.5
   9          **********************************************************************/
  10          #include<reg51.h>
  11          #include<intrins.h>
  12          #define uchar unsigned char
  13          #define uint unsigned int
  14          //*************用到的I/O口定义**************
  15          sbit P32=P3^2;  //INT0,红外信号输入
  16          sbit P23=P2^3;  //BZ
  17          sbit P15=P1^5;
  18          sbit P17=P1^7; //工作指示灯
  19          //************函数申明*********************
  20          void InitCom(void);             //串口初始化
  21          void ComOutChar(unsigned char OutData); //从串口输出一个字符
  22          void delay882us(void);  //精确延时882us
  23          void delay4740us(void); //精确延时4740us
  24          void delay1000us(void); //精确延时1000us
  25          //************************主程序***********************************
  26          //向串口输出一个字符(非中断方式)
  27          //***************************************************************
  28          void ComOutChar(unsigned char OutData)
  29          {
  30   1              SBUF = OutData; //输出字符
  31   1              while(!TI); //空语句判断字符是否发完
  32   1              TI = 0; //清TI
  33   1      }
  34          //****************************************************************
  35          //串口初始化 晶振为11.0592M 方式1 波特率9600
  36          //****************************************************************
  37          void InitCom(void)
  38          {
  39   1              SCON = 0x50; //串口方式1,允许接收
  40   1              TMOD = 0x21; //定时器1定时方式2,定时0为模式1,16位模式
  41   1              TH1 = 0xFd;     //设波特率为9600
  42   1              TL1 = 0xFd;
  43   1              PCON = 0x00; //波特率不加倍控制,SMOD为0
  44   1              RI = 0; //清收发标志
  45   1              TI = 0;
  46   1              TR1 = 1; //启动定时器
  47   1      }
  48          
  49          //*****************************************
  50          //      用 for 循环和 _nop_ 配合实现的精确延时
  51          //*****************************************
  52          //****************882us********************
  53          void delay882us(void)
  54          {
  55   1              uchar i;
C51 COMPILER V7.06   PT2221                                                                11/09/2008 23:19:36 PAGE 2   

  56   1              for(i=0;i<202;i++)
  57   1              {
  58   2                      _nop_();
  59   2              }
  60   1      }
  61          //****************4740us*******************
  62          void delay4740us(void)
  63          {
  64   1              uint j;
  65   1              for(j=0;j<670;j++)
  66   1              {
  67   2                      _nop_();
  68   2              }
  69   1      }
  70          //*************1000us**********************
  71          void delay1000us(void)
  72          {
  73   1              uchar k;
  74   1              for(k=0;k<230;k++)
  75   1              {
  76   2                      _nop_();
  77   2              }
  78   1      }
  79          
  80          void main (void)  
  81          {
  82   1              uint di;
  83   1              InitCom(); //初始化串口
  84   1              EA=1;
  85   1              EX0=1; // 设定接受INT0的中断
  86   1              IT0=1;
  87   1              ComOutChar(1);  //向串口发送 1 ,表示串口正常工作
  88   1              do
  89   1              {
  90   2              P17=~P17;       //工作指示灯,这个LED闪烁表示主程序在运行
  91   2                      for(di=0;di<1000;di++)
  92   2                      {
  93   3                              delay1000us();
  94   3                      }
  95   2              }while(1);
  96   1      }
  97          //*******************外部中断0 红外解码程序**************** 
  98          static void decode(void) interrupt 0 using 2
  99          {
 100   1              unsigned char IRCode[4]={0,0,0,0};
 101   1              unsigned char count0,count1,count2;
 102   1              unsigned char m;
 103   1              EX0 = 0; //外部中断0关闭
 104   1              for(count0=0;count0<10;count0++)        //起始码前9ms的低电平
 105   1              {
 106   2                      delay882us();
 107   2                      if(P32) goto exit;      //9ms没完就出来高电平则为干扰信号,跳出中断(退出解码)
 108   2              }
 109   1              if(!P32)        //低电平没完
 110   1              {
 111   2                      delay4740us();  //9ms没结束再延时4740us,加上前面的8820us,已跳过起始码的13.5ms
 112   2                      for(count1=0;count1<4;count1++) //开始读数据,4个字节,32位
 113   2                      {
 114   3                              for(count2=0;count2<8;count2++) //每个字节8位
 115   3                              {
 116   4                                      while(!P32);    //等待高电平到来
 117   4                                      delay882us();
C51 COMPILER V7.06   PT2221                                                                11/09/2008 23:19:36 PAGE 3   

 118   4                                      if(P32) //延时882us后,若P32还是高电平,则为 位1
 119   4                                              {
 120   5                                                      IRCode[count1]=IRCode[count1]>>1;
 121   5                                                      IRCode[count1]=IRCode[count1]|0x80;
 122   5                                                      delay1000us();  //延时1000us,结束高电平
 123   5                                              }
 124   4                                      else    //延时882us后,若P32为低电平,则为 位0
 125   4                                      {
 126   5                                              IRCode[count1]=IRCode[count1]>>1;
 127   5                                              IRCode[count1]=IRCode[count1]|0x00;
 128   5                                      }
 129   4                              }
 130   3                      }       //到这里已读完所有32位数据
 131   2                      //if ((IRCode[0]==0x00)&&(IRCode[1]==0xff))     //判断用户码和用户反码是否正确
 132   2                      //if ((IRCode[0]==0x02)&&(IRCode[1]==0xBD))     //判断用户码和用户反码是否正确
 133   2                       //if ((IRCode[0]==0x01)&&(IRCode[1]==0xff)) //判断用户码和用户反码是否正确
 134   2                      {
 135   3                              if (IRCode[2]==~IRCode[3])      //数据校验
 136   3                              {
 137   4                                      ComOutChar(IRCode[0]);
 138   4                                      ComOutChar(IRCode[1]);
 139   4                                      ComOutChar(IRCode[2]);  //串口发送数据码
 140   4                                      ComOutChar(IRCode[3]);
 141   4                      P23=0;                                  //解码成功后BZ响一次
 142   4                                      for(m=0;m<100;m++)
 143   4                                      {
 144   5                                              delay1000us();
 145   5                                      }
 146   4                      P23=1;
 147   4                                      if(IRCode[2]==0x01)
 148   4                                      {
 149   5                          P15=~P15; //这里可加入控制命令,比如这里的当解码为01时取反P1.5
 150   5                                              for(m=0;m<100;m++)
 151   5                                              {
 152   6                                                      delay1000us();
 153   6                                              }
 154   5                                      }
 155   4                              }
 156   3                      }
 157   2              }
 158   1      exit:
 159   1              EX0 = 1;        
 160   1      }
 161          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    282    ----
   CONSTANT SIZE    =      4    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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