#include "header.h"
#include "1602.h"
unsigned char signal ;
unsigned char duty;
unsigned char TempData[2];
unsigned char IRcord[4];
char code Tab[16]="0123456789ABCDEF";
bit irpro_ok;
void Delay(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for ( i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void main()
{
EA=1;
P1M0=0x28; //设置控制继电器IO口为强推挽输出
P1M1=0x00;
duty=0;
Turn1=0;
Turn2=0;
Ug1=0;
signal = 0;
LCD_init();
PWM_init();
ADC_init();
timer_init();
Int0();
while (1)
{
if (irpro_ok)
{
TempData[0]=Tab[signal/16];
TempData[1]=Tab[signal%16];
lcd_showchar(0x46,TempData);
switch(signal)
{
case 0x44 :
{
if(Turn1==Turn2&&Turn1==0)
{
duty=120;
CR=0;
Delay(600);
Turn1=1;
Turn2=1;
CR=1;
}
else
{
duty=120;
Turn1=1;
Turn2=1;
}
} break;
case 0x40 :
{
if(Turn1==Turn2&&Turn1==1)
{
duty=120;
CR=0;
Delay(600);
Turn1=0;
Turn2=0;
CR=1;
}
else
{
duty=120;
Turn1=0;
Turn2=0;
}
} break;
case 0x43:
{ //停止
duty = 255;
Turn1=0;
Turn2=0;
CR = 0; //关闭PCA模块,停止输出PWM调速信号
} break;
case 0x15:
{ //加速
if (duty>14)
duty=duty-15;
else
duty = 120;
} break;
case 0x07:
{ //减速
if (duty<255)
duty=duty+15;
else
duty = 120 ;
} break;
default : _nop_();break;
}
CCAP1H=CCAP1L=duty;
lcd_showdata(0x05,duty);
Delay(15);
timer_init();
EX0=1;
}
}
}
void INT0_Rountine() interrupt 0 using 0 //红外信号接收解码
{
char j,k;
static unsigned char temp;
static unsigned int timer0;
//duty = 255; //停止电机
CR = 0; //停止PWM信号输出
EX0 = 0; //关闭中断0
Delay(15);
if (INT0==1)
{
EX0=1;
return ; //防止重复按键
}
signal= 0;
irpro_ok=0;
TMOD=0x09;
TH0=0;
TL0=0;
ET0=0; //关闭定时器中断
ET1=0;
TR0=1; //启动脉宽测量T0
while(!INT0) //跳过红外输出的引导信号9ms低电平
;
while(INT0) //跳过引导信号4.5ms高电平
;
timer0 = TH0*256+TL0;
if (4000<timer0&&timer0<5000)
{
timer0 = 0;
TH0 = 0;
TL0 = 0;
for(j=0;j<4;j++)
{
for(k=0;k<8;k++)
{
temp>>=1; //读取红外数据存在高位,每次读取后将数据右移一位
while(!INT0); //跳过信号低电平段
while(INT0); //跳过信号高电平段
timer0 = TH0*256 +TL0; //计算高电平段信号时间
if(450<timer0&&timer0<650) //根据高电平时间判断信号内容 0.56ms为信号0,1.685ms为信号1
temp=temp&0x7f; //读取该位为0,存在最高位
else
temp=temp|0x80;
timer0 = 0;
TH0 = 0;
TL0 = 0;
}
IRcord[j]=temp;
timer0=0;
temp=0;
}
if(IRcord[2]==~IRcord[3])
{
signal=IRcord[2];
irpro_ok=1;
return ;
}
else
{
EX0 = 1; //从新打开外部中断0,从新接收红外信号
irpro_ok=0;
return ;
}
}
else
{
EX0 = 1; //从新打开外部中断0,从新接收红外信号
irpro_ok=0;
return ;
}
}
不但标题没打完,程序也没粘完。上面帮你粘完了,哪个变量不对?
|