单片机红外遥控控制直流电机加速
时间: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;
}
#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积分