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

📄 s51yk.lst

📁 红外线的一个程序代码
💻 LST
字号:
C51 COMPILER V8.02   S51YK                                                                 11/30/2007 10:24:39 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE S51YK
OBJECT MODULE PLACED IN s51yk.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE s51yk.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <regX52.h>
   2          
   3          #define c(x) (x*110592/120000)
   4            sbit Ir_Pin=P3^2;
   5                    sbit beep=P2^1;
   6                    //sbit RELAY=P2^0;
   7          #define INBUF_LEN 4 //数据长度
   8          unsigned char inbuf1[INBUF_LEN]={'0','0','0','0'};//发送缓冲区
   9          unsigned char inbuf2[50];//接收缓冲区
  10          unsigned char count3;
  11          void init_serialcomm( void )
  12          {
  13   1      SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
  14   1      T2CON=0x30;
  15   1      TH2=0x00;
  16   1      TL2=0x00;
  17   1      RCAP2H=0xFF;
  18   1      RCAP2L=0xDC;
  19   1      TR2=1;
  20   1      }
  21          //向串口发送一个字符
  22          void send_char_com( unsigned char ch)
  23          {
  24   1      SBUF=ch;
  25   1      while (TI== 0 );
  26   1      TI= 0 ;
  27   1      }
  28          //向串口发送一个字符串,strlen 为该字符串长度
  29          void send_string_com( unsigned char *str, unsigned int strlen)
  30          {
  31   1      unsigned int k= 0 ;
  32   1      do
  33   1      {
  34   2      send_char_com(*(str + k));
  35   2      k++;
  36   2      } while (k < strlen);
  37   1      }
  38          //串口接收中断函数
  39          void serial () interrupt 4 using 3
  40          {
  41   1      if (RI) //RI==开始接收
  42   1      {
  43   2      unsigned char ch;
  44   2      RI = 0 ; //软件RI=0
  45   2      ch=SBUF;
  46   2      if (ch> 1 )
  47   2      {
  48   3      count3= 0 ;
  49   3      inbuf2[count3]=ch;
  50   3      }
  51   2      else
  52   2      {
  53   3      count3++;
  54   3      inbuf2[count3]=ch;
  55   3      }
C51 COMPILER V8.02   S51YK                                                                 11/30/2007 10:24:39 PAGE 2   

  56   2      }
  57   1      }        
  58          
  59              
  60                unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
  61                0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};                        //共阳极数码显示码0-F.
  62                unsigned char code Led_Sel[]={0x7f,0xbf,0xdf,0xef};
  63                    unsigned char dis_8[17]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','-'};
  64          
  65                unsigned char Led_Buf[4]; //显示缓冲区
  66                char Led_Index;                   //位选         
  67          
  68                unsigned char Ir_Buf[4]; //用于保存解码结果
  69                           void delay_50ms(unsigned int t)
  70          {
  71   1       unsigned int j;   
  72   1       for(;t>0;t--) 
  73   1        for(j=6245;j>0;j--) 
  74   1      {;}
  75   1      }
  76          
  77                //==============================================================
  78                //数码管扫描
  79                timer0() interrupt 1 using 1
  80                {
  81   1            TL0=65536-1000;
  82   1            TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
  83   1            P0=0xff;
  84   1            P3=Led_Sel[Led_Index];                            //位选
  85   1            P0=Led_Tab[Led_Buf[Led_Index]];                    //段选
  86   1      
  87   1            if(++Led_Index>3) Led_Index=0;                    //四个扫描完了,到第一个数码管
  88   1            }
  89                //==============================================================
  90                unsigned int Ir_Get_Low()
  91                {
  92   1            TL1=0;
  93   1            TH1=0;
  94   1            TR1=1;
  95   1            while(!Ir_Pin && (TH1&0x80)==0);                
  96   1            TR1=0;           
  97   1            return TH1*256+TL1;
  98   1            }
  99                //=============================================================
 100                unsigned int Ir_Get_High()
 101                {
 102   1            TL1=0;
 103   1            TH1=0;
 104   1            TR1=1;
 105   1            while(Ir_Pin && (TH1&0x80)==0);
 106   1            TR1=0;
 107   1            return TH1*256+TL1;
 108   1            }
 109                //==============================================================
 110                main()
 111                {
 112   1            unsigned int temp;
 113   1            char i,j;
 114   1            Led_Index=1;
 115   1                 init_serialcomm(); //初始化串口
 116   1            TMOD=0x11;
 117   1            TL0=65536-1000;
C51 COMPILER V8.02   S51YK                                                                 11/30/2007 10:24:39 PAGE 3   

 118   1            TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
 119   1            EA=1;
 120   1            ET0=1;
 121   1            TR0=1;
 122   1      
 123   1            Led_Buf[0]=0;
 124   1            Led_Buf[1]=0;
 125   1            Led_Buf[2]=0;
 126   1            Led_Buf[3]=0; //显示区设成0
 127   1            do{
 128   2            restart:
 129   2            while(Ir_Pin);
 130   2            temp=Ir_Get_Low();
 131   2            if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000
 132   2            temp=Ir_Get_High();
 133   2            if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500
 134   2            for(i=0;i<4;i++) //4个字节
 135   2            for(j=0;j<8;j++) //每个字节8位
 136   2            {
 137   3            temp=Ir_Get_Low();
 138   3            if(temp<c(200) || temp>c(800)) goto restart;
 139   3            temp=Ir_Get_High();
 140   3            if(temp<c(200) || temp>c(2000)) goto restart;
 141   3            Ir_Buf[i]>>=1;
 142   3            if(temp>c(1120)) Ir_Buf[i]|=0x80;
 143   3            }
 144   2            Led_Buf[0]=Ir_Buf[2]&0xf;
 145   2            Led_Buf[1]=(Ir_Buf[2]/16)&0xf;
 146   2            Led_Buf[2]=Ir_Buf[3]&0xf;
 147   2            Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果
 148   2                      inbuf1[0]=dis_8[Led_Buf[1]];
 149   2        inbuf1[1]=dis_8[Led_Buf[0]];
 150   2        inbuf1[2]=0x0d;
 151   2        inbuf1[3]=0x0a;
 152   2        send_string_com(inbuf1,INBUF_LEN);
 153   2                P1=Ir_Buf[2];
 154   2               beep=0;
 155   2               delay_50ms(2);
 156   2               beep=1;
 157   2               //RELAY=0;
 158   2               //delay_50ms(50);
 159   2               //RELAY=1;
 160   2                      
 161   2      
 162   2      //while ( 1 )
 163   2      //{
 164   2      
 165   2            }
 166   1               
 167   1      
 168   1                while(1);
 169   1                      
 170   1            }
 171                   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    645    ----
   CONSTANT SIZE    =     20    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     81      10
C51 COMPILER V8.02   S51YK                                                                 11/30/2007 10:24:39 PAGE 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 + -