|
求一个步进电机的红外遥控控制系统
硬件:stc89c51+28BYJ48步进电机+红外遥控+LCD1602液晶显示
要求:使用红外遥控实现步进电机的点动、连续运动、反转、停止。
共使用六个按钮,实现四种功能
点动无要求
连续运动的时候可以调节速度,可以设置3—5个挡位,并在1602显示器上面显示出来处于哪个挡位
反转采用一个按钮进行控制
下面的程序已经实现了遥控启动停止加速减速反转,没有加显示屏显示,并且加减速程序不太舒服,希望大佬可以改一下,求求大佬帮帮忙
单片机源程序如下:
- #include<reg51.h>
- void delay0();
- void delay();//可能是漏了函数原型. 如果在main{ ...} 以后定义了函数,main以前要加函数原型声明.
- unsigned char bdata ab[4];
- sbit P3_2=P3^2;
- char h=0;
- bit f0=0;
- int i=0;
- main()
- {
- char code zz[8]={0x07,0x03,0x0B,0x09,0x0D,0x0c,0x0E,0x06};
- char code fz[8]={0x06,0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07};
- char djh[5]={0x15,0x63,0x78,0xB1,0xEC};
- char djl[5]={0xA0,0xC0,0xD0,0xE0,0x78};
- P0=0xff;
- EA=1;
- EX0=1;
- //必须先初始化才能赋值;
- IT0=1;
- do
- {
- if(ab[2]==0x0c)
- //单步 //开始ab[2]未赋值的时候??
- { P0=0xf9;
- P2=f0==0?zz[i]:fz[i];
- //中断通过改变ab[2]的值来控制步进电机//f0决定正转反转
- i++;
- if(i>7)i=0;
- ab[2]=0;
-
-
- }
- else if(ab[2]==0x18) //连续
- { P0=0xa4;
- for(;;)
- { P2=f0==0?zz[i]:fz[i];
- TH0=djh[h];
- TL0=djl[h];
- delay();
- i++;
- if(i>7)i=0;
- if(ab[2]==0x0c ){ab[2]=0;break;}
- // 停止键和单步键能退出连续运行
- else if(ab[2]==0x5a ){break;}
- }
-
- }
- } while(1);
-
- }
- void delay0(unsigned char x) //x*0.14MS
- {
- unsigned char i;
- while(x--)
- {
- for (i = 0; i<7; i++) {}
- }
- }
- //简单的红外遥控解码程序(HT6221)
- void hongwai() interrupt 0 //入口点和出口点
- {
- unsigned char j,k,N=0;
- EX0 = 0;
- delay0(15);
- if (P3_2==1)
- { EX0 =1;
- return;
- }
- //确认IR信号出现
- while (!P3_2) //等IR变为高电平,跳过9ms的前导低电平信号。
- {delay0(1);}
- for (j=0;j<4;j++) //收集四组数据
- {
- for (k=0;k<8;k++) //每组数据有8位
- {
- while (P3_2) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
- {delay0(1);}
- while (!P3_2) //等 IR 变为高电平
- {delay0(1);}
- while (P3_2) //计算IR高电平时长
- {
- delay0(1);
- N++;
- if (N>=30)
- { EX0=1;
- return;} //0.14ms计数过长自动离开。
- } //高电平计数完毕
- ab[j]=ab[j] >> 1; //数据最高位补"0"
- if (N>=8) {ab[j] = ab[j] | 0x80;} //数据最高位补"1"
- N=0;
- }//end for k
- }//end for j
- if (ab[2]!=~ab[3])
- { EX0=1;
- return; }
- if(ab[2]==0x0c) //数据显示及用于步进电机控制
- {P0=0xf9;
- }
- else if(ab[2]==0x18)
- {P0=0xa4;
- }
- else if(ab[2]==0x5e)
- { P0=0xb0;
- f0=~f0;
- }
- else if(ab[2]==0x08)
- { P0=0x99;
- h++;
- if(h>4)h=4;
- }
- else if(ab[2]==0x1c)
- { P0=0x92;
- h--;
- if(h<0)h=0;
- }
- else if(ab[2]==0x5a)
- { P0=0x82;}
- EX0=1; ////开外部中断0
- }
- void delay()
- {
- TMOD=0x01;
- TR0=1;
- while(!TF0);
- TF0=0;
- TR0=0;
- }
复制代码 |
|