智能车源程序.docx
《智能车源程序.docx》由会员分享,可在线阅读,更多相关《智能车源程序.docx(47页珍藏版)》请在冰豆网上搜索。
![智能车源程序.docx](https://file1.bdocx.com/fileroot1/2022-11/24/2b47fb77-86ee-4cb1-a263-e0266c779477/2b47fb77-86ee-4cb1-a263-e0266c7794771.gif)
智能车源程序
#include/*commondefinesandmacros*/
#include/*derivativeinformation*/
#include"math.h"
#pragmaLINK_INFODERIVATIVE"mc9s12xs128"
/*********************DEFINE************************/
#defineWHITE50
#defineBLACK40
#defineKD0
#defineEnableSCIReIntSCI0CR2|=0x20
#defineDisableSCIReIntSCI0CR2&=0xDF
#defineRTI_SWITCH_ONCRGINT_RTIE=1
#defineRTI_SWITCH_OFFCRGINT_RTIE=0
#defineIC_SWITCH_ONTSCR1_TEN=1
#defineIC_SWITCH_OFFTSCR1_TEN=0
//-----------------definekey---------------------//
#defineKEY_RUN_OR_LCDPORTK_PK0
#defineKEY_START_RUNPORTA_PA1
#defineKEY_UPPORTA_PA2
#defineKEY_DOWNPORTA_PA3
#defineKEY_ENTERPORTA_PA4
//-----------------partoflcd---------------------//
#defineLINE10
#defineLINE21
#defineLINE1_HEAD0x80
#defineLINE2_HEAD0xC0
#defineDATA_MODE0x38//8bitdatatransmissionmode,doubleline
#defineCLR0x01
#defineBUSY0x80//LCDBusyTag
#defineCURSOR_RESET0x02
#defineINPUTMODE_CUR_R0x06
#defineINPUTMODE_CUR_L0x04
#defineINPUTMODE_ALL_E0x05
#defineINPUTMODE_ALL_D0x04
#defineSCREEN_OPEN0x0C
#defineSCREEN_OPEN_CUR0x02
#defineSCREEN_OPEN_FLASH0x01
#defineSCSHIFT_CUR_L0x10//ScreenorCursorshift
#defineSCSHIFT_CUR_R0x14
#defineSCSHIFT_SCR_L0x18
#defineSCSHIFT_SCR_R0x1C
//-----------------definelcdpins--------------------//
#defineRSPORTA_PA5//DataCommandPin1data0command
#defineRWPORTA_PA6//ReadWritePin1read0write
#defineENPORTA_PA7//LCDEnableSignal
#defineLCD_DATAPTH
#defineLCD_DATA_DIRDDRH
#defineLCD_DIR_IN0x00
#defineLCD_DIR_OUT0xff
/*********************END************************/
/***************HARDWAREINITFUNDECLARE******************/
voiduart_init(void);
externvoiduart_PutChar(unsignedchar);
unsignedcharTERMIO_GetChar(void);
voidprintp(char*,...);
voidCPU_Init(void);
voidIO_Init(void);
voidSciTx(unsignedchartext);
charSciRx(void);
voidRTI_Init(void);
voidIC_Init(void);
voidOC7_Init(void);
voidPTI0_Init(void);
voidPWM_Init(void);
voidAD_Init(void);
//-----------------partoflcd---------------------//
voidLcdCommand(unsignedcharcommand,unsignedcharBusyC);
voidLcdData(unsignedchartemp,unsignedcharBusyC);
voidLcdInit(void);
unsignedcharReadStatus(void);
voidGotoXY(unsignedcharx,unsignedchary);
voidPrint(unsignedchar*str);
voidLcd_Print_Str(unsignedcharx,unsignedchary,char*s);
voidLcd_Print_Int(unsignedcharx,unsignedchary,unsignedintdata);
voidLcd_Print_Char(unsignedcharx,unsignedchary,unsignedchardata);
voidLcd_Print_uChar(unsignedcharx,unsignedchary,chardata);
/*********************END************************/
/***************SOFTWAREFUNDECLARE******************/
voidlight_flip(void);
voidAD_DATA_HIGHT(void);
voidAD_DATA_LOW(void);
voidVOL_Normaliz(void);
voiderr_calculate_hight(void);
voiderr_calculate_low(void);
signedintPID(void);
voidkey_scan_deal(void);
voidLCD_DISPLAY(void);
uinterr_Std(void);
voidcheck_line(void);
voidLcdDelay(bytek);
voidDly_ms(intms);
voiddelay(unsignedintref);
/*********************END************************/
/*********************DEFINEVAR************************/
//---------------sensordatavar-----------------//
ucharTHRESHOLD_black=40;
ucharmax_vol[9],min_vol[9]={255,255,255,255,255,255,255,255,255};
ucharWHITE_MIN=240,WHITE_MAX=250;
ucharpercent[9],data[9],det_vol[9],flip_data[9];
scharerr[100],err_e[3];
ucharL_times=130;
byteflip=0,max_num_p=0;
//---------------sensor_2datavar-----------------//
uchardata_2[5],THRESHOLD_2=200,flip_data_2[5],err_e2[3];
//-----------------speedvar---------------------//
byteload_bit=0;
ucharpluse_1=0,pluse_2=0,get_speed=0,set_speed=30,now_speed=0;
ucharMAX_SPEED=30;
//-----------------checkvar--------------------//
uintcheck_pluse=0;
ucharstart_line=0,stop=0,stop_delay=0,slope_time=0,slope_timing=0;
bytecheck=0,check_bit=0,line_num=0,triangle_status=0,slope_bit=0,black_bit=0;
//------------------key&lcdvar----------------------//
bytekey_r_o_l=0,lcd_print=1;
ucharmenu=1,menu_option=1,bits=0;
//-----------------calcvar---------------------//
ucharKP=8,period_1=0,period_2=0;
charstd_err[10];
inttemp_std;
/*********************END************************/
voidmain()
{
DisableInterrupts;
CPU_Init();
IO_Init();
uart_init();
//EnableSCIReInt;
LcdInit();
PWM_Init();
AD_Init();
VOL_Normaliz();
Dly_ms(3000);
Dly_ms(2000);
RTI_Init();
IC_Init();
for(;;)
{
EnableInterrupts;
//err_calculate_hight();
key_scan_deal();
}
}
//--------------------------------------------------------------
//HARDWAREFUNSTART
//--------------------------------------------------------------
voidCPU_Init()
{
CLKSEL=0X00;
PLLCTL_PLLON=1;
REFDV=0x01;//BUS_CLOCK=40M
SYNR=0x04;
_asm(nop);
_asm(nop);
while(!
(CRGFLG_LOCK==1));
CLKSEL_PLLSEL=0x01;
FCLKDIV=0x0F;//FlashClockDivideFactor40M/16=?
M
}
voidSciTx(unsignedchartext)
{
unsignedchartemp;
temp=SCI0SR1;/*clearflag*/
while(!
(SCI0SR1&0x80));/*waitforoutputbufferempty*/
SCI0DRH=0;
SCI0DRL=text;
}
charSciRx(void)
{
unsignedcharresult,temp;
temp=SCI0SR1;/*clearflag*/
while(!
(SCI0SR1&0x20));
result=SCI0DRL;
returnresult;
}
voidRTI_Init()
{
RTICTL=0b10010011;//0010000=2*10^3,10010011=8*10^3=0.5ms,10001111=16*10^3=1ms,11000111=160x10^3=10ms,11101111=1.6*10^6=100ms
//CRGINT_RTIE=1;
}
voidIC_Init(){
DisableInterrupts;
TIOS_IOS0=0;//channel0inputcapture
TCTL4_EDG0B=1;
TCTL4_EDG0A=1;
TIE_C0I=1;//channel0interruptenable
TSCR2=0x03;//TIMEclock=40M/8=0.2us
TFLG1=0xFF;
TFLG2=0x80;
//TSCR1_TEN=1;//Timerenable
EnableInterrupts;
}
voidOC7_Init()
{
TSCR2_TCRE=1;
TSCR2_PR=0;
TIOS_IOS7=1;
TC7=0x5dc0;//24000,1ms
TCTL1=0x00;
TIE_C7I=1;
TSCR1_TEN=1;
}
/*
voidPTI0_Init()
{
PITCFLMT=0x00;
PITCE_PCE0=1;
PITMUX_PMUX0=0;
PITMTLD0=0x01;
PITLD0=0x0001;//2x2x25ns=1us;
PITINTE_PINTE0=1;
PITCFLMT_PITE=1;
}
*/
voidPWM_Init()
{
PWME=0xaa;//enablec_1,c_3,c_5,c_7
PWMPOL=0xaa;
PWMCAE=0X00;
PWMCTL=0xf0;//com0&12&34&5
PWMPRCLK=0x00;
PWMCLK_PCLK1=1;//0&1---SA
PWMSCLA=0x04;//SA=5M
PWMPER01=50000;//舵机:
5000000/50000=100Hz;
PWMDTY01=7100;
PWMPER23=5000;//电机:
24000000/12000=2000Hz;24000000/2400=10000Hz;40000000/5000=8000Hz
PWMDTY23=2500;
PWMPER45=5000;
PWMDTY45=2500;
}
voidAD_Init()
{
//[3:
0]---WRAP
//ATD0CTL0=0x00;
//7---ETRIGSEL,[6:
5]---ResolutionSelect,4---Discharge,[3:
0]---ExternalTriggerChannelSelect
ATD0CTL1=0x00;
//6---AFFC;5---ICLKSTP;[4:
3]---ExternalTriggerEdge/Polarity;2---ETRIGE;
//1---ASCIE,SequenceCompleteInterruptEnable;0---ACMPIE,CompareInterruptEnable
ATD0CTL2=0x40;
//7---DJM,DataJustification;[6:
3]---S8C,S4C,S2C,S1C,SequenceLength;2---FIFO;
//[1:
0]---BackgroundDebugFreezeEnable;
ATD0CTL3=0x98;
//[7:
5]---SMP,SampleTimeSelect;[4:
0]---PRS,fATDCLK=fBUS/2/(PRS+1)
ATD0CTL4=0x01;
//6---SC5,SpecialChannelConversion;5---SCAN,ContinuousConversionSequenceMode
//4---MULT,Multi-ChannelSampleMode;[3:
0]---AnalogInputChannelSelectCodeCD,CC,CB,CA
//ATD0CTL5=0x01;
//ATD0CMPE_CMPE0=1;
//ATD0CMPHT_CMPHT0=0;//>AD0
//ATD0DR0L=0x000f;
ATD0DIEN=0x00;
}
voidIO_Init(){
//SENSOR
DDRB=0xff;
PORTB=0x00;
DDRA=0x01;
PORTA_PA0=0;
//KEYDEFINE
DDRK_DDRK0=0;
DDRA_DDRA1=0;
DDRA_DDRA2=0;
DDRA_DDRA3=0;
DDRA_DDRA4=0;
DDRK_DDRK1=0;
DDRK_DDRK2=0;
DDRK_DDRK3=0;
//LCDCONTORL
DDRA_DDRA5=1;
DDRA_DDRA6=1;
DDRA_DDRA7=1;
//LED
DDRK_DDRK4=1;
DDRK_DDRK5=1;
PORTK_PK4=0;
PORTK_PK5=0;
//sensor_2
DDRK_DDRK7=1;
PORTK_PK7=0;
}
voidDly_ms(intms)
{
intii,jj;
if(ms<1)ms=1;
for(ii=0;iifor(jj=0;jj<2670;jj++);//busclk:
16MHz--1ms
}
voiddelay(unsignedintref){
uintkk;
for(kk=0;kkasmnop;
}
}
/************************LCDdrivestart*************************/
voidLcdInit(){
LCD_DATA_DIR=LCD_DIR_OUT;
LcdDelay(21);
LcdCommand(DATA_MODE,1);//set8bitdatatransmissionmode
LcdDelay(7);
LcdCommand(DATA_MODE,1);//set8bitdatatransmissionmode
LcdDelay(7);
LcdCommand(DATA_MODE,1);//set8bitdatatransmissionmode
LcdCommand(CLR,0);//clearscreen
LcdCommand(DATA_MODE,1);//set8bitdatatransmissionmode
LcdCommand(INPUTMODE_CUR_R|INPUTMODE_ALL_D,1);//cursorright,disablemoving
LcdCommand(SCREEN_OPEN,1);//opendisplay(enablelcddisplay)
LcdCommand(LINE1_HEAD,1);//setlcdfirstdisplayaddress
LcdCommand(CLR,1);//clearscreen
}
unsignedcharReadStatus(void)
{
unsignedcharcRtn;
LCD_DATA_DIR=LCD_DIR_IN;
RS=0;
RW=1;
EN=0;
delay(500);
EN=1;
while(LCD_DATA&BUSY);//TestBusyState
cRtn=LCD_DATA_DIR;//ifNotsavetheportvalue,itshouldbechange
LCD_DATA_DIR=LCD_DIR_OUT;
return(cRtn);
}
voidLcdCommand(unsignedcharcommand,unsignedcharBusyC){
if(BusyC)
ReadStatus();//Testitbusyornot
LCD_DATA=command;
RS=0;
RW=0;
EN=0;
delay(500);
EN=1;
}
voidLcdData(unsignedchardat,unsignedcharBusyC)
{
if(BusyC)
ReadStatus();//Testitbusyornot
LCD_DATA=dat;
RS=1;
RW=0;
EN=0;
delay(500);
EN=1;
}
voidLcdDelay(bytek){//k=7=5ms
uinti,j;
for(i=0;ifor(j=0;j<4780;j++);
}
voidGotoXY(unsignedcharx,unsignedchary){
unsignedcharaddress;
if(y==LINE1)
address=LINE1_HEAD+x;
else
address=LINE2_HEAD+x;
LcdCommand(addres