📄 pic_car.c
字号:
void interrupt tmr0_int(void)
{ int i;
// char data;
STATUS_TEMP=STATUS;
PCLATH_TEMP=PCLATH;
if(T0IE&&T0IF)
{ T0IF=0;
TMR0=6;
RTC++;
LEDR=LightR;
LEDL=LightL;
//*************************************PID*************************************
if(RTC%64==0)
{if(speed!=0)
{
e[k_2]=e[k_1];
e[k_1]=e[k];
e[k]=speed-(wheelcircle-wheelcircle_for_math);
du=(int)(KP*(e[k]-e[k_1])+KI*e[k]+KD*(e[k]-2*e[k_1]+e[k_2]));
du=du/100;
u[k]=u[k_1]+du;
if(PWM_MOTOR2==0)
{
if(u[k]>200) CCPR1L=200;
else if(u[k]<0) CCPR1L=0;
else CCPR1L=u[k];
}
else {
if(u[k]>200) CCPR1L=0;
else if (u[k]<0) CCPR1L=200;
else CCPR1L=200-u[k];
}
u[k_1]=u[k];
//*************************************************************
if((wheelcircle-wheelcircle_for_math)==0) speedtest++;
else speedtest=0;
if(speedtest>32)
{speedtest=0;}
//**************************************************************
wheelcircle_for_math=wheelcircle;
}
else {CCPR1L=0;PWM_MOTOR2=0;e[k]=e[k_1]=e[k_2]=0;u[k]=u[k_1]=0;}
}
//***************************舵机控制*****************************//
if(helmcount<500)
{if(helmcount%20==0) PWM_HELM=1;
else if(helmcount%20==1)
{
for(i=0;i<PWMontimeHelm;i++){};
PWM_HELM=0;
}
else PWM_HELM=0;
helmcount++;
}
//**************************** 障碍检测并数据处理***********************//
// LightL LightR
// (高) redlightdata (低)
//**************************************************************************
if(RTC%8==0)
{redlightdata=0;
if(leftredlight>5) redlightdata=((redlightdata+1)<<1);
else redlightdata=redlightdata<<1;
if(rightredlight>5)
redlightdata=redlightdata+1;
else redlightdata=redlightdata+0;
rightredlight=0;
leftredlight=0;
}
else
{
if(LightR) rightredlight++;
if(LightL) leftredlight++;
}
//*******************AD********************************//
if(RTC%1024==0)
{
//LEDR=LEDR^1;
//LEDL=LEDL^1;
//AD_RESULT=AD();
//AD_RESULT_DES=(int)(AD_RESULT/2);
//约等于((AD_RESULT/1023)*5*100);
//sprintf(s,"%4d",AD_RESULT_DES);
}
} // end toif
//*****************************红外线遥控中断************************//
if(INTE&&INTF) //RB0
{
INTF=0;
LEDL=LEDL^1;
LEDR=LEDR^1;
while(1)
{Temp_H=RTC;
Temp_L=TMR0;
NowTime=(Temp_H<<8)+Temp_L;
if(Temp_H==RTC) break;
}
AllTime=NowTime-SaveTime;
if(LastFlag==1)
{
if((AllTime>200)&&(AllTime<375)) //275
RedLightData.DataIn=(RedLightData.DataIn<<1)+0;
else if((AllTime>420)&&(AllTime<650))
RedLightData.DataIn=(RedLightData.DataIn<<1)+1;
else if(AllTime>2500)
{LastFlag=0;
PreFlag=0;
Count=0;
RBIE=1;
} //550
}
if((AllTime>2000)&&(AllTime<2500)) //9
{ PreFlag=1;
Count=0;
LastFlag=0;
}
if((Count==1)&&(((AllTime<375)&&(AllTime>175))&&(PreFlag==1)))
{ LastFlag=1;
RedLightData.DataIn=0;
PreFlag=0;
}
if((AllTime>4000)&&(Count>1))
{ LastFlag=0;
PreFlag=0;
Count=0;
}
Count++;
SaveTime=NowTime;
}
if(RBIE&&RBIF) //RB5
{
RBIF=0;
PORTB=PORTB;
if((PORTB&0b11000000)!=0b11000000)
{ for(i=0;i<32000;i++) {}
move_pump=1; //后退
}
else
{
wheelcircle=wheelcircle+1;
wheelcircleadd=1;
if(manual_auto_flag==1)
{if(auto_go_back!=goback) now_circle++;
else{ now_circle--;
if(move_data_record_rightorleft==middle)
back_circle_record--;
}
}
}
RBIF=0;
} //end rbif
STATUS=STATUS_TEMP;
PCLATH=PCLATH_TEMP;
}
void ultrared_deal(void)
{ if((RedLightData.redlight[0]^0xff)==(RedLightData.redlight[1]))
{
DataOut=RedLightData.redlight[1];
remotecontrol();
RedLightData.DataIn=0;
}
}
void move_deal(void)
{
//*********************************车自动运行处理*************************************//
if(manual_auto_flag)
{ if((speedtest>15)||(move_pump==1))
{
speedtest=0;
move_pump=0;
if(auto_go_back==goback)
{ move_reset();
TXREG=ACCIDENT;
}
else
{ push();
auto_go_back=goback;
}
}
switch(auto_go_back)
{
case gohead : deal_lightmessage();
break;
case goback: auto_back();
break;
case left: turn_left();
break;
case right: turn_right();
break;
default: break;
} //end switch
} //end if
else
{
}
}
void turn_left(void)
{status(speed2);
if((now_goorback!=gohead)||(now_rightorleft!=left))
{
status(gohead); //左转 右前方障碍
status(left);
}
if(now_circle>=turn_circle_define)
{auto_go_back=gohead;
}
if(redlightdata!=0)
{ push();
auto_go_back=goback;
}
}
void turn_right(void)
{status(speed2);
if((now_goorback!=gohead)||(now_rightorleft!=right))
{
status(gohead); //左转 右前方障碍
status(right);
}
if(now_circle>=turn_circle_define)
{auto_go_back=gohead;
}
if(redlightdata!=0)
{ push();
auto_go_back=goback;
}
}
void deal_lightmessage(void)
{ if(now_goorback!=gohead)
status(gohead);
switch(redlightdata)
{ case 0: //无
if(now_rightorleft!=middle)
{push();
status(middle);
}
status(speed4);
break;
case 1:status(speed2);
if(now_rightorleft!=left) //左转 右前方障碍
{push();
status(left);
}
else
{
if(now_circle>goback_circle_define)
{push();
auto_go_back=goback;
}
}
break;
case 2:status(speed2);
if(now_rightorleft!=right) // 右转 左前方障碍
{push();
status(right);
}
else
{
if(now_circle>goback_circle_define)
{push();
auto_go_back=goback;
}
}
break;
case 3:push();
auto_go_back=goback;
//都有
break;
default :break;
}
}
//*************************************************************
//
//
//move_data_status 7 6 5 4 3 2 1 0
//***************************************************************
void push(void)
{char ppp;
if(move_data_pointer!=-1)
{move_data_leftorright[move_data_pointer]=now_rightorleft;
if(now_circle>0xff)
move_data_circle[move_data_pointer]=0xff;
else move_data_circle[move_data_pointer]=now_circle;
move_data_pointer=move_data_pointer-1;
}
else {for(ppp=0;ppp<move_data_number-1;ppp++)
{ move_data_circle[move_data_number-1-ppp]=move_data_circle[move_data_number-2-ppp];
move_data_leftorright[move_data_number-1-ppp]=move_data_leftorright[move_data_number-2-ppp];
}
move_data_leftorright[0]=now_rightorleft;
if(now_circle>0xff)
move_data_circle[0]=0xff;
else move_data_circle[0]=now_circle;
}
now_circle=0;
}
void pop(void)
{move_data_pointer=move_data_pointer+1;
if(move_data_pointer>=move_data_number)
{deal_stop();
if(go_back_end==1) TXREG=COME_BACK_ORIGINAL;
else TXREG=NOWAY_OUT;
move_data_record_rightorleft=0;
go_back_end=0;
}
else
{move_data_record_rightorleft=move_data_leftorright[move_data_pointer];
now_circle=move_data_circle[move_data_pointer];
}
back_circle_record=back_circle_record_define;
}
void auto_back(void)
{status(speed3);
if(now_goorback!=goback) status(goback);
if(now_circle<=0)
{ pop();
if((move_data_record_rightorleft==right)&&(now_rightorleft!=right))
status(right);
else if((move_data_record_rightorleft==left)&&(now_rightorleft!=left))
status(left);
else if((move_data_record_rightorleft==middle)&&(now_rightorleft!=middle))
status(middle);
}
if((back_circle_record<=0)&&(go_back_end==0))
{
if(move_data_pointer>=1)
{
if(move_data_leftorright[move_data_pointer-1]==left)
auto_go_back=right;
else auto_go_back=left;
}
else {if(RTC%2==0)
auto_go_back=right;
else auto_go_back=left;
}
back_circle_record=back_circle_record_define;
now_circle=0;
move_data_circle[move_data_pointer]=move_data_circle[move_data_pointer]-back_circle_record_define;
move_data_pointer=move_data_pointer-1;
}
}
void move_data_clear(void)
{char tt;
for(tt=0;tt<move_data_number;tt++)
{move_data_circle[tt]=0;
move_data_leftorright[tt]=0;
}
}
void move_reset(void)
{move_data_clear();
move_data_pointer=move_data_number-1;
now_circle=0;
now_rightorleft=now_goorback=0;
back_circle_record=back_circle_record_define;
manual_auto_flag=1;
auto_go_back=gohead;
auto_manualcount_key=0;
speedtest=0;
}
void main(void)
{ char jk,j;
unsigned int data0=0;
unsigned int q=0;
sys_initial();
setrctx();
LCD_initial(); // 液晶显示初始化
LCD_INIT(1); // LCD的1边初始化
LCD_INIT(2); //LCD的2边初始化
show_tu(hit);
//eeprom_write(0x00,0xaa);
//data0=eeprom_read(0x00);
TXREG=MUSIC;
while(1==1)
{
//***********************************红外数据处理**********************************
ultrared_deal();
//*************************************语音辨识数据处理**********************************//
move_deal();
//**************************************LCD*************************************
//***************************************语音与辨识*****************************
bsr_sound();
} // end while
}
void bsr_sound(void)
{ if(RCIE&&RCIF)
{
data=RCREG;
CREN=1;
if(data==COMMAND_NAME)
{// bsr_sound_excitated=1;
TXREG=YES_HERE;
bsr_time_between=RTC;
}
// else if ((RTC-bsr_time_between)>4096)
// { //bsr_sound_excitated=0;
// TXREG=NAME_FIRST;
// }
else
{//if(bsr_sound_excitated==1)
TXREG=YES_SIR;
// bsr_sound_excitated=0;
switch(data)
{case COMMAND_ONE: manual_auto_flag=1; //出发
auto_go_back=gohead;
break;
case COMMAND_TWO: manual_auto_flag=1; //回来
auto_go_back=goback;
go_back_end=1;
break;
case COMMAND_THREE: //跳舞
break;
case COMMAND_FOUR: break; //纪录
default : break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -