📄 ir- motor-lcd1602.c
字号:
data_temp = snum; //显示圈数
data_conv();
lcd_pos(0x44);
lcd_wdat(data_temp1);
// lcd_pos(0x45);
lcd_wdat(data_temp2);
data_temp = rate; //显示速率
data_conv();
lcd_pos(0x4d);
lcd_wdat(data_temp1);
// lcd_pos(0x4e);
lcd_wdat(data_temp2);
}
/********************************************************
/*
/* 显示运行方向符号
/*
/********************************************************/
void motor_DR()
{
if(direction==1) //正转方向标志
{
for(m=0;m<2;m++)
{
lcd_pos(0x0d+m); //显示方向符号
lcd_wdat(0x3e);
}
}
else
{
for(m=0;m<2;m++) //反转方向标志
{
lcd_pos(0x0d+m); //显示方向符号
lcd_wdat(0x3c);
}
}
}
/********************************************************
/*
/* 显示运行状态
/*
/********************************************************/
void motor_RUN()
{
if(on_off==1)
{ TR0=1;
lcd_pos(7); //设置显示位置为第一行的第1个字符
for(m=0;m<5;m++)
lcd_wdat(cdis5[m]); //RUN
motor_DR(); //
}
else
{ TR0=0; P1 =0xf0;
lcd_pos(7); //设置显示位置为第一行的第1个字符
for(m=0;m<5;m++)
lcd_wdat(cdis6[m]); //STOP
motor_DR(); //
snum=snum1; //
number1=0; //清圈数计数器
}
}
/********************************************************
*
* 主程序
*
*********************************************************/
main()
{
LCD_init_DIS();
// IE=0x81; //允许总中断中断,使能 INT0 外部中断
// TCON=0x01; //触发方式为脉冲负边沿触发
TMOD = 0x01; //T0定时方式1
TL0 = 0x33;
TH0 = 0xf5;
ET0 = 1;
EA = 1;
P1 = 0xf0;
while(1)
{
IR_IN();
TEMP=IRCOM[2];
if(flag)
{
/********************************************************
运行控制
********************************************************/
if(TEMP==0x10) //启动、停止
{
on_off=~on_off;
motor_RUN();
}
/********************************************************
设定圈数
********************************************************/
if(TEMP==0x09) //增加圈数
{
if(snum!=0x14)
{
snum++;
snum1=snum;
}
}
if(TEMP==0x1f) //减少圈数
{
if(snum!=0x00)
{
snum--;
snum1=snum;
}
}
/********************************************************
方向转换
********************************************************/
if(TEMP==0x11) //正转
{
direction=1;
motor_DR();
}
if(TEMP==0x19) //反转
{
direction=0;
motor_DR();
}
/********************************************************
速率调整
********************************************************/
if(TEMP==0x12) //增加速率,减速
{
if(rate!=0x10)
rate++;
}
if(TEMP==0x1d) //减少速率,加速
{
if(rate!=0x01)
rate--;
}
if(TEMP==0x03)
{
if(on_off&(!pause1))
{
pause1=1;
TR0=0; //暂停
lcd_pos(7); //设置显示位置
for(m=0;m<5;m++)
lcd_wdat(cdis7[m]); //PAUSE
}
else if(pause1)
{
motor_RUN();
pause1=0;
TR0=1;
}
}
flag=0;
} // end of if(flag)
/********************************************************/
if(number1==snum1) //与设定圈数是否相等
{
number1=0;
on_off=0;
TR0=0;
snum=snum1;
P1 =0xf0;
motor_RUN();
}
data_dis();
} // while(1) end
} //main end
/********************************************************/
/*
/* 定时器 0 中断
/*
/********************************************************/
void motor_onoff() interrupt 1
{
TL0 = 0x33;
TH0 = 0xf5;
q++;
if(q < rate)
{ return; }
else
{ q=0;
number++; //脉冲计数
if(number==96) //96个脉冲电机转一圈
{ snum--;
number=0;
number1++; } //电机转动圈数
if(direction==1) //方向标志
{ if(v<8)
{P1 = FFW[v];v++;} //取数据,正转
if(v==8)
{ v=0; }
}
else
{ if(v<8)
{P1 = REV[v];v++;} //取数据,反转
if(v==8)
{ v=0; }
}
}
}
/**********************************************************
中断服务函数
**********************************************************/
void IR_IN() //interrupt 0 using 0
{
unsigned char j,k,N=0;
// EX0 = 0;
delayB(15);
if (IRIN==1) //确认IR信号是否出现
{
// EX0 =1;
return;
}
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
delayB(1);
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
delayB(1);
while (!IRIN) //等 IR 变为高电平
delayB(1);
while (IRIN) //计算IR高电平时长
{
delayB(1);
N++;
if (N>=20)
{
// EX0=1;
return; //0.14ms计数过长自动离开。
}
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补"0"
if (N>=8)
IRCOM[j]=IRCOM[j] | 0x80; //数据最高位补"1"
N=0;
}//end for k
} //end for j
if(IRCOM[2]!=~IRCOM[3]) //检验接收数据是否正确
{ //EX0=1;
return; }
if(IRCOM[0]!=0x00) //效验用户码
{
// EX0=1;
return;
}
beep(); //接收有效,蜂鸣器响一声
flag=1 ; //置接收有效标志
// EX0 = 1; //重开中断
}
/*********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -