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

📄 ir- motor-lcd1602.lst

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 281   1      //       lcd_pos(0x45); 
 282   1             lcd_wdat(data_temp2);
 283   1                 
 284   1                 data_temp = rate;         //显示速率
 285   1                 data_conv();
 286   1             lcd_pos(0x4d); 
 287   1             lcd_wdat(data_temp1);
 288   1      //       lcd_pos(0x4e); 
 289   1             lcd_wdat(data_temp2);
 290   1      }
 291          /********************************************************
 292          /*
 293          /* 显示运行方向符号
 294          /*
 295          /********************************************************/
 296          void  motor_DR()
 297            {
 298   1             if(direction==1)           //正转方向标志
 299   1              { 
 300   2                for(m=0;m<2;m++)
 301   2                { 
 302   3                          lcd_pos(0x0d+m);      //显示方向符号
 303   3                  lcd_wdat(0x3e);
C51 COMPILER V8.02   IR__MOTOR_LCD1602                                                     12/22/2006 09:46:41 PAGE 6   

 304   3                        }
 305   2                      }
 306   1              else
 307   1               { 
 308   2                 for(m=0;m<2;m++)       //反转方向标志
 309   2                 { 
 310   3                       lcd_pos(0x0d+m);     //显示方向符号 
 311   3                   lcd_wdat(0x3c);
 312   3                         }
 313   2                       }
 314   1        }
 315          
 316          /********************************************************
 317          /*
 318          /* 显示运行状态
 319          /*
 320          /********************************************************/
 321          void  motor_RUN()
 322           {
 323   1            if(on_off==1)
 324   1                 { TR0=1; 
 325   2                   lcd_pos(7);        //设置显示位置为第一行的第1个字符
 326   2                       for(m=0;m<5;m++)
 327   2               lcd_wdat(cdis5[m]);    //RUN
 328   2               motor_DR();              //
 329   2                 }  
 330   1            else  
 331   1                 { TR0=0; P1 =0xf0; 
 332   2                       lcd_pos(7);        //设置显示位置为第一行的第1个字符
 333   2                       for(m=0;m<5;m++)
 334   2               lcd_wdat(cdis6[m]);    //STOP
 335   2               motor_DR();              //
 336   2               snum=snum1;             //
 337   2                       number1=0;              //清圈数计数器
 338   2             }
 339   1        }
 340          
 341          /********************************************************
 342          *                                                       
 343          *  主程序                                               
 344          *                                                      
 345          *********************************************************/
 346          main()
 347          { 
 348   1          LCD_init_DIS();
 349   1                      
 350   1      //    IE=0x81;              //允许总中断中断,使能 INT0 外部中断
 351   1      //    TCON=0x01;            //触发方式为脉冲负边沿触发
 352   1      
 353   1          TMOD = 0x01;          //T0定时方式1
 354   1          TL0  = 0x33;
 355   1          TH0  = 0xf5;
 356   1          ET0  = 1;
 357   1          EA = 1;
 358   1          P1   = 0xf0; 
 359   1      
 360   1          while(1)
 361   1          {  
 362   2                IR_IN();
 363   2                TEMP=IRCOM[2];
 364   2            if(flag) 
 365   2            {
C51 COMPILER V8.02   IR__MOTOR_LCD1602                                                     12/22/2006 09:46:41 PAGE 7   

 366   3      /********************************************************
 367   3        运行控制
 368   3      ********************************************************/
 369   3             if(TEMP==0x10)      //启动、停止
 370   3                 {
 371   4                   on_off=~on_off;       
 372   4               motor_RUN();           
 373   4             } 
 374   3      /********************************************************
 375   3        设定圈数
 376   3      ********************************************************/
 377   3            if(TEMP==0x09)      //增加圈数
 378   3             {           
 379   4                       if(snum!=0x14)   
 380   4                        {
 381   5                          snum++;
 382   5                          snum1=snum;
 383   5                        }
 384   4             }
 385   3                
 386   3             if(TEMP==0x1f)     //减少圈数
 387   3             {
 388   4               if(snum!=0x00)
 389   4                        {
 390   5                          snum--;                     
 391   5                              snum1=snum;
 392   5                        }              
 393   4                 }
 394   3      /********************************************************
 395   3        方向转换
 396   3      ********************************************************/
 397   3            if(TEMP==0x11)       //正转
 398   3            {
 399   4                       direction=1; 
 400   4               motor_DR();
 401   4            }
 402   3      
 403   3                if(TEMP==0x19)       //反转  
 404   3            {
 405   4                       direction=0; 
 406   4               motor_DR();
 407   4            }
 408   3      
 409   3      /********************************************************
 410   3        速率调整
 411   3      ********************************************************/
 412   3            if(TEMP==0x12)     //增加速率,减速
 413   3             {
 414   4                   if(rate!=0x10)
 415   4                       rate++;            
 416   4                 }      
 417   3       
 418   3            if(TEMP==0x1d)     //减少速率,加速  
 419   3             {
 420   4                   if(rate!=0x01)
 421   4                       rate--;            
 422   4                 }
 423   3      
 424   3            if(TEMP==0x03)
 425   3                 {
 426   4                   if(on_off&(!pause1))
 427   4                       {
C51 COMPILER V8.02   IR__MOTOR_LCD1602                                                     12/22/2006 09:46:41 PAGE 8   

 428   5                         pause1=1;
 429   5                 TR0=0;              //暂停
 430   5                 lcd_pos(7);            //设置显示位置
 431   5                         for(m=0;m<5;m++)
 432   5                 lcd_wdat(cdis7[m]);    //PAUSE 
 433   5               }
 434   4               else if(pause1)
 435   4                       {
 436   5                motor_RUN();
 437   5                        pause1=0;
 438   5                        TR0=1;
 439   5                       }
 440   4                 }
 441   3             flag=0;
 442   3              } // end of if(flag)
 443   2      
 444   2      /********************************************************/
 445   2            if(number1==snum1)   //与设定圈数是否相等  
 446   2                 {
 447   3                   number1=0; 
 448   3               on_off=0;
 449   3               TR0=0;
 450   3                   snum=snum1;
 451   3                       P1 =0xf0;
 452   3                       motor_RUN();
 453   3                 }         
 454   2             data_dis();
 455   2              }  // while(1) end
 456   1       }  //main end
 457          
 458          /********************************************************/
 459          /*
 460          /*  定时器 0 中断 
 461          /*
 462          /********************************************************/
 463          void  motor_onoff()  interrupt  1  
 464           {     
 465   1             TL0  = 0x33;
 466   1             TH0  = 0xf5; 
 467   1             q++;
 468   1                 if(q < rate)
 469   1              { return; }
 470   1                 else 
 471   1             {  q=0;    
 472   2                    number++;                  //脉冲计数
 473   2              
 474   2                   if(number==96)              //96个脉冲电机转一圈
 475   2                    { snum--;
 476   3                          number=0;
 477   3                  number1++; }                 //电机转动圈数
 478   2                        
 479   2               if(direction==1)            //方向标志
 480   2                    { if(v<8)  
 481   3                      {P1 = FFW[v];v++;}       //取数据,正转
 482   3                     if(v==8) 
 483   3                     { v=0; } 
 484   3                }
 485   2               
 486   2                   else
 487   2                    { if(v<8)  
 488   3                      {P1 = REV[v];v++;}       //取数据,反转
 489   3                      if(v==8) 
C51 COMPILER V8.02   IR__MOTOR_LCD1602                                                     12/22/2006 09:46:41 PAGE 9   

 490   3                      { v=0; } 
 491   3                }
 492   2                 }
 493   1       } 
 494          
 495          /**********************************************************
 496            中断服务函数
 497          **********************************************************/
 498          void IR_IN() //interrupt 0 using 0
 499          {
 500   1         unsigned char j,k,N=0;
 501   1      //   EX0 = 0;   
 502   1         delayB(15);
 503   1         if (IRIN==1)              //确认IR信号是否出现
 504   1         { 
 505   2      //       EX0 =1;
 506   2               return;
 507   2         } 
 508   1                                 
 509   1         while (!IRIN)              //等IR变为高电平,跳过9ms的前导低电平信号。
 510   1         delayB(1);
 511   1      
 512   1         for (j=0;j<4;j++)          //收集四组数据
 513   1         { 
 514   2           for (k=0;k<8;k++)        //每组数据有8位
 515   2           {
 516   3            while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
 517   3            delayB(1);
 518   3            while (!IRIN)           //等 IR 变为高电平
 519   3            delayB(1);
 520   3            while (IRIN)            //计算IR高电平时长
 521   3            {
 522   4              delayB(1);
 523   4              N++;           
 524   4              if (N>=20)
 525   4                  { 
 526   5      //            EX0=1; 
 527   5                    return;                 //0.14ms计数过长自动离开。
 528   5                      }                     
 529   4            }                           //高电平计数完毕                
 530   3           IRCOM[j]=IRCOM[j] >> 1;      //数据最高位补"0"
 531   3           if (N>=8) 
 532   3               IRCOM[j]=IRCOM[j] | 0x80;  //数据最高位补"1"
 533   3           N=0;
 534   3          }//end for k
 535   2         } //end for j
 536   1         
 537   1         if(IRCOM[2]!=~IRCOM[3])   //检验接收数据是否正确
 538   1         { //EX0=1;
 539   2           return; }
 540   1      
 541   1         if(IRCOM[0]!=0x00)       //效验用户码
 542   1         { 
 543   2      //     EX0=1;
 544   2           return; 
 545   2         }
 546   1           beep();               //接收有效,蜂鸣器响一声
 547   1               flag=1 ;              //置接收有效标志
 548   1      //     EX0 = 1;               //重开中断
 549   1      } 
 550          
 551          /*********************************************************/
C51 COMPILER V8.02   IR__MOTOR_LCD1602                                                     12/22/2006 09:46:41 PAGE 10  



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1042    ----
   CONSTANT SIZE    =    102    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     18       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      6       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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