版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主程序///^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js//*飞思卡尔智能小车主函数/*/*硬件平台:MC9S12XS128晶振:12MHZ/*软件平台:CodeWarriorlDE/*描述:包括各个功能模块的调用/*公司:九江学院/*作者日期注释*/,<\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\>/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/*耕耘者2012-10-16/ // /#include<mc9s12xs128.h>#include<hidef.h>#include"derivative.h"#include"pwm.h"#include"image.h"#include"sci.h"#include"KeyScan.h"#include"nokia5110.h"#include"picture.h"#include"pid.h"unsignedcharStartDelay=0;unsignedcharDelayEn=0;unsignedintTime2s=0;unsignedintCarTime=0;unsignedintCarTimeTemp=0;unsignedintCarPulse=0;unsignedintSpeed;unsignedcharIsCountSpeed=0;unsignedcharIsDisplayOn=0;unsignedcharTHRESHOLD=0X7D;unsignedintPIDFlag=0;unsignedcharPIDOn=0;unsignedcharkeyflag=1;unsignedcharStartLineFlag=0;//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js**函数名称:voidPWMDuo_Duty(intduo_duty)**功能描述:舵机控制子函数*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidPWMDuo_Duty(intduo_duty){PWMDTY01=duo_duty;PWME_PWME1=1;//使能PWM3}//**函数名称:voidPWMdian_Duty(unsignedcharmotorValue)**功能描述:控制PWMDTY23的值从而控制输出的占空比使得电机获得不同的速度正转*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidPWMdian_Duty(unsignedcharmotorValue){PWMDTY23=motorValue;}//**函数名称:voidPWMdian_DutyStop(unsignedcharmotorValue)**功能描述:控制PWMDTY45的值从而控制输出的占空比使得电机获得不同的速度反转*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//{PWMDTY45=motorValue;//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js**函数名称:unsignedcharGetSpeed(unsignedintCurSpeed)**功能描述:获得小车行驶时的速度大小从而反馈给PID实现PID控制*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//unsignedcharGetSpeed(unsignedintCurSpeed){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;}returnDianji_data;}//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js** 函数名称: voidmain(void)** 功能描述: 调用功能函数*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidmain(void){unsignedcharclearFlag=1;unsignedintPWM_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个脉冲转轮周长157cmPulseNum=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();//pid调节语句PWM_Value=//pid调节语句Dianji_data+=PWM_Value;Get_SideLine();Car_Cotrol();PWMDuo_Duty(Duoji_data);PWMdian_Duty(Dianji_data);}}//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js** 函数名称: voidinterrupt66PIT0(void)** 功能描述: 中断服务函数产出时间片*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//#pragmaCODE_SEG __NEAR_SEG NON_BANKEDvoidinterrupt66PIT0(void){staticunsignedcharPIDData=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<mc9s12xs128.h>#include"sci.h"#include"pid.h"#include"KeyScan.h"#defineROW40#defineCOLUMN120#defineROW_START10#defineROW_MAX200//#defineTHRESHOLD0x7DexternunsignedcharTHRESHOLD;unsignedcharSampleFlag=0; //奇偶场标记unsignedintm=0;unsignedintLine;unsignedinthang;unsignedchara_Temp=0,b_Temp=0;unsignedcharDianji_data=50;unsignedintDuoji_data;unsignedcharBuffer[ROW][COLUMN]={0};unsignedcharimage_center[40]={0};unsignedintzuo_danxian=1,you_danxian=1;unsignedlongWholeRoad=0;unsignedlongRoad=0;unsignedcharsmallSFlage=0;unsignedinteffectLine=0;unsignedcharflagg;//定每场采哪几行。根据像素决定。上面下面采到0了说明超出像素了unsignedintget_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};unsignedcharSumSave=0;unsignedcharIsCarStright=1;unsignedintPulseNum=0;unsignedcharJumpDot=0;unsignedcharIsStartLine=0;//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js**函数名称:voiddelays(longm)**功能描述:延时函数*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voiddelays(longm){while(m--);}//**函数名称:voidGetStartLine(void)**功能描述:扫描跑道上的去跑线*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidGetStartLine(void){unsignedchari;JumpDot=0;//扫描第29、30、31、32行的40列到80列如果扫到黑点JumpDot加1for(i=80;i>40;i--)if(Buffer[32][i]==0||Buffer[31][i]==0||Buffer[30][i]==0||Buffer[29][i]==0)JumpDot=JumpDot+1;//如果JumpDot的值大于12则说明扫描到了起跑线if(JumpDot>=12){IsStartLine=1;}if(IsStartLine==1){IsStartLine=0;PORTB_PB5=0; //灭灯指示PWME_PWME3=0; //关PWM使能PWMFlag=0;}else
PORTB_PB5=1;//亮灯指示PORTB_PB5=1;//亮灯指示//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js** 函数名称: voidTIM_Init(void)** 功能描述: 行场中断初始化函数*11**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidGet_SideLine(void)1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidGet_SideLine(void){unsignedchari,j,a=0,b=0;/voidTIM_Init(void)1TIOS=0x00;//外部输入捕捉0,1,2通道TCTL4=0x29;//通道0上升沿触发,通道1下降沿触发,通道2上升沿触发TSCR1=0x80;//使能TIE=0x07;//通道0,1,2中断使能}TFLG1=0xFF;//清中断标志位//**函数名称:voidGet_SideLine(void)for(i=ROW-2;i>0;i--){//屏蔽前两行**功能描述:从for(i=ROW-2;i>0;i--){//屏蔽前两行**值从而确定跑道中心位置**************(a)*<----60- >*(b)********for(j=60;j>0;j--){if(Buffer[i][j]==0){a=j;break;}//当缓冲区里数据值小于阈值时即检测到黑线,并把j赋给a}for(j=60;j<120;j++){if(Buffer[i][j]==0){b=j;break;}//当缓冲区里数据值小于阈值时即检测到黑线,并把j赋给b}if(i==30) //从Row-2行开始到Row-10行扫描8行进行一次双线判断{if(a==0)zuo_danxian=0; //zuo_danxian为0为白线elsezuo_danxian=l;//zuo_danxian为1为黑线if(b==0)you_danxian=0;elseyou_danxian=1;}image_center[i+1]=(a+b)/2;//每进行一次扫描记录一次图像中值a=b=0;//将a,b清0}}//**函数名称:voidinterrupt66PIT0(void)**功能描述:把摄像头所拍到的信息发送出来0、1*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidTraver_UartValue(void){unsignedchari,j;for(i=0;i<ROW;i++){for(j=0;j<COLUMN;j++)SCI_Write(Buffer[i][j]+48);}SCI_Write(0x0D); //回车SCI_Write(0X0A); //换行}}//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js**函数名称:voidStop_Car(void)**功能描述:电机反向制动即刹车*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidStop_Car(void){PWME_PWME3 = 0; //关正向PWM使能PWME_PWME5 = 1; //开反向PWM使能delays(1200); //刹车时间,看情况定PWME_PWME3 = 1; //刹完车后恢复原来的使能PWME_PWME5=0;}//**函数名称:voidThrough_Small_S(void)**功能描述:使小车在通过小S弯道时以跑直线的速度通过*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidThrough_Small_S(void){unsignedchari,n=0,j=0;//判断第10到30的中线值for(i=10;i<30;i++){if(image_center[i]>40&&image_center[i]<80){if(n++>=2)effectLine=effectLine+image_center[i];j++;}}}if(j<4){flagg=1;}elseflagg=0;n = 0;effectLine=effectLine/j;j = 0;}//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js** 函数名称: voidCar_Cotrol(void)** 功能描述: 控制小车直走、左转还是右转*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidCar_Cotrol(void){unsignedintsum,j;Through_Small_S();if(you_danxian==1&&zuo_danxian==1) //看到两黑线微调{if(flagg==1){sum=image_center[31];}elsesum=effectLine;effectLine=0;}SumSave=sum;if(Speed<2000)Duoji_data=1540+(sum-60)*19;elseDuoji_data=1540+(sum-60)*5;PID_Init(StraightSpeed); //左偏向右修正if(Duoji_data>1900)Duoji_data=1900;if(Duoji_data<1100)Duoji_data=1100;//定时一段时间使StartLineFlag置1从而减小系统开销if(StartLineFlag==1){//GetStartLine();}}///////////////////max最大转角/////////////////////////////////if(zuo_danxian==1&&you_danxian==0){if(Speed>1300)//转弯速度大于1300则刹车避免冲出跑道{Stop_Car();}for(j=60;j>0;j--){//当缓冲区里数据值小于阈值时即检测到黑线,并把j赋给aif(Buffer[30][j]==0){a_Temp=j;break;}}Duoji_data=1540+(a_Temp+20)*12;PID_Init(TurnSpeed);//PID调节转弯速度}//避免电机速度过快if(Duoji_data>1960)Duoji_data=1960;if(Duoji_data<1100)Duoji_data=1100;if(zuo_danxian==0&&you_danxian==1){if(Speed>1300){Stop_Car();}for(j=60;j<120;j++){//当缓冲区里数据值小于阈值时即检测到黑线,并把j赋给bif(Buffer[30][j]==0){b_Temp=j;break;}}Duoji_data=1540+(b_Temp-120)*12;PID_Init(TurnSpeed);if(Duoji_data>1900)Duoji_data=1900;if(Duoji_data<1100)Duoji_data=1100;}//过十字路口if(zuo_danxian==0&&you_danxian==0){if(SumSave>65||SumSave<55)IsCarStright=0;elseIsCarStright=1;if(IsCarStright==0)Duoji_data=1540-(SumSave-60)*9;elseDuoji_data=1540;if(Duoji_data>1900) Duoji_data=1900;if(Duoji_data<1100) Duoji_data=1100;PID_Init(CrossSpeed); //找不到黑线直走(方便调试)}}//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js** 函数名称: voidImage_binaryzation(unsigned introw)** 功能描述: 二值化*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidImage_binaryzation(unsignedintrow){unsignedchari;for(i=0;i<120;i++){if(Buffer[row][i]<THRESHOLD)//THRESHOLD为溢值Buffer[row][i] = 0; //小于溢值为0elseBuffer[row][i] = 1; //大于溢值为1}}//** 函数名称: voidinterrupt 8PT0_Interrupt(void)** 功能描述: 行中断处理函数*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//#pragmaCODE_SEG __NEAR_SEG NON_BANKEDvoidinterrupt8PT0_Interrupt(void){TFLG1_C0F=1;Line++;if(SampleFlag==0||Line<ROW_START||Line>ROW_MAX)return;}if(Line==get_n[hang]){delays(8);Buffer[m][0]=PORTA;_asm();Buffer[m][1]=PORTA;_asm();Buffer[m][2]=PORTA;_asm();Buffer[m][3]=PORTA;_asm();Buffer[m][4]=PORTA;_asm();Buffer[m][5]=PORTA;_asm();Buffer[m][6]=PORTA;_asm();Buffer[m][7]=PORTA;_asm();Buffer[m][8]=PORTA;_asm();Buffer[m][9]=PORTA;_asm();Buffer[m][10]=PORTA;_asm();Buffer[m][11]=PORTA;_asm();Buffer[m][12]=PORTA;_asm();Buffer[m][13]=PORTA;_asm();Buffer[m][14]=PORTA;_asm();Buffer[m][15]=PORTA;_asm();Buffer[m][16]=PORTA;_asm();Buffer[m][17]=PORTA;_asm();Buffer[m][18]=PORTA;_asm();Buffer[m][19]=PORTA;_asm();Buffer[m][20]=PORTA;_asm();Buffer[m][21]=PORTA;_asm();Buffer[m][22]=PORTA;_asm();Buffer[m][23]=PORTA;_asm();Buffer[m][24]=PORTA;_asm();Buffer[m][25]=PORTA;_asm();Buffer[m][26]=PORTA;_asm();Buffer[m][27]=PORTA;_asm();Buffer[m][28]=PORTA;_asm();Buffer[m][29]=PORTA;_asm();Buffer[m][30]=PORTA;_asm();Buffer[m][31]=PORTA;_asm();Buffer[m][32]=PORTA;_asm();Buffer[m][33]=PORTA;_asm();Buffer[m][34]=PORTA;_asm();Buffer[m][35]=PORTA;_asm();Buffer[m][36]=PORTA;_asm();Buffer[m][37]=PORTA;_asm();Buffer[m][38]=PORTA;_asm();Buffer[m][39]=PORTA;_asm();Buffer[m][40]=PORTA;_asm();Buffer[m][41]=PORTA;_asm();Buffer[m][42]=PORTA;_asm();Buffer[m][43]=PORTA;_asm();Buffer[m][44]=PORTA;_asm();Buffer[m][45]=PORTA;_asm();Buffer[m][46]=PORTA;_asm();Buffer[m][47]=PORTA;_asm();Buffer[m][48]=PORTA;_asm();Buffer[m][49]=PORTA;_asm();Buffer[m][50]=PORTA;_asm();Buffer[m][51]=PORTA;_asm();Buffer[m][52]=PORTA;_asm();Buffer[m][53]=PORTA;_asm();Buffer[m][54]=PORTA;_asm();Buffer[m][55]=PORTA;_asm();Buffer[m][56]=PORTA;_asm();Buffer[m][57]=PORTA;_asm();Buffer[m][58]=PORTA;_asm();Buffer[m][59]=PORTA;_asm();Buffer[m][60]=PORTA;_asm();Buffer[m][61]=PORTA;_asm();Buffer[m][62]=PORTA;_asm();Buffer[m][63]=PORTA;_asm();Buffer[m][64]=PORTA;_asm();Buffer[m][65]=PORTA;_asm();Buffer[m][66]=PORTA;_asm();Buffer[m][67]=PORTA;_asm();Buffer[m][68]=PORTA;_asm();Buffer[m][69]=PORTA;_asm();Buffer[m][70]=PORTA;_asm();Buffer[m][71]=PORTA;_asm();Buffer[m][72]=PORTA;_asm();Buffer[m][73]=PORTA;_asm();Buffer[m][74]=PORTA;_asm();Buffer[m][75]=PORTA;_asm();Buffer[m][76]=PORTA;_asm();Buffer[m][77]=PORTA;_asm();Buffer[m][78]=PORTA;_asm();Buffer[m][79]=PORTA;_asm();Buffer[m][80]=PORTA;_asm();Buffer[m][81]=PORTA;_asm();Buffer[m][82]=PORTA;_asm();Buffer[m][83]=PORTA;_asm();Buffer[m][84]=PORTA;_asm();Buffer[m][85]=PORTA;_asm();Buffer[m][86]=PORTA;_asm();Buffer[m][87]=PORTA;_asm();Buffer[m][88]=PORTA;_asm();Buffer[m][89]=PORTA;_asm();Buffer[m][90]=PORTA;_asm();Buffer[m][91]=PORTA;_asm();Buffer[m][92]=PORTA;_asm();Buffer[m][93]=PORTA;_asm();Buffer[m][94]=PORTA;_asm();Buffer[m][95]=PORTA;_asm();Buffer[m][96]=PORTA;_asm();Buffer[m][97]=PORTA;_asm();Buffer[m][98]=PORTA;_asm();Buffer[m][99]=PORTA;_asm();Buffer[m][100]=PORTA;_asm();Buffer[m][101]=PORTA;_asm();Buffer[m][102]=PORTA;_asm();Buffer[m][103]=PORTA;_asm();Buffer[m][104]=PORTA;_asm();Buffer[m][105]=PORTA;_asm();Buffer[m][106]=PORTA;_asm();Buffer[m][107]=PORTA;_asm();Buffer[m][108]=PORTA;_asm();Buffer[m][109]=PORTA;_asm();Buffer[m][110]=PORTA;_asm();Buffer[m][111]=PORTA;_asm();Buffer[m][112]=PORTA;_asm();Buffer[m][113]=PORTA;_asm();Buffer[m][114]=PORTA;_asm();Buffer[m][115]=PORTA;_asm();Buffer[m][116]=PORTA;_asm();Buffer[m][117]=PORTA;_asm();Buffer[m][118]=PORTA;_asm();Buffer[m][119]=PORTA;_asm();Buffer[m][120]=PORTA;Image_binaryzation(m); //二值化hang++;m++;}}//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js** 函数名称: voidinterrupt9PT1_Interrupt(void)** 功能描述: 场中断处理函数奇偶场同步信号中断采集*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//#pragmaCODE_SEG __NEAR_SEGNON_BANKEDvoidinterrupt9 PT1_Interrupt(void){TFLG1_C1F=1; //清除中断状态标志位 0通道TFLG1_C0F=1; //清除中断状态标志位 1通道m=0;Line=0;hang=0;SampleFlag=~SampleFlag;if(SampleFlag==0){PTM=0x0e;TIE=0x06;else{PTM=0x07;TIE=0x07;}}#pragmaCODE_SEG__NEAR_SEGNON_BANKEDvoidinterrupt10PT2_Interrupt(){TFLG1_C2F=1;//清除中断状态标志位2通道++WholeRoad;++PulseNum;}按键#include"KeyScan.h"#include<mc9s12xs128.h>#include"Nokia5110.h"externunsignedcharTHRESHOLD;unsignedintflag=0;unsignedcharIsScanKeyTime=0;unsignedcharKeyPressed=0,KeyPressing=0,KeyCode=0;unsignedcharIsKeyPressed=0;unsignedcharPWMFlag=0;unsignedcharKeyMode=0;unsignedcharSetMode=0;unsignedcharStraightSpeed=70;unsignedcharTurnSpeed=60;unsignedcharCrossSpeed=50;unsignedcharSpeedStep=0;unsignedcharIsSetMode=0;char*cc="M";//起跑指示灯//停车指示灯//起跑指示灯//停车指示灯#defineLED6PORTB_PB6voidKeyScan(void){unsignedcharReadData=0;ReadData=PTIM"OXFF;KeyPressed=ReadData&(ReadData"KeyPressing);KeyPressing=ReadData;}voidKeyPro(void){KeyScan();if(IsKeyPressed==1){IsKeyPressed=0;KeyCode=KeyPressing;}if(KeyPressed){IsKeyPressed=1;}switch(KeyCode){case0X01:KeyMode=1;break;case0X02:KeyMode=2;break;case0X04:KeyMode=3;break;case0X08:KeyMode=4;break;case0X10:KeyMode=5;break;case0X20:KeyMode=6;break;default:break;}KeyCode=0;voidKeyFunction(void){switch(KeyMode){case1:LED7=~LED7;LED6=~LED7;PWMFlag=~PWMFlag;break;case2:switch(SetMode){case1:{THRESHOLD++;Display_Gray_Value(48,4,3);}break;case2:{StraightSpeed++;Display_StraightSpeed_Value(48,4,2);}break;case3:{TurnSpeed++;Display_TurnSpeed_Value(48,4,2);}break;case4:{CrossSpeed++;Display_CrossSpeed_Value(48,4,2);}break;default:break;}break;case3:switch(SetMode){case1:{THRESHOLD--;Display_Gray_Value(48,4,3);}break;case2:{StraightSpeed--;Display_StraightSpeed_Value(48,4,2);}break;case3:{TurnSpeed--;Display_TurnSpeed_Value(48,4,2);}break;case4:{CrossSpeed--;Display_CrossSpeed_Value(48,4,2);}break;default:break;}break;case4:IsSetMode=1;if(++SetMode>4){SetMode=0;IsSetMode=0;}switch(SetMode)case1:{LCD_clear_half();Display_Mode1(0,3);Display_Gray_Value(48,4,3);}break;case2:{Display_Mode2(0,3);Display_StraightSpeed_Value(48,4,2);}break;case3:{Display_Mode3(0,3);Display_TurnSpeed_Value(48,4,2);}break;case4:{Display_Mode4(0,3);Display_CrossSpeed_Value(48,4,2);}break;default:break;}break;case5:if(++SpeedStep>3){SpeedStep=1;}switch(SpeedStep){case1:StraightSpeed=65;TurnSpeed=60;CrossSpeed=65;LCD_clear_half();Display_Gray(36,3,3);Display_GUI(0,4,14);break;case2:StraightSpeed=70;TurnSpeed=65;CrossSpeed=70;LCD_clear_half();Display_Gray(36,3,3);Display_GUI(0,4,14);break;case3:StraightSpeed=75;TurnSpeed=70;CrossSpeed=75;LCD_clear_half();Display_Gray(36,3,3);Display_GUI(0,4,14);break;default:break;}break;case6:break;default:break;}KeyMode=0;}PID算法#include"pid.h"/*==========================================================================**函数名称:voidinterrupt66PIT0(void)**功能描述:定义PID结构体============================================================================*/typedefstructPID{intSetPoint; //设定目标DesiredValuedoubleProportion;//比例常数ProportionalConstdoubleIntegral;//积分常数IntegralConstdoubleDerivative;//微分常数DerivativeConstintLastError; //Error[-1]intPrevError; //Error[-2]}PID;// //声明PID实体// PIDsPID;PID*sptr=&sPID;// //定义相关宏// #defineP_DATA 2//比例常数#defineI_DATA 0.3//积分常数#defineD_DATA 0.1//微分常数unsignedcharSetSpeed=0;/*=============================================================================**函数名称:voidPID_Init(unsignedcharspeedtemp)**功能描述:PID参数初始化=============================================================================*/
voidPID_Init(unsignedcharspeedtemp){sptr->LastError=0;sptr->LastError=0;sptr->PrevError=0;sptr->Proportion=P_DATA;sptr->Integral=I_DATA;sptr->Derivative=D_DATA;sptr->SetPoint=speedtemp;SetSpeed=speedtemp;}//Error[-1]//Error[-2]//比例常数ProportionalConst//积分常数IntegralConst//微分常数DerivativeConst//目标是40V=40*4.2=168CM/S/*===========================================================================**函数名称:intIncPIDCalc(intNextPoint)**功能描述:增量式PID控制设计=============================================================================*/intIncPIDCalc(intNextPoint){intiError,iIncpid; //当前误差iError=sptr->SetPoint-NextPoint; //增量计算ilncpid=sptr-〉Proportion*iError //E[k]项-sptr-〉Integral*sptr-〉LastError//E[k—1]项+sptr-〉Derivative*sptr-〉PrevError;//E[k—2]项sptr-〉PrevError=sptr-〉LastError; //存储误差,用于下次计算sptr-〉LastError=iError; //存储误差,用于下次计算return(iIncpid); //返回增量值}PWM#include"pwm.h"#include<mc9s12xs128.h〉
, <\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\>/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**函数名称:voidPLL_Init(void)**功能描述:时钟初始化函数<\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\> ,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/voidPLL_Init(void)CLKSEL=0X00;PLLCTL_PLLON=1;CLKSEL=0X00;PLLCTL_PLLON=1;SYNR=0xc0|0x09;
REFDV=0x80|0x01;POSTDIV=0x00;_asm(nop);_asm(nop);while(!(CRGFLG_LOCK==1));CLKSEL_PLLSEL=1;//disengagePLLtosystem//turnonPLL//pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;//BUSCLOCK=80M//等待设置完成//使能PLL,<\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\>/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~**函数名称:voidInit_pwm(void)**功能描述:初始化PWM**输 入:无**输 出:无**全局变量:<\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><\><
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钢琴宣传活动方案
- 走进森林活动方案
- 疯狂读书活动方案
- 跟客户介绍公司活动方案
- 粉象生活送礼品活动方案
- 疫情期间旅行活动方案
- 重阳家宴活动方案
- 社区助学典礼活动方案
- 社区参观绘画展活动方案
- 痔疮义诊活动方案
- 建筑业十项新技术
- 鱼蛋白饲料生产线项目分析方案
- 二层小楼拆除施工方案
- 第11课 《课生态和谐新景观》说课稿 2024-2025学年岭南美版(2024) 初中美术七年级上册
- 光伏电站安全检查表
- 2025江苏南京市河西新城区国有资产经营控股(集团)有限公司下属企业选聘2人笔试历年参考题库附带答案详解
- 2025至2030保暖内衣市场前景分析及发展趋势分析与未来投资战略咨询研究报告
- 2025年4月自考03346项目管理试题
- 高考报名社会实践(10篇)
- 家政服务职业技能家庭照护员理论知识考核试题及答案
- 三年级上册口算题卡
评论
0/150
提交评论