⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pic_car.c

📁 用PIC单片机开发的自动小车控制源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
 //一圈45脉冲
//b 6 7 为触角 分别为 左脚 与右脚 


#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
__CONFIG(0x3f71);
#define stop 							0x01
#define gohead 							0x02
#define goback 							0x03
#define speed1 							0x11
#define speed2 							0x12
#define speed3 							0x13
#define speed4 							0x14
#define speed5 							0x15
#define speed6 							0x16 
#define speed7 							0x17 
#define speed8 							0x18 
#define speed9 							0x19 

#define right 							0x21 
#define left 							0x22 
#define rightadd 						0x23 
#define leftadd 						0x24 

#define middle 							0x25

#define speedadd 						0x50
#define speeddel 						0x60
#define speedaddbig 					0x51
#define speeddelbig 					0x61
                        
#define showgohead 						0x91
#define showgoback 						0x92

#define forauto 						0x55
#define manual 							0x66


#define RateHelm  						3
#define RateMotor 						1 


//***************语音数据***************************//
#define  SYS_INIT_START              	0
#define  ENTER_NAME                   	1
#define  FIRST_ORDER				   	2	
#define  SECOND_ORDER				   	3
#define  THIRD_ORDER  				  	4
#define  FOUR_ORDER  					5
#define  SAYAGAIN   					6
#define  NOISY  						7
#define  ENTER_DIF  					8
#define  NOVOICEDETECTED  			  	9
#define  SYS_INIT_END  				  	10

#define  POWER_ON  					  	11
#define  POWER_OFF  					12
#define  LOW_POWER    	                13
#define  SCILENT  					  	14
#define  AUTO_MODLE  					15
#define  REMOTE_MODLE  				  	16
#define  YES_HERE						17
#define  YES_SIR						18
#define  NOWAY_OUT						19
#define  COME_BACK_ORIGINAL				20
#define  START_RECORD					21
#define  END_RECORD						22
#define  ACCIDENT						23
#define  COMPLETE_TASK					24
#define  DISCOMPLETE_TASK				25
#define  SYS_RESTART					26
#define  OPERATE_ERROR                  27
#define  NAME_FIRST                     28

//***************主机pic发送额外命令*********//
#define  SYS_INIT_TIP                   55    //请求系统初始化
#define  START_INIT                     44    //答应初始化
#define  SCIENT_OFF                     45
#define  MUSIC                          46
#define  MUSIC_ERROR                    56

//***************主机PIC接受辨识结果数据******************//
#define COMMAND_NAME 					0xF0      //名字
#define COMMAND_ONE	        			0xF1      //出发
#define COMMAND_TWO	        			0xF2      //回来
#define COMMAND_THREE 	    			0xF3      //跳舞
#define COMMAND_FOUR        			0xF4      //纪录


#define k_2        		                2
#define k_1        		                1             //数据0位为最新e(k),e(k-1),e(k-2)->e(0),e(1),e(2)
#define k        		                0
#define KP								165
#define KI             					550
#define KD                				120


#define move_data_number                25
#define back_circle_record_define       45 
#define turn_circle_define              45
#define goback_circle_define            45

//**************************系统数据************************************//
volatile unsigned char STATUS_TEMP=0;
volatile unsigned char PCLATH_TEMP=0;
volatile long int RTC=0;
unsigned int data=0;


//***********************电机pwm数据**********************************//
 volatile unsigned int PWMontimeHelm=38;                //alltime  54  

 volatile  int  helmcount=0;


//****************************速度控制数据***********************//
  volatile unsigned long int  wheelcircle=0; 
  volatile unsigned long int  wheelcircle_for_math=0;
 bank1 volatile char speed=0;
 bank1 volatile char wheelcircleadd=0;
 bank1 volatile char speedtest;
 bank1 volatile int e[3]=0;

 bank1 volatile int u[2]=0;
 bank1 volatile int du=0;

//*******************************88bsr****************************

volatile  unsigned  int bsr_time_between=0;
volatile  char  bsr_sound_excitated=0;

//*******************红外线接受数据*********************************//
bank1  union REDLIGHT
 {
  long int DataIn;
  char redlight[4];
 } RedLightData;
       volatile unsigned char DataOut=0X00;
bank1  volatile unsigned long int Temp_L=0;
bank1  volatile unsigned char Count=0;
bank1  volatile unsigned char LastFlag=0;
bank1  volatile unsigned char PreFlag=0;
bank1  volatile unsigned long int  SaveTime=0;
bank1  volatile unsigned long int  NowTime=0;
bank1  volatile unsigned long int  AllTime=0;
bank1  volatile unsigned long int  Temp_H=0;



//********************红外线探测数据********************//
bank1 volatile char leftredlight=0;
bank1 volatile char rightredlight=0;
bank1 volatile char redlightdata=0;   

//*************************AD转换*******************************//
bank1 volatile int AD_RESULT;
bank1 volatile int AD_RESULT_DES;
bank1 volatile unsigned  char s[4];

                                   
//*********************系统EEPROM/或数组纪录用数据*********************//  
//bank1 volatile int last_goorback=gohead; 
bank1 volatile int now_goorback=0; 
//bank1 volatile int last_rightorleft=middle; 
bank1 volatile int now_rightorleft=middle; 
//bank1 volatile int last_circle=0; 
bank1 volatile int now_circle=0;  
//bank2 volatile unsigned char record_line=0;
 
bank2 char move_data_circle[move_data_number]=0;
bank2 char move_data_leftorright[move_data_number]=0;
bank2 int  move_data_pointer=move_data_number-1;

bank2 char move_data_status=0;
bank2 char move_data_record_en=0;
bank2 char move_data_record_rightorleft=0;
bank2 int  back_circle_record=back_circle_record_define;
bank2 char move_pump=0;

//******************遥控器同一键多次处理数据******************************************************************//
bank1 volatile unsigned char power_on_off_key=0;              //用于按键次数判断
bank1 volatile unsigned char auto_manualcount_key=0; 
bank1 volatile unsigned char sound_on_off_key=0; 
bank1 volatile unsigned char sys_init_on_off_key=0; 
bank1 volatile unsigned int  sys_init_on_off_timer_key=0; 
bank1 volatile unsigned char key_switch_flag=0;


//****************************卡住数据*******************************************************************//
 bank1  volatile char ka_count=0; 
 bank1  volatile unsigned int ka_time_record=0;


  
//***************************各模式选择标志******************************************************************// 
//bank1 volatile unsigned char auto_go_status=0;            //驱动函数deal_lightmessage();deal_stop();  deal_collision(); 
                                                      // 内部数据系统决定        	     	  
bank1  volatile int auto_go_back=0;                        //状态判断在自动模式下判断 是自动前进后退还是停止 "0"前进 外部数据用户决定

bank1  volatile int manual_auto_flag=0;                    //判断 自动模式还是遥控模式 "0" 遥控模式  "1" 自动  "3" 停  外部数据用户决定

bank1  volatile char go_back_end=0; 

//****************************液晶数据*****************************//
bank2 volatile char	startline=0;
bank2 volatile char	*ARRAY;
bank2 volatile char	ppp[34];
bank2 volatile int	i;

const char shu[160]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,		//"0"
					 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,		//"1"
					 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,		//"2"
					 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,		//"3"
					 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,		//"4"
					 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,		//"5"
					 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,		//"6"
					 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,		//"7"
					 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,		//"8"
					 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,		//"9"
					};	

const char d[16]={	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
					0x30,0x30,0x00,0x00,0x00,0x00,0x00,
					}	;												//小数点
                                                                                                                                
const char mao[16]={0x00,0x00,0x00,0xc0,0xc0,0x00,0x00,0x00,
					0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,
					};													//"冒号"

const char dian[32]={0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,
					0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00,
					 0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,
						0x44,0x44,0x44,0x4F,0x40,0x70,0x00,
						};												//"电"

const char ya[32]={0x00,0x00,0xFE,0x02,0x42,0x42,0x42,0x42,0xFA,    	//"压"
					0x42,0x42,0x42,0x62,0x42,0x02,0x00,
				   0x20,0x18,0x27,0x20,0x20,0x20,0x20,0x20,0x3F,
                   0x20,0x21,0x2E,0x24,0x20,0x20,0x00,
					};	
const char hit[712]={
0x00,0x0C,0xE0,0x80,0x00,0x12,0xC0,0xC0,0xC0,0x00,0x0E,0x38,0xF8,0xFC,0x00,0x01,
0x80,0x00,0x19,0xF0,0xF0,0xE0,0x00,0x02,0xC0,0xE0,0x00,0x0C,0x20,0xF0,0xE0,0x00,
0x0F,0xF8,0xE0,0x00,0x03,0x80,0x78,0x3E,0x9F,0xE0,0xF0,0xE0,0x00,0x06,0xC0,0x80,
0x00,0x03,0xFF,0x02,0x1F,0x00,0x0C,0x80,0xC0,0xF0,0xBC,0x8C,0x87,0x8F,0x03,0x03,
0x00,0x07,0xE0,0xE0,0xC0,0x00,0x01,0x80,0xC0,0xC0,0xE0,0x30,0x0C,0x33,0x1F,0x1F,
0x00,0x0B,0x80,0x80,0x00,0x09,0x80,0x80,0xF9,0xFF,0x01,0x30,0xCC,0xF3,0x8F,0x8F,
0xF0,0xF0,0x78,0x00,0x0A,0xFF,0x02,0x00,0x0E,0xF0,0x00,0x01,0xFF,0x01,0x60,0x27,
0x3C,0xFF,0x01,0x0C,0x07,0xE3,0x7F,0x0F,0x01,0x3C,0xFC,0xE4,0x04,0x1E,0xFF,0x02,
0x3F,0x00,0x01,0xE0,0xFF,0x01,0x3F,0xF9,0xC0,0x00,0x07,0x30,0xF8,0xF8,0x3E,0xFE,
0xCF,0xFF,0x01,0xFE,0x01,0x0F,0xC7,0xFF,0x01,0xE7,0x00,0x08,0x01,0x3F,0x0F,0xF8,
0xFF,0x01,0x39,0x39,0xF9,0x0E,0xE0,0xEC,0x4C,0x00,0x06,0xF0,0xF0,0xF0,0xF8,0x3C,
0xBC,0xFF,0x02,0x0F,0x07,0x00,0x07,0x1F,0xC1,0xE7,0x19,0xCE,0xF7,0xF1,0x71,0x39,
0x38,0x1C,0x0E,0x0C,0x00,0x08,0xE0,0xFF,0x01,0x0F,0x00,0x01,0xC0,0xF8,0xF8,0x70,
0x20,0x00,0x07,0x78,0xFF,0x01,0x3E,0x03,0x06,0x06,0x07,0xC6,0xEF,0xFE,0x61,0xFC,
0xFC,0xF8,0xFE,0xFF,0x02,0x38,0x3F,0x1F,0x1F,0xE0,0xFE,0xFF,0x01,0xE7,0xF0,0x21,
0xFF,0x02,0xFC,0xF8,0x30,0x00,0x03,0x60,0x71,0x79,0x3C,0x87,0xC3,0xFF,0x02,0x8E,
0xFF,0x01,0x01,0xFF,0x02,0x00,0x08,0xFC,0x70,0x00,0x02,0x0E,0xE3,0x70,0x7F,0x33,
0xFC,0xF0,0x00,0x08,0x03,0xC1,0xF2,0xBF,0x9F,0xE1,0xE0,0xE0,0xE0,0x00,0x03,0xF8,
0xF8,0xFC,0x3E,0x07,0x03,0xCF,0xF3,0xFC,0x39,0x84,0xC0,0x00,0x08,0x80,0x80,0xC0,
0xF0,0x78,0xFD,0xFF,0x01,0x0E,0x07,0x03,0x01,0x00,0x07,0xC0,0xC0,0xF0,0x30,0x10,
0x00,0x01,0x04,0x0F,0x0F,0xC7,0xF1,0xFB,0x0C,0x07,0x03,0x01,0x01,0x01,0x03,0x03,
0x80,0xC0,0xFC,0x7E,0xFF,0x01,0x83,0xE0,0xE1,0xF8,0xFC,0xF8,0x01,0x01,0x00,0x07,
0x06,0xE7,0xF7,0xFF,0x03,0xE7,0xE7,0x06,0xFF,0x02,0x00,0x08,0xFF,0x01,0xF0,0x7C,
0x3C,0x0E,0xFB,0x08,0xFC,0x00,0x01,0xFF,0x01,0x03,0x00,0x04,0xF0,0xF0,0xF0,0xF8,
0xFC,0x3F,0x0F,0x07,0x03,0x01,0x01,0x00,0x06,0x01,0x00,0x03,0x18,0xD9,0xEF,0xFF,
0x01,0x31,0xC1,0xC1,0xC0,0x00,0x06,0x1E,0x3F,0x0F,0x07,0xC0,0xE0,0xFF,0x01,0x07,
0x01,0x3E,0xE0,0xC0,0x80,0x80,0xC0,0x80,0x00,0x03,0x0F,0x0F,0x03,0x00,0x03,0x80,
0x80,0x80,0xF8,0xFF,0x01,0x63,0x78,0x7C,0x3C,0x1C,0x0C,0x38,0x3E,0x3F,0x1F,0x0F,
0x00,0x02,0xFF,0x02,0x08,0xF8,0x3F,0x3F,0x18,0x00,0x09,0xFE,0xFF,0x01,0x30,0x0F,
0xFF,0x02,0x3B,0x73,0xF2,0xFF,0x02,0x00,0x07,0x3E,0xFF,0x01,0xC3,0x00,0x03,0xCF,
0xE0,0x3F,0x1C,0x73,0xF0,0xE0,0x80,0x00,0x02,0x03,0x03,0x0F,0x0F,0x01,0x00,0x0E,
0xC0,0xE0,0xF8,0x0F,0xC1,0xFF,0x01,0xFA,0x01,0x7F,0x7F,0x0E,0x00,0x06,0x78,0x7C,
0x7C,0x0F,0x07,0x01,0x00,0x03,0x07,0x3F,0x3F,0x0F,0x03,0x01,0x00,0x06,0x0E,0x0F,
0x0F,0x0F,0x07,0x03,0x1F,0xFF,0x01,0xF0,0x00,0x0D,0x01,0x00,0x0F,0x01,0x00,0x02,
0x01,0x00,0x03,0x07,0x1F,0x0F,0x00,0x08,0x03,0x01,0x00,0x03,0x01,0x03,0x00,0x03,
0x07,0x07,0x03,0x00,0x15,0x07,0x0F,0x00,0x02,0x01,0x07,0x00,0x24,0x02,0x06,0x1F,
0x3F,0x03,0x00,0x05,0x7F,0x08,0x08,0x7F,0x60,0x1C,0x13,0x1C,0x60,0x7F,0x09,0x09,
0x39,0x46,0x7F,0x49,0x49,0x49,0x36,0x7F,0x00,0x01,0x7F,0x0E,0x30,0x7F,0x00,0x03,
0x7F,0x00,0x01,0x7F,0x0E,0x30,0x7F,0x26,0x49,0x49,0x49,0x32,0x01,0x01,0x7F,0x01,
0x01,0x00,0x01,0x7F,0x00,0x01,0x01,0x01,0x7F,0x01,0x01,0x3F,0x40,0x40,0x3F,0x01,
0x01,0x7F,0x01,0x01,0x7F,0x49,0x49,0x49,0x00,0x02,0x3E,0x41,0x41,0x41,0x3E,0x7F,
0x09,0x09,0x09,0x01,0x00,0x03,0x01,0x01,0x7F,0x01,0x01,0x7F,0x49,0x49,0x49,0x3E,
0x41,0x41,0x41,0x36,0x7F,0x08,0x08,0x7F,0x00,0x01,0x7F,0x0E,0x30,0x7F,0x00,0x01,
0x3E,0x41,0x41,0x41,0x3E,0x7F,0x40,0x40,0x40,0x3E,0x41,0x41,0x41,0x3E,0x3E,0x41,
0x41,0x49,0x7A,0x01,0x06,0x78,0x06,0x01,
};



//********************************端口定义************************************************************************//
static volatile bit WHEEL@(unsigned)&PORTB*8+5;

static volatile bit DI@(unsigned)&PORTE*8+0;                   
static volatile bit RW@(unsigned)&PORTE*8+1;
static volatile bit EN@(unsigned)&PORTE*8+2;

static volatile bit RES@(unsigned)&PORTC*8+3;
static volatile bit CSA@(unsigned)&PORTC*8+4;
static volatile bit CSB@(unsigned)&PORTC*8+5;

static volatile bit LightL@(unsigned)&PORTA*8+4;											
static volatile bit LightR@(unsigned)&PORTA*8+5;    

static volatile bit LEDL@(unsigned)&PORTA*8+2;											
static volatile bit LEDR@(unsigned)&PORTA*8+3;   

                                     
static volatile bit PWM_HELM@(unsigned)&PORTB*8+2;     //舵机控制输出                                            
static volatile bit PWM_MOTOR2@(unsigned)&PORTB*8+1;   //电动机控制输出




static volatile bit EEPROM_WREN@(unsigned)&EECON1*8+2;
static volatile bit EEPROM_WR@(unsigned)&EECON1*8+1;
static volatile bit EEPROM_RD@(unsigned)&EECON1*8+0;

static volatile bit AD_GO@(unsigned)&ADCON0*8+2;
static volatile bit AD_ADON@(unsigned)&ADCON0*8+0;


void pwmhelm		(void);
void status			(int statusdata);   
void remotecontrol	(void); 
void setrctx		(void);
void redlight		(void) ;
void auto_go		(void); 
void auto_go		(void);
void auto_back		(void);
void deal_lightmessage(void);
void deal_collision	(void);
void deal_stop		(void);
void deal_block		(void);
void delay			(unsigned int number);
void LCD_initial	(void);	
void LCDSTA_BUSY	(int E);
void TRANS1			(int TRANS,int E);
void WRITE1			(char WRITE,int CLMADD,int E);
void CLEAR			(int E);
void DISP_ON		(int E);
void DISP_OFF		(int E);
void START_LINE		(int LINE,int E);
void DISPLAY_CHINESE(int E,int PAGADD,int CLMADD);
void DISPLAY_NUMBER	(int E,int PAGADD,int CLMADD);
void LCD_INIT		(int E);
void show_tu		(const char *p);
char eeprom_read	(char ADR);
void eeprom_write	(char ADR,char eeprom_data);
int AD				(void);
void sys_initial    (void);
void push           (void);
void pop            (void);
void turn_right     (void);
void turn_left      (void);
void move_data_clear(void);
void move_deal		(void);
void move_reset     (void);
void ultrared_deal  (void);
void bsr_sound      (void);
  
void sys_initial(void)
{
    TMR0=100;
    OPTION=0b00010001;
    TRISB=0B11100001;
    PORTB=0;
    TRISD=0x03;
    PORTD=0;
    ADCON1=0X07;  
    TRISA=0;

    TRISA0=1;
	TRISA1=1;
    TRISA4=1;
	TRISA5=1;

    INTCON=0B10101100;
    INTE=1;
    RBIE=1;

    TMR2=0;
    CCPR1L=0;
    CCP1CON=0B00001111;
    PR2=200;    
    T2CON=0X04;
    TRISC=0x03;

    TRISB1=0;	
    LEDR=1; 
   	LEDL=0;
}




void setrctx(void)
  {
  TRISC=0B11000000;
  RCIE=1; 
  TXIE=1;
  SPEN=1;        //串行 
  SPBRG=0X19;    //波特率设置 9600hz
  TX9=0;
  SYNC=0;
  BRGH=1;  
  CREN=1;     //使能
  TXEN=1;     //使能
  }


void LCD_initial(void)
{	
	TRISE=TRISE&0X00;		//	 设置RE0-DI,RE1-RW,RE2-EN为输出 
	TRISD=TRISD&0X00;		//	 设置RD0数据端输出DB0-DB7   			                
    TRISC3=0;				//   RC3-RES 
    TRISC4=0;				//   RC4-CSA
    TRISC5=0;				// 	 RC5-CSB
    RES=1;   				//   正常状态     
}





void	LCDSTA_BUSY(int	E)
{
	int	E1FLAG;
	TRISD=0XFF;					
	while(1)
	{
		if(E==1)
		{
			CSA=1;		 			// 设置CSA=1,CSB=0,即片选1。
			CSB=0;                       
		}
		else	
		{
			CSA=0;		 			// 设置CSA=0,CSB=1,即片选2。
			CSB=1;	
		}
        RW=1;           			//  RW=1,DI=0,设置为读状态 
  		DI=0;
		EN=1;		    			//E=1 
		E1FLAG=PORTD&0X80;			// 取DB7的值 
		EN=0;		      			// RE2-EN=0,先将E设置为1,让数据被读出,该指令用来查询液晶显示模块内部控制器的状态;								    //	之后又将E设置为0,数据被锁存(写)入KS0108B及其兼容控制驱动器 */

      if(E1FLAG==0X0000) break;		// 如果RD7=0,则处于正常工作状态,退出循环 
	}
   	
}



void TRANS1(int	TRANS,int E)
{
	    TRISD=0X00;
		if(E==1)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -