主程序
/*******************************************************************/
/*
/*
飞思卡尔智能小车主函数
/* 硬件平台: 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;
/****************************************************************************