📄 pic_car.c
字号:
//一圈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 + -