📄 liu3.c
字号:
for(i=0;i<25000 && !P3_2&&!F_warn;i++);//等待
//调节
void adjust(void)
{
uchar i;
uchar s_width; //定义设置速度与当前滴速的差值
if(cur_speed>set_speed) //当前速度大于设置速度,正转,P1_6控制转动方向
{
s_width=cur_speed-set_speed;
P1_6=0; //正转准备
}
else //当前速度小于设置速度,反转
{
s_width=set_speed-cur_speed;
P1_6=1; //反转准备
}
while((judge()>(set_speed/5))&&(set_speed>30)&&(!F_warn)&&(!F_key))
{ //无报警信号,自动调节,设置速度大于30,速度差大于设置的20%
P1_7=1;
delay(300);
P1_7=0;
delay(300); //全速至20%
display(Dis_buff); //送显
}
while((judge()>(set_speed/10))&&(set_speed>30)&&(!F_warn)&&(!F_key))
{ //无报警信号,自动调节,设置速度大于30,速度差大于设置的10%
P1_7=1;
delay(300);
P1_7=0;
delay(1000);
display(Dis_buff); //减速至10%
}
if(judge()>(set_speed/20)&&(set_speed>30)&&(!F_warn)&&(!F_key))
{
for(i=0;i<250&&(!F_warn)&&(!F_key);i++)
{
P1_7=1;
delay(100);
P1_7=0;
delay(3000); //微调至5%
display(Dis_buff);
}
}
while(judge()>(set_speed/10)&& (set_speed<31)&&(!F_warn)&&(!F_key)) //速度设定小于30,特殊处理
{
if(cur_speed>60)
{
P1_7=1;
delay(300);
P1_7=0;
delay(300);
display(Dis_buff); //全速
}
else if(cur_speed>40)
{
P1_7=1;
delay(300);
P1_7=0;
delay(1200);
display(Dis_buff); //减速
}
else if(cur_speed>30)
{
P1_7=1;
delay(300);
P1_7=0;
delay(3000);
display(Dis_buff); //减速
}
else
{
for(i=0;(i<20)&&(!F_warn)&&(!F_key);i++)
{
P1_7=1;
delay(300);
P1_7=0;
delay(5000);
display(Dis_buff); //微调
}
}
}
display(Dis_buff);
for(i=0;(i<250)&&(!F_warn) && (set_speed>30)&&(!F_key);i++)
{
P1_7=1;
delay(300);
P1_7=0;
delay(3000);
display(Dis_buff); //微调
}
}
uchar judge(void) //判断正反转方向,并计算速度差
{
uchar width;
if(cur_speed>set_speed)
{
width=cur_speed-set_speed; //width为速度差
P1_6=0; //正转准备
}
else
{
width=set_speed-cur_speed;
P1_6=1; //反转准备
}
return width;
}
/////////////////////////////////////////////////////////////
///////////////////串行通信函数//////////////////////////////
uchar code comm_s=0x02;//这是从机号,以二号从机为例
//comm_s[0]:机器号
//comm_s[1]:自动
//comm_s[2]:手动
//comm_s[3]:字节1
//comm_s[4]:字节2
//comm_s[5]:字节3
//comm_s[6]:结束
extern bit F_auto,F_warn;//F_auto为主控(自动)/从控标志位
extern uchar warn,cur_speed,set_speed;
extern uchar Dis_buff[16];
uchar receive(void)
{
uchar j,R_Data;
En_send=0;//处于接收状态
for(j=0;j<1000;j++)
{
if(RI!=0)//有中断请求
{
RI=0;
R_Data=SBUF;//接收数据放R_Data里
break;
}
}
RI=0;
if(j>999)R_Data=0xff;//在规定时间内未接到信息则返回ff
return R_Data;
}
void send(uchar se_dat)//发送从机设置的速度
{
En_send=1;//处于发送状态
SBUF=se_dat;//发送数据
while(TI==0);//等待发送完毕
TI=0; //软件清0
En_send=0;//不发送则清0
}
void commution(void)
{
uchar slave,dat_sp,dis_sp1;
ES=0;//关中断
if(RB8==1)//接收到的第9位为1,表明接收的是地址
{
slave=receive();
if(slave==comm_s)//接收到的地址等于机器号
{
SM2=0; //开始单机通信,将接收到的数据装入SBUF中
send(comm_s);//返回本机地址
}
}
else
{
dat_sp=receive();//否则,接收到的为数据属性命令字
switch(dat_sp)
{
case 0xe0: //主控,从机处于按键无效状态(紧急报警除外)
{
F_auto=1; //自动标志位置1
set_speed=receive();//设置速度等于主机设置值
Dis_buff[2]='A'; //显示缓存置A,表示auto
if(!F_warn) //将速度送显示缓存
{
Dis_buff[8]=set_speed%10+'0';
dis_sp1=set_speed/10;
Dis_buff[7]=dis_sp1%10+'0';
Dis_buff[6]=dis_sp1/10+'0';
if(Dis_buff[6]=='0')Dis_buff[6]=' ';
}
}break;
case 0xe3://授权从机,从机处于手动调节状态
{
F_auto=0;//标志位置0
send(set_speed);//返回从机设置速度值
Dis_buff[2]='H';//H表示hand,送显示缓存
}break;
case 0xfe://终止命令字
{
SM2=1;//多机通信控制位置1,恢复多机通信
}break;
case 0xf0://返回当前warning
{
send(warn);
}break;
case 0xf1://返回从机当前滴速
{
send(cur_speed);
}break;
default:break;
}
}
ES=1;//开串行口中断
}
///////////////////////////LCD显示程序/////////////////
/*查询LCD是否忙*************************************************/
void delay(uint shu) //延时,数可以自己定义
{for(;shu!=0;shu--);}
void wait(void) //读忙状态
{do{ACC=lcdr;}while(ACC_7==1);delay(10);} //ACC_7=1,则lcd忙
void display(uchar *tab) //*tab指向要显示数据缓冲区首地址
{
uchar i;
wait();
lcdcom=0x80; //80置DDRAM地址为00H,从第一行开始显示
for(i=0;i<8;i++)
{
wait();
lcdw=tab[i]; //显示表中前8位
}
wait();
lcdcom=0xc0; //c0置DDRAM地址为40H,换为第二行显示
for(;i<16;i++) //在第二行显示后8位
{
wait();
lcdw=tab[i];
}
}
/*LCD初始化***********/
void lcdinit(void)
{
uchar i;
wait();lcdcom=0x38; wait();lcdcom=0x06; //38表示双行显示,5*7点阵 ;06表示AC 增量,显示不移位,
wait();lcdcom=0x0f; wait();lcdcom=0x01; //显示开,显示光标,光标闪烁;01是清屏
wait();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -