Altium Designer画的基于STC15的循迹避障遥控车原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- #include "all.h"
- extern unsigned char code INRECO[],TL[],TriLU[],TriLD[],TRU[],TRD[],FR[],TriRU[],TriRD[],ST[],TR[],BR[],Back[];
- extern bit deal_over;
- extern bit deal_over_flag;
- extern bit flag;
- extern ADC_BF_value,ADC_LR_value;
- bit Show_flag,Tracing_flag,U_flag,clean_flag,light_flag,RE_flag,RECO_flag,Send_T_flag,S_flag,Send_U_flag,LRF_flag,B_flag,Blue_flag,Back_flag,Send_V_flag;
- int switch_flag,UD_flag,V_flag;
- sbit key=P2^0;
- sbit key2=P3^2;
- sbit key3=P2^0;
- void main(void)
- {
- Oled_init();
- ADC_init();
- uart_init();
- fill_picture(0x00); //清屏
- while(1)
- {
- if(Blue_flag==0)
- {
- ES=0;
- TI=1;
- printf("%s","BCS");
- while(!TI);
- TI=0;
- ES=1;
- }
- if(key==0) //切换显示模式
- {
- switch_flag++;
- switch_flag=switch_flag%3;
- clean_flag=1;
- if(RECO_flag==1)
- {
- RECO_flag=0; //摇杆模式 标志位
- switch_flag=0;
- S_flag=0;
- }
- while(!key);
- }
- if(RECO_flag==0)
- if(switch_flag==0)
- State();
- else if(switch_flag==1)
- Mode_SW();
- else if(switch_flag==2)
- V_SW();
- if((ADC_BF_value>300||ADC_BF_value<200)&&switch_flag==1) //处于模式切换界面时的遥杆操作
- {
- if(ADC_BF_value<200)
- UD_flag--;
- if(ADC_BF_value>300)
- UD_flag++;
- if(UD_flag>=3)
- UD_flag=0;
- if(UD_flag<0)
- UD_flag=2;
- clean_flag=1;
-
- }
- if((ADC_BF_value>300||ADC_BF_value<200)&&switch_flag==2) //处于速度切换界面时的遥杆操作
- {
- if(ADC_BF_value<200)
- V_flag-=1;
- if(ADC_BF_value>300)
- V_flag+=1;
- if(V_flag>=10)
- V_flag=0;
- if(V_flag<0)
- V_flag=9;
- Send_V_flag=1;
- clean_flag=1;
- }
- if((ADC_LR_value>400||ADC_LR_value<100)&&switch_flag==1)
- {
- if(UD_flag==0) //循迹切换开关
- {
- Tracing_flag=!Tracing_flag;
- Send_T_flag=!Send_T_flag;
- }
- if(UD_flag==1) //避障切换开关
- {
- U_flag=!U_flag;
- Send_U_flag=!Send_U_flag;
- }
- if(UD_flag==2) //进入
- {
-
- RECO_flag=1;
- if(S_flag==0)
- {
- fill_picture(0x00); //清屏
- ShowCN(INRECO,4,0,8);
- delay(100);
- fill_picture(0x00); //清屏
- Show_array(INRECO,0,2,4,3);
- S_flag=1;
- switch_flag=3;
- }
- Show_array(INRECO,0,2,4,3);
- }
- clean_flag=1;
- }
- /*************遥杆模式的显示调用和数据发送*****************/
- if(ADC_LR_value<100&RECO_flag==1) //left
- {
- if(clean_flag==1)
- fill_picture(0x00);
- clean_flag=0;
- ShowCN(TL,3,0,1);
- ShowCN(TriLU,3,1,1);
- ShowCN(TriLD,5,1,1);
- ShowCN(TRU,3,2,1);
- ShowCN(TRD,5,2,1);
- Show_array(TL,5,0,1,1);
- if(LRF_flag==1)
- {
- ES=0;
- TI=1;
- printf("%s","TLS");
- while(!TI);
- TI=0;
- ES=1;
- LRF_flag=0;
- }
- B_flag=1;
- clean_flag=1;
- if(ADC_LR_value<=100)
- {
- B_flag=0;
- }
- else
- B_flag=1;
- }
- if(ADC_BF_value<100&&RECO_flag==1) //forward
- {
- if(clean_flag==1)
- fill_picture(0x00);
- clean_flag=0;
- ShowCN(FR,2,2,1);
- ShowCN(TriLU,2,3,1);
- ShowCN(TriRU,2,4,1);
- ShowCN(ST,4,3,2);
- Show_array(FR,2,5,1,1);
- if(LRF_flag==1)
- {
- ES=0;
- TI=1;
- printf("%s","GOS");
- while(!TI);
- TI=0;
- ES=1;
- LRF_flag=0;
- }
- B_flag=1;
- clean_flag=1;
- if(ADC_BF_value<=100)
- {
- B_flag=0;
- }
- else
- B_flag=1;
- }
- if(ADC_BF_value>400&&RECO_flag==1) //Back
- {
- if(clean_flag==1)
- fill_picture(0x00);
- clean_flag=0;
- ShowCN(Back,6,2,1);
- ShowCN(TriLD,6,3,1);
- ShowCN(TriRD,6,4,1);
- ShowCN(ST,4,3,2);
- Show_array(Back,6,5,1,1);
- Back_flag=0;
- if(LRF_flag==1)
- {
- ES=0;
- TI=1;
- printf("%s","BAS");
- while(!TI);
- TI=0;
- ES=1;
- LRF_flag=0;
- }
- B_flag=1;
- clean_flag=1;
- while(ADC_BF_value>400);
- }
- if(ADC_LR_value>400&&RECO_flag==1) // right
- {
- if(clean_flag==1)
- fill_picture(0x00);
- clean_flag=0;
- ShowCN(TR,3,6,1);
- ShowCN(TriRU,3,5,1);
- ShowCN(TriRD,5,5,1);
- ShowCN(TRU,3,4,1);
- ShowCN(TRD,5,4,1);
- Show_array(TR,5,6,1,1);
- if(LRF_flag==1)
- {
- ES=0;
- TI=1;
- printf("%s","TRS");
- while(!TI);
- TI=0;
- ES=1;
- LRF_flag=0;
- }
- B_flag=1;
- clean_flag=1;
- while(ADC_LR_value>400);
- }
- if((100<ADC_BF_value<400)&&(100<ADC_LR_value<400)&&RECO_flag==1) //stop
- {
- if(clean_flag==1)
- fill_picture(0x00);
- clean_flag=0;
- ShowCN(BR,5,3,2);
- LRF_flag=1;
- if(B_flag==1)
- {
- ES=0;
- TI=1;
- printf("%s","BKS");
- while(!TI);
- TI=0;
- ES=1;
- B_flag=0;
- clean_flag=1;
- }
- }
-
- /***************切换模式界面的串口发送*************************/
- if(U_flag==1&&Tracing_flag==1&&switch_flag==1&&(Send_T_flag==1||Send_U_flag==1))
- {
- ES=0;
- TI=1;
- printf("%s","UTOS");
- while(!TI);
- TI=0;
- Send_U_flag=0;
- Send_T_flag=0;
- ES=1;
- }
- if(U_flag==0&&Tracing_flag==0&&switch_flag==1&&(Send_T_flag==1||Send_U_flag==1))
- {
- ES=0;
- TI=1;
- printf("%s","UTCS");
- while(!TI);
- TI=0;
- Send_U_flag=0;
- Send_T_flag=0;
- ES=1;
- }
- if(U_flag==1&&Send_U_flag==1&&switch_flag==1)
- {
- ES=0;
- TI=1;
- printf("%s","UOS");
- while(!TI);
- TI=0;
- Send_U_flag=0;
- ES=1;
- }
- if(U_flag==0&&Send_U_flag==1&&switch_flag==1)
- {
- ES=0;
- TI=1;
- printf("%s","UCS");
- while(!TI);
- TI=0;
- Send_U_flag=0;
- ES=1;
- }
- if(Tracing_flag==1&&Send_T_flag==1&&switch_flag==1)
- {
- ES=0;
- TI=1;
- printf("%s","TOS");
- while(!TI);
- TI=0;
- Send_T_flag=0;
- ES=1;
- }
- if(Tracing_flag==0&&Send_T_flag==1&&switch_flag==1)
- {
- ES=0;
- TI=1;
- printf("%s","TCS");
- while(!TI);
- TI=0;
- Send_T_flag=0;
- ES=1;
- }
- }
- }
复制代码
所有资料51hei提供下载:
作品.7z
(959.22 KB, 下载次数: 37)
|