logo资料库

飞思卡尔比赛代码.docx

第1页 / 共47页
第2页 / 共47页
第3页 / 共47页
第4页 / 共47页
第5页 / 共47页
第6页 / 共47页
第7页 / 共47页
第8页 / 共47页
资料共47页,剩余部分请下载后查看
主程序 /*******************************************************************/ /* /* 飞思卡尔智能小车主函数 /* 硬件平台: MC9S12XS128 晶振:12MHZ /* 软件平台: CodeWarriorIDE /* 描述:包括各个功能模块的调用 /* 公司: 九江学院 /* 作者 日期 注释 */ /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* 耕耘者 2012-10-16 /*******************************************************************/ #include #include #include "derivative.h" #include"pwm.h" #include"image.h" #include"sci.h" #include"KeyScan.h" #include"nokia5110.h" #include"picture.h" #include"pid.h" unsigned char StartDelay = 0; unsigned char DelayEn = 0; unsigned int Time2s = 0; unsigned int CarTime = 0; unsigned int CarTimeTemp = 0; unsigned int CarPulse = 0; unsigned int Speed; unsigned char IsCountSpeed = 0;
unsigned char IsDisplayOn = 0; unsigned char THRESHOLD = 0X7D; unsigned int PIDFlag = 0; unsigned char PIDOn = 0; unsigned char keyflag = 1; unsigned char StartLineFlag = 0; /****************************************************************************** ** 函数名称: void PWMDuo_Duty(int duo_duty) ** 功能描述: 舵机控制子函数 ******************************************************************************/ void PWMDuo_Duty(int duo_duty) { } PWMDTY01 = duo_duty; PWME_PWME1 = 1; // 使能 PWM3 /***************************************************************************** ** 函数名称: void PWMdian_Duty(unsigned char motorValue) ** 功能描述: 控制 PWMDTY23 的值从而控制输出的占空比使得电机获得不同的速度正转 ******************************************************************************/ void PWMdian_Duty(unsigned char motorValue) { } PWMDTY23 = motorValue; /****************************************************************************** ** 函数名称: void PWMdian_DutyStop(unsigned char motorValue) ** 功能描述: 控制 PWMDTY45 的值从而控制输出的占空比使得电机获得不同的速度反转 ******************************************************************************/ void PWMdian_DutyStop(unsigned char motorValue) {
PWMDTY45 = motorValue; } /****************************************************************************** ** 函数名称: unsigned char GetSpeed(unsigned int CurSpeed) ** 功能描述: 获得小车行驶时的速度大小从而反馈给 PID 实现 PID 控制 ******************************************************************************/ unsigned char GetSpeed(unsigned int CurSpeed) { CurSpeed = CurSpeed/10; if(CurSpeed>60&&CurSpeed<80) { } Dianji_data = 45; if(CurSpeed>=80&&CurSpeed<130) { } Dianji_data = 50; if(CurSpeed>=130&&CurSpeed<180) { } Dianji_data = 55; if(CurSpeed>=180&&CurSpeed<220) { } Dianji_data = 60; if(CurSpeed>=220&&CurSpeed<235) { } Dianji_data = 65; if(CurSpeed>=235&&CurSpeed<270) { } Dianji_data = 70;
if(CurSpeed>=270&&CurSpeed<380) { } Dianji_data = 40; return Dianji_data; } /***************************************************************************** ** 函数名称: void main(void) ** 功能描述: 调用功能函数 ******************************************************************************/ void main(void) { unsigned char clearFlag = 1; unsigned int PWM_Value; PLL_Init(); // 时钟初始化锁相环 TIM_Init(); //定时器初始化 IO_Init(); //IO 端口初始化 SCI_Init(); //串口初始化 Init_pwm(); //pwm 初始化 PIT_Init(); LCD_Init(); //nokia5110 初始化 LCD_clear(); //nokia5110 清屏 EnableInterrupts; //中断使能 LCD_draw_bmp_pixel(0,0,picture,84,48); for(;;) { if(IsScanKeyTime == 1) { IsScanKeyTime = 0; KeyPro(); KeyFunction();
} if(PWMFlag!=0) { DelayEn = 1; if(StartDelay == 1) { } StartDelay = 0; PWME_PWME3 = 1; else } { } PWME_PWME3 = 0; Time2s = 0; //保证在按按键之前 time2s 的值一直为 0 if(IsCountSpeed == 1) { } IsCountSpeed = 0; CarPulse = PulseNum; Speed = CarPulse*157/10; //每圈 100 个脉冲转轮周长 157cm PulseNum = 0; if(IsSetMode == 0) { } IsSetMode = 1; LCD_clear_half(); Display_Gray(36,3,3); Display_GUI(0,4,14); Display_Speed(36,5,4); //窜口发送(注意开了窜口发送会很占用系统资源) Traver_UartValue(); PWM_Value = IncPIDCalc(GetSpeed(Speed)); //pid 调节语句 Dianji_data += PWM_Value;
Get_SideLine(); Car_Cotrol(); PWMDuo_Duty(Duoji_data); PWMdian_Duty(Dianji_data); } } /***************************************************************************** ** 函数名称: void interrupt 66 PIT0(void) ** 功能描述: 中断服务函数产出时间片 ******************************************************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 66 PIT0(void) { static unsigned char PIDData = 0; PITTF_PTF0=1; ++CarTimeTemp; ++PIDFlag; if(flag%10 == 0) { } IsScanKeyTime = 1; if(CarTimeTemp == 20) //100ms 进行一次速度计算并清除计数值 { } IsCountSpeed = 1; CarTimeTemp = 0; if(flag%30 == 0) IsDisplayOn = 1; { }
if(++flag == 6500) { flag = 0; StartLineFlag = 1; } if(PIDFlag == 2000) { } PIDFlag = 0; PIDOn = 1; if(DelayEn==1) { Time2s++; if(Time2s==800) //5s 定时 { } Time2s = 0; DelayEn=0; StartDelay = 1; } } #include "image.h" #include #include "sci.h" #include "pid.h" #include "KeyScan.h" #define ROW #define COLUMN #define ROW_START #define ROW_MAX 40 120 10 200 //#define THRESHOLD 0x7D 图像处理
extern unsigned char THRESHOLD; unsigned char SampleFlag=0; //奇偶场标记 unsigned int m=0; unsigned int Line; unsigned int hang; unsigned char a_Temp=0,b_Temp=0; unsigned char Dianji_data = 50; unsigned int Duoji_data; unsigned char Buffer[ROW][COLUMN]={0}; unsigned char image_center[40]={0}; unsigned int zuo_danxian=1,you_danxian=1; unsigned long WholeRoad = 0; unsigned long Road = 0; unsigned char smallSFlage = 0; unsigned int effectLine = 0; unsigned char flagg; //定每场采哪几行。根据像素决定。上面下面采到 0 了说明超出像素了 unsigned int get_n[]= { }; 17,19,21,23,25,28,31,34,37,40,43,46,49,53,57, 61, 65,69,73,77,81,85,89,94,99,105,111,117,123,129, 135,141,147,153,159,166,173,180,187,194,201,208, 215,222,229,236 unsigned char SumSave = 0; unsigned char IsCarStright = 1; unsigned int PulseNum = 0; unsigned char JumpDot = 0; unsigned char IsStartLine = 0; /****************************************************************************
分享到:
收藏