?? 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 + -