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

📄 main.lst

📁 51单片机做的 红外遥控 内含有仿真 是PROUUE 的仿真
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  08/16/2008 19:19:13 PAGE 1   


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

stmt level    source

   1          #include <AT89X51.h> 
   2          
   3          static bit OP;        //红外发射管的亮灭
   4          static unsigned int count;       //延时计数器
   5          static unsigned int endcount; //终止延时计数
   6          static unsigned char Flag;      //红外发送标志
   7          char iraddr1;  //十六位地址的第一个字节
   8          char iraddr2;  //十六位地址的第二个字节
   9          
  10          void SendIRdata(char p_irdata);
  11          void delay();
  12          char getkey()
  13          {
  14   1                P1=0xff;
  15   1                if(!P1_0)return 9;   //ON
  16   1                if(!P1_1)return 1;   //ON
  17   1                if(!P1_2)return 2;   //7
  18   1                if(!P1_3)return 3;   //8
  19   1                if(!P1_4)return 4;   //9
  20   1                if(!P1_5)return 5;   //X
  21   1                if(!P1_6)return 6;   //÷
  22   1                if(!P1_7)return 7;   //÷
  23   1                return 0;
  24   1      }
  25          
  26          void main(void) 
  27          {
  28   1        char key;
  29   1        count = 0;
  30   1        Flag = 0;
  31   1        OP = 0;
  32   1        P3_4 = 1;
  33   1        EA = 1; //允许CPU中断 
  34   1        TMOD = 0x11; //设定时器0和1为16位模式1 
  35   1        ET0 = 1; //定时器0中断允许 
  36   1      
  37   1        P1=0xff;
  38   1        TH0 = 0xFF; 
  39   1        TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次  
  40   1        TR0 = 1;//开始计数
  41   1      
  42   1        iraddr1=0xff;
  43   1        iraddr2=0xff;
  44   1      
  45   1      
  46   1        do{
  47   2                key=getkey();
  48   2      
  49   2           // if(key==0)SendIRdata(0x00);//0
  50   2            if(key==1)SendIRdata(0x01);//1
  51   2            if(key==2)SendIRdata(0x02);//2
  52   2            if(key==3)SendIRdata(0x03);//3
  53   2            if(key==4)SendIRdata(0x04);//4
  54   2            if(key==5)SendIRdata(0x05);//5
  55   2            if(key==6)SendIRdata(0x06);//6
C51 COMPILER V7.06   MAIN                                                                  08/16/2008 19:19:13 PAGE 2   

  56   2            if(key==7)SendIRdata(0x07);//7
  57   2            if(key==8)SendIRdata(0x08);//8
  58   2            if(key==9)SendIRdata(0x09);//9
  59   2        }while(1);
  60   1      } 
  61          //定时器0中断处理 
  62          void timeint(void) interrupt 1 
  63          { 
  64   1        TH0=0xFF; 
  65   1        TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
  66   1        count++;
  67   1      
  68   1      } 
  69          
  70          
  71          void SendIRdata(char p_irdata)
  72          {
  73   1        int i;
  74   1        char irdata=p_irdata;
  75   1      
  76   1        //发送9ms的起始码
  77   1        endcount=223;
  78   1        Flag=1;
  79   1        count=0;
  80   1        P3_4=0;
  81   1        do{}while(count<endcount);
  82   1      
  83   1        //发送4.5ms的结果码
  84   1        endcount=117;
  85   1        Flag=0;
  86   1        count=0;
  87   1        P3_4=1;
  88   1        do{}while(count<endcount);
  89   1      
  90   1        //发送十六位地址的前八位
  91   1        irdata=iraddr1;
  92   1        for(i=0;i<8;i++)
  93   1        {
  94   2      
  95   2           //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
  96   2           endcount=10;
  97   2           Flag=1;
  98   2           count=0;
  99   2               P3_4=0;
 100   2           do{}while(count<endcount);
 101   2      
 102   2          //停止发送红外信号(即编码中的高电平)
 103   2           if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0
 104   2           {
 105   3             endcount=15;  //1为宽的高电平
 106   3           }
 107   2          else
 108   2           {
 109   3           endcount=41;   //0为窄的高电平
 110   3           }
 111   2          Flag=0;
 112   2          count=0;
 113   2              P3_4=1;
 114   2          do{}while(count<endcount);
 115   2      
 116   2          irdata=irdata>>1;
 117   2        }
C51 COMPILER V7.06   MAIN                                                                  08/16/2008 19:19:13 PAGE 3   

 118   1      
 119   1        //发送十六位地址的后八位
 120   1        irdata=iraddr2;
 121   1        for(i=0;i<8;i++)
 122   1        {
 123   2           endcount=10;
 124   2           Flag=1;
 125   2           count=0;
 126   2               P3_4=0;
 127   2           do{}while(count<endcount);
 128   2      
 129   2           if(irdata-(irdata/2)*2)
 130   2           {
 131   3              endcount=15;
 132   3           }
 133   2           else
 134   2           {
 135   3             endcount=41;
 136   3           }
 137   2           Flag=0;
 138   2           count=0;
 139   2               P3_4=1;
 140   2           do{}while(count<endcount);
 141   2      
 142   2           irdata=irdata>>1;
 143   2        }
 144   1      
 145   1        //发送八位数据
 146   1        irdata=~p_irdata;
 147   1        for(i=0;i<8;i++)
 148   1        {
 149   2           endcount=10;
 150   2           Flag=1;
 151   2           count=0;
 152   2               P3_4=0;
 153   2           do{}while(count<endcount);
 154   2      
 155   2           if(irdata-(irdata/2)*2)
 156   2           {
 157   3               endcount=15;
 158   3           }
 159   2           else
 160   2           {
 161   3             endcount=41;
 162   3           }
 163   2           Flag=0;
 164   2           count=0;
 165   2               P3_4=1;
 166   2           do{}while(count<endcount);
 167   2      
 168   2           irdata=irdata>>1;
 169   2        }
 170   1      
 171   1        //发送八位数据的反码
 172   1        irdata=p_irdata;
 173   1        for(i=0;i<8;i++)
 174   1        {
 175   2           endcount=10;
 176   2           Flag=1;
 177   2           count=0;
 178   2               P3_4=0;
 179   2           do{}while(count<endcount);
C51 COMPILER V7.06   MAIN                                                                  08/16/2008 19:19:13 PAGE 4   

 180   2      
 181   2           if(irdata-(irdata/2)*2)
 182   2           {
 183   3               endcount=15;
 184   3           }
 185   2           else
 186   2           {
 187   3             endcount=41;
 188   3           }
 189   2           Flag=0;
 190   2           count=0;
 191   2               P3_4=1;
 192   2           do{}while(count<endcount);
 193   2      
 194   2           irdata=irdata>>1;
 195   2        }
 196   1      
 197   1        endcount=10;
 198   1        Flag=1;
 199   1        count=0;
 200   1        P3_4=0;
 201   1       do{}while(count<endcount);
 202   1        P3_4=1;
 203   1        Flag=0;
 204   1      }
 205          
 206          void delay()
 207          {
 208   1        int i,j;
 209   1        for(i=0;i<400;i++)
 210   1        {
 211   2          for(j=0;j<100;j++)
 212   2          {
 213   3          }
 214   2        }
 215   1      }
 216          
 217          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    700    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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