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

📄 +

📁 51单片机配套C程序
💻
字号:
C51 COMPILER V7.50   HC_IRLCD                                                              09/09/2010 17:56:47 PAGE 1   


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

line level    source

   1          /********************************************************************************
   2          *  描述:                                                                       *
   3          *         lcd1602显示 遥控键值读取器                                           *
   4          *         lcd1602显示 遥控器接p3.2                                             *
   5          *         喇叭接p1.5  继电器接p1.4                                             *
   6          *         17(40h)键按下,继电器吸合。19(04h)键按下,继电器关闭。               *
   7          *   连接方法:使用红外功能时 J1跳线短接                                                                   
             -        *
   8          *******************************************************************************/
   9          
  10          #include <reg51.h>
  11          #include <intrins.h>
  12          #define  NOP()   _nop_()   /* 定义空指令 */
  13          
  14          #define uchar unsigned char
  15          #define uint  unsigned int
  16          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  17          
  18          void delay(uchar x);  //x*0.14MS
  19          void delay1(int ms);
  20          void beep(void);
  21          
  22          sbit IRIN = P3^2;         //红外接收器数据线
  23          sbit RELAY= P1^4;         //继电器驱动线
  24          sbit BEEP = P1^5;         //蜂鸣器驱动线
  25          
  26          uchar IRCOM[7];
  27          
  28          uchar cdis1[] = {" REMOTE CONTROL "};
  29          uchar cdis2[] = {"  IR-CODE: ----H"};
  30          
  31          //LCD IO
  32          sbit LCD_RW = P2^5;
  33          sbit LCD_RS = P2^4;             
  34          sbit LCD_EN = P2^6;
  35          
  36          
  37          unsigned char Y0;
  38          
  39          /*******************************************************************/
  40          /*                                                                 */
  41          /*检查LCD忙状态                                                    */
  42          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  43          /*                                                                 */
  44          /*******************************************************************/ 
  45          
  46          bit lcd_busy()
  47           {                          
  48   1          bit result;
  49   1          LCD_RS = 0;
  50   1          LCD_RW = 1;
  51   1          LCD_EN = 1;
  52   1          delayNOP();
  53   1          result = (bit)(P0&0x80);
  54   1          LCD_EN = 0;
C51 COMPILER V7.50   HC_IRLCD                                                              09/09/2010 17:56:47 PAGE 2   

  55   1          return(result); 
  56   1       }
  57          
  58          /*******************************************************************/
  59          /*                                                                 */
  60          /*写指令数据到LCD                                                  */
  61          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  62          /*                                                                 */
  63          /*******************************************************************/
  64          
  65          void lcd_wcmd(uchar cmd)
  66          
  67          {                          
  68   1         while(lcd_busy());
  69   1          LCD_RS = 0;
  70   1          LCD_RW = 0;
  71   1          LCD_EN = 0;
  72   1          _nop_();
  73   1          _nop_(); 
  74   1          P0 = cmd;
  75   1          delayNOP();
  76   1          LCD_EN = 1;
  77   1          delayNOP();
  78   1          LCD_EN = 0;  
  79   1      }
  80          
  81          /*******************************************************************/
  82          /*                                                                 */
  83          /*写显示数据到LCD                                                  */
  84          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  85          /*                                                                 */
  86          /*******************************************************************/
  87          
  88          void lcd_wdat(uchar dat)
  89          {                          
  90   1         while(lcd_busy());
  91   1          LCD_RS = 1;
  92   1          LCD_RW = 0;
  93   1          LCD_EN = 0;
  94   1          P0 = dat;
  95   1          delayNOP();
  96   1          LCD_EN = 1;
  97   1          delayNOP();
  98   1          LCD_EN = 0; 
  99   1      }
 100          
 101          /*******************************************************************/
 102          /*                                                                 */
 103          /*  LCD初始化设定                                                  */
 104          /*                                                                 */
 105          /*******************************************************************/
 106          
 107          void lcd_init()
 108          { 
 109   1          delay1(15);                   
 110   1          lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
 111   1          delay1(5);
 112   1          lcd_wcmd(0x38);         
 113   1          delay1(5);
 114   1          lcd_wcmd(0x38);         
 115   1          delay1(5);
 116   1      
C51 COMPILER V7.50   HC_IRLCD                                                              09/09/2010 17:56:47 PAGE 3   

 117   1          lcd_wcmd(0x0c);      //显示开,关光标
 118   1          delay1(5);
 119   1          lcd_wcmd(0x06);      //移动光标
 120   1          delay1(5);
 121   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 122   1          delay1(5);
 123   1      }
 124          
 125          /*******************************************************************/
 126          /*                                                                 */
 127          /*  设定显示位置                                                   */
 128          /*                                                                 */
 129          /*******************************************************************/
 130          
 131          void lcd_pos(uchar pos)
 132          {                          
 133   1        lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
 134   1      }
 135          
 136          /*******************************************************************/
 137          main()
 138          {
 139   1         uchar m;
 140   1        
 141   1          IE = 0x81;                 //允许总中断中断,使能 INT0 外部中断
 142   1          TCON = 0x01;               //触发方式为脉冲负边沿触发
 143   1          
 144   1          IRIN=1;                    //I/O口初始化
 145   1          BEEP=1;
 146   1          RELAY=1; 
 147   1              
 148   1          delay1(10);                 //延时
 149   1          lcd_init();                //初始化LCD             
 150   1              
 151   1          lcd_pos(0);                //设置显示位置为第一行的第1个字符
 152   1           m = 0;
 153   1          while(cdis1[m] != '\0')
 154   1           {                         //显示字符
 155   2             lcd_wdat(cdis1[m]);
 156   2             m++;
 157   2           }
 158   1      
 159   1          lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 160   1           m = 0;
 161   1          while(cdis2[m] != '\0')
 162   1           {
 163   2             lcd_wdat(cdis2[m]);      //显示字符
 164   2             m++;
 165   2           }
 166   1      
 167   1         while(1);
 168   1      
 169   1      } //end main
 170          /**********************************************************/
 171          void IR_IN(void) interrupt 0     //外部中断服务程序
 172          {
 173   1        unsigned char j,k,N=0;
 174   1           EX0 = 0;   
 175   1               delay(15);
 176   1               if (IRIN==1) 
 177   1           { EX0 =1;
 178   2                 return;
C51 COMPILER V7.50   HC_IRLCD                                                              09/09/2010 17:56:47 PAGE 4   

 179   2                } 
 180   1                                 //确认IR信号出现
 181   1        while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
 182   1          {delay(1);}
 183   1      
 184   1       for (j=0;j<4;j++)         //收集四组数据
 185   1       { 
 186   2        for (k=0;k<8;k++)        //每组数据有8位
 187   2        {
 188   3         while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
 189   3           {delay(1);}
 190   3          while (!IRIN)          //等 IR 变为高电平
 191   3           {delay(1);}
 192   3           while (IRIN)           //计算IR高电平时长
 193   3            {
 194   4          delay(1);
 195   4          N++;           
 196   4          if (N>=30)
 197   4               { EX0=1;
 198   5               return;}                  //0.14ms计数过长自动离开。
 199   4            }                        //高电平计数完毕                
 200   3           IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
 201   3           if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”
 202   3           N=0;
 203   3        }//end for k
 204   2       }//end for j
 205   1         
 206   1         if (IRCOM[2]!=~IRCOM[3])
 207   1         { EX0=1;
 208   2           return; }
 209   1      
 210   1         IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
 211   1         IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
 212   1      
 213   1         if(IRCOM[5]>9)
 214   1          { IRCOM[5]=IRCOM[5]+0x37;}
 215   1         else
 216   1                IRCOM[5]=IRCOM[5]+0x30;
 217   1      
 218   1         if(IRCOM[6]>9)
 219   1          { IRCOM[6]=IRCOM[6]+0x37;}
 220   1         else
 221   1                IRCOM[6]=IRCOM[6]+0x30;
 222   1      
 223   1           lcd_pos(0x4b);             
 224   1           lcd_wdat(IRCOM[6]);        //第一位数显示 
 225   1           lcd_pos(0x4c);             
 226   1           lcd_wdat(IRCOM[5]);        //第二位数显示
 227   1      
 228   1               Y0=0;
 229   1               switch(IRCOM[2])
 230   1               {
 231   2                 case 0x09: Y0=0x01; break;
 232   2                 case 0x1D: Y0=0x02; break;
 233   2                 case 0x1F: Y0=0x03; break;
 234   2                 case 0x0D: Y0=0x04; break;
 235   2                 case 0x19: Y0=0x05; break;
 236   2                 case 0x1B: Y0=0x06; break;
 237   2                 case 0x11: Y0=0x07; break;
 238   2                 case 0x15: Y0=0x08; break;
 239   2                 case 0x17: Y0=0x09; break;
 240   2      
C51 COMPILER V7.50   HC_IRLCD                                                              09/09/2010 17:56:47 PAGE 5   

 241   2                case 0x13: RELAY=1; break;
 242   2                case 0x14: RELAY=1; break;
 243   2                case 0x51: RELAY=0; break;
 244   2               }
 245   1      
 246   1              if(Y0&0x01)RELAY=0; //打开继电器
 247   1              else RELAY=1;       //关闭继电器
 248   1      
 249   1          beep();
 250   1          EX0 = 1; 
 251   1      } 
 252          
 253          /**********************************************************/
 254          void beep(void)
 255          {
 256   1        unsigned char i;
 257   1        for (i=0;i<100;i++)
 258   1         {
 259   2         delay(4);
 260   2         BEEP=!BEEP;                 //BEEP取反
 261   2         } 
 262   1        BEEP=1;                      //关闭蜂鸣器
 263   1      }
 264          /**********************************************************/
 265          void delay(unsigned char x)    //x*0.14MS
 266          {
 267   1       unsigned char i;
 268   1        while(x--)
 269   1       {
 270   2        for (i = 0; i<13; i++) {}
 271   2       }
 272   1      }
 273          
 274          /**********************************************************/
 275          void delay1(int ms)
 276          {
 277   1       unsigned char y;
 278   1        while(ms--)
 279   1       {
 280   2        for(y = 0; y<250; y++)
 281   2        {
 282   3         _nop_();
 283   3         _nop_();
 284   3         _nop_();
 285   3         _nop_();
 286   3        }
 287   2       }
 288   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    655    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     42       4
   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 + -