微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机红外遥控控制直流电机加速

单片机红外遥控控制直流电机加速

时间:10-02 整理:3721RD 点击:
我想用遥控器控制直流电机的加速,减速,程序写好三天了一直在调试,没错误,但也不能实现功能,求高手指点,程序有急用
#include<reg52.h>
#define uchar unsigned char
#define V_TH1  0Xff                  
#define V_TL1 0Xe0                  
static uchar click;                  /*中断次数计数器变量*/                 
unsigned int ltime,htime;
unsigned char ZKB1,ZKB2;
unsigned char temp;
unsigned char a[4];
sbit IR=P3^2;
sbit BEEP = P3^6;
sbit P1_0=P1^0;
sbit P1_1=P1^1;

/*        延时程序可以写的更加精简些  */
void delay1ms()
{
    unsigned char i,j;       
        for(i=0;i<10;i++)                         
        for(j=0;j<33;j++);                 
}
void delay(unsigned char n)
{
           unsigned char i;
        for(i=0;i<n;i++)
        delay1ms();
}

void beep()       
{
          unsigned char i;
          for (i=0;i<100;i++)
           {
                   delay1ms();
                   BEEP=!BEEP;     
           }
           BEEP=1;         
    delay(250);           
}
bit jm()
{
        unsigned char i,j,temp=0;
        for(i=0;i<4;i++)
        {
                  for(j=0;j<8;j++)
                  {
                           temp=temp>>1;
                           TH0=0;TL0=0;TR0=1;
                           while(IR==0);
                           TR0=0;
                           ltime=TH0*256+TL0;
                           TH0=0;TL0=0;TR0=1;
                           while(IR==1);
                           TR0=0;
                           htime=TH0*256+TL0;
                           if((ltime<400)||(ltime>700))
                           return 0;
                           if((htime>450)&&(htime<650))
                           temp=temp&0x7f;
                          if((htime>1430)&&(htime<1930))
                           temp=temp|0x80;
                  }
                   a[i]=temp;
        }
          if(a[2]==~a[3])
         return 1;
}
/*程序书写尽量规范写,代码的可读性才更强,调试起来也更加方便;不必要的代码可以删掉*/
void main()
{
        TMOD=0x11;                        //定时器工作方式控制
        EX0=1;                                //外部中断0
        IT0=1;                                  //外部中断0下降沿触发
        TH1=V_TH1;                         //定时器计数初值
        TL1=V_TL1;
        ET1=1;                                //定时器1中断使能
        TR1=1;                                 //开启定时器1
        ZKB1=40;         
        ZKB2=70;
       
        EA=1;         //全局中断
        while(1);
}
void wzd()interrupt 0
{
        EX0=0;
        TH0=0;
        TL0=0;
        TR0=1;
        while(IR==0);
        TR0=0;
        ltime=TH0*256+TL0;
        TH0=0;
        TL0=0;
        TR0=1;
        while(IR==1);
        TR0=0;
        htime=TH0*256+TL0;
        if((ltime>8500)&&(ltime<9500)&&(htime>4000)&&(htime<5000))
        {
                  if(jm()==1)
                  {
                           switch(a[2])
                           {
                                   case 0x0c:
                                                        ZKB1=ZKB1+5;ZKB2=100-ZKB1;beep();
                                                        break;
                                case 0x18:
                                                        ZKB1=ZKB1-5;ZKB2=100-ZKB1;beep();
                                                        break;
                        //        case 0x5e:       
                                         //   P1_0=0;
                                             //   P1_1=0;
                                                //        beep();
                                                //        break;
                        //        case 0x08:
                                                //        beep();
                                                //        break;         待用
                           }
                  }
        }
           return;
}
void timer0(void) interrupt 3 using 2
{
    static unsigned char click=0;
        TH1=V_TH1;                                    /*恢复定时器初始值*/
        TL1=V_TL1;
        ++click;
        if (click>=100) click=0;
        if (click<=ZKB1)      /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
                  P1_0=0;
        else
                  P1_0=1;
        if (click<=ZKB2)                        
                  P1_1=0;
        else
                  P1_1=1;
               
        EX0=1;
}


已退回1积分

上一篇:激光传感器的分类
下一篇:3D8 光立方

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top