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

📄 co_遥控电机r.c

📁 里面包含了多个C语言模块设计题目
💻 C
字号:
#include <AT89X52.h>
#define uint unsigned int 
static unsigned char data IRCode[3],IRCON,IRCON2;
bit DT=0;
bit flag,flag_p;      /////////// 0  对应串口  1 遥控

uint num_1=0,k=0,i=0,j,num=0,voicer=1,w,sign,jisuan=0,numi,wp,wn,pp, count = 0;
  
  step_index,speedlevel,
  spcount,
  stop_flag =0;
  uint step_num;
uint led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint vote[8]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;

void ledwork(void);
void gorun();

bit turn;

 float sum,tempn,nump,ppnum;

void voice()
{         
      P3_7=0;   
      for(j=0;j<2000;j++);
	  P3_7=1;    			
}

void main(void)
{ step_num=3600;   /*1200步*/
  count = 0;
  step_index = 0;
  spcount = 0;
  stop_flag = 0;
  k=10;
  P1_0 = 0;
  P1_1 = 0;
  P1_2 = 0;
  P1_3 =0;
	P3_7=1;
	TMOD= 0x11;  //////T1 ,  T0  16位模式   

	IT0=0; 
    EA=1;	   
    EX0=1;    
    DT=0;          ///////标志
	flag=0;        /////////////////串口控制
	PT0=1;
    ET1=1;
    TH1=0xff;          /*设置初始值,每隔4ms一次中断*/
    TL1=0x05;
    TR1=1;
  
     k=10;
     turn = 1;
     P3_7=1;
     speedlevel =1;
    	do
	       {	          
	       if(DT) 
            {
             for(j=0; j<8000; j++); //这里起到按键值正确后会有一个延时,防止重复按键         
             DT = 0;
            }
	        EX0 = 1;			 			     
			if(voicer==1)
		       {voice();
			   if(k==13)turn=!turn;			    
		        step_num=3600;
			    voicer=0;}    
		    }

	 	 while(1);
      }






//定时器0定时中断,遥控用
void Timer0(void) interrupt 1 using 1
{
  if(flag)    //////////遥控控制
  {
     TH0=0xFD;
     TL0=0x1E; //设定时值为800us

	 if(IRCON<3)
     {
       if(IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
       {
         IRCON2++;
         IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
         IRCode[IRCON]=IRCode[IRCON]|P3_2; //每八次填满一个字节,一个字节存放遥控编码4个位
       }
       else
       {
         IRCON++; //填满一个字节,指向下一个变量
         IRCON2=0; //计数清零
       }
    }
    else
    {

      flag=0;           ////////////串口控制
                  /////////////////////////暂时不允许int0中断

    	   
      if((IRCode[1]!=0xFF)&&(IRCode[2]!=0xFF))
     {
        if(IRCode[1]==0x55)
        { 		  
          switch(IRCode[2])
          {
            case 0xAB:               //1-8键控制
			k=1;
            break;
            case 0xAC:
			k=2;
            break;

            case 0xAD: 
			k=3;
            break;

            case 0xB2: 
			k=4;
            break;
            
			case 0xB3: 
			k=5;
            break;
            
			case 0xB4: 
			k=6;
            break;

            case 0xB5: 
			k=7;
            break;
            
			case 0xCA: 
			k=8;
            break;

			case 0xCB:
            k=9;
            break;

			case 0xAA:
            k=0;              //////////////  改变参数显示的类型
            break;

			case 0x2A:
            k=11;    //////music+++++++++++++++++         // 人工的触发
            break;
            
			case 0x2B:
    		k=12;    //////music------------------

            break;
            
			case 0x52:
            k=13;    //////对比+++++++
            break;
            
			case 0x53:
            k=14;    //////对比--------
            break;

			case 0x32:
            k=15;    //////色彩+++++++
            break;

			case 0x33:
            k=16;    //////色彩-------
            break;

			case 0x2C:
            k=17;    //////亮度+++++
            break;

			case 0x2D:
            k=18;    //////亮度-------
            break;

            case 0xD2:          //按关闭电源键
            P0 = 0xFF;
            k=10;
            
            break;
              }
		  voicer=1;
		  }
      }   
    }
  }  
}



void Int0(void) interrupt 0 using 0
{
   EX0=0; //外部中断0关闭
   DT=1;

   flag=1;     ////////遥控控制
   TH0=0xFD;
   TL0=0x1E; //设定时值为800us

   for(IRCON=0; IRCON<3; IRCON++)
   IRCode[IRCON] = 0;
   IRCON = 0;
   IRCON2 = 0; //计数清零
   ET0=1;     /////// T0中断        
   TR0 = 1;     //再启动///////////记数
}

void ledwork(void)   /*数码管工作函数*/
{  
       num=k;  
      if(num>=0&&num<10)
      w=1;
       else if(num>9&&num<100)
	    {w=2;i=i%2;}
	   else if(num>100&&num<1000)
	      {w=3;i=i%3;}
	      else if(num>=1000)
	      {w=4;i=i%4;}

  if(i==0)  {P0=led[num%10];led1=1;led2=1;led3=1;led0=0;}
  else if(i==1&&w>1)  {P0=led[num/10%10];  led0=1;led2=1;led3=1;led1=0;}
  else if(i==2&&w>2)  {P0=led[num/100%10]; led1=1;led2=1;led3=1;led2=0;}
  else if(i==3&&w>3)  {P0=led[num/1000%10];led0=1;led1=1;led2=1;led3=0;}
 } 



//定时器1定时中断,驱动电机用
void timer1(void) interrupt 3
{
  TH1=0xFF;
  TL1=0x55; //设定时每隔0.5ms中断一次
  count++;
  spcount--;
  if(spcount<=0&&k<13)   
	 {spcount =k*speedlevel;
      gorun(); }
  
    i++;
    i=i%w;
    ledwork();
}



void gorun()
{ 
  if(stop_flag==1)
  {    
    P1=0x00;
    return;
  }

  P1=vote[step_index];  //给脉冲以驱动电机

  if (turn==0)
  {
    step_index++;
    if (step_index>7)
      step_index=0;
  }
  else
  {
    step_index--;
    if (step_index<0)
      step_index=7;
  }
}

⌨️ 快捷键说明

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