📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#define TIME_6us 38
#define Mid_PWM 2932
#define Right_Max 3465
#define Left_Max 2399
#define TIME_1MS 6656
#define LINE_MAX 40
#define LINE_B 35
#define LINE_M 15
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
//extern word temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
//byte Pre_SetSpeed0;
//byte Pre_SetSpeed1;
//byte Pre_SetSpeed2;
byte Max_Speed;
byte PreLength;
byte Min_Speed;
byte SpeedTerminal=1;
byte Count=0;
byte Length=0;
int ErrorSum=0;
//void key(void);
//void IintEEPROM(void);
void SetSpeed(byte v);
void InitPWM(void);
void SetAngle(signed char a);
void SetDutycycle(word Duty);
//word ReadEEPROM(word addr);
word Duty;
byte Speed;
byte Speed_array[2]={0};
byte Cal_Speed;
byte NearFlag = 1;
byte MidFlag = 1;
char SpeedFlag=0;
char PreSpeedFlag;
static byte i =0;
static word x=0;
byte FieldFlag=0;
word LineNum =0;
word LineCount=25;
byte BlackCount[LINE_MAX]={0};
signed char Mid_def = 16,flag=1,blacklocationl,blacklocationr,leftflag,rightflag;
static char m,n;
static char Mid_left,Mid_right;
//byte LineValue_Near[35] = {0} ;
//byte LineValue_Mid[35] = {0} ;
//byte LineValue_Far[35] = {0} ;
byte LineValue[LINE_MAX][33]= {0};
signed char BlackLocation[LINE_MAX]={0};
void Delay_6us(void);
signed char Error_N[LINE_MAX]={0};
signed char Error_N_1[LINE_MAX]={0};
void CCD_BlackLocation(void);
/////////////Interrupt///////////
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void CAP_Line(void)
{
TFLG1_C1F=1;
LineNum++;
}
interrupt void CAP_IRQ(void)
{
FieldFlag=1;
INTCR_IRQEN= 0;
TIE_C1I=1;
//PORTB=0xff;
}
/******************************************************/
#pragma CODE_SEG DEFAULT
/////////////Delay//////////////
void Delay_6us(void)
{
int k;
for (k=0; k<TIME_6us;k++ ) { }
}
/////////////Delay_ms///////////
void Delay_ms(word xms)
{
int k , j;
for (j=0; j<xms; j++)
{
for (k=0; k<TIME_1MS; k++);
}
}
/////////////Bus////////////////
void init_Bus(void)
{
REFDV=3;
SYNR=9; //bus clock=16MHz*(SYNR+1)/(REFDV+1)
while(0==CRGFLG_LOCK); //untill VCO run stable
CLKSEL=0x80; // PLLSEL=1
}
/////////////SCI////////////////
//初始化串行口参数,波特率设置为9600
void InitSCI(void)
{
SCI0BD = 260;//设置波特率寄存器,波特率为9600 156
SCI0CR2_TE = 1;//发送使能
SCI0CR2_RE = 1;//接收使能
}
//向串口发送一个字节ASCII码
void TxSCI(byte data)
{
while(SCI0SR1_TDRE==0); //检查发送标志
SCI0DRL = data;
}
//向串口发送一个字节ASCII码'|'
void TxSCI_over(void)
{
while(SCI0SR1_TDRE==0); //检查发送标志
SCI0DRL = '*';
}
//向串口发送多个字节ASCII码
void TxsSCI(byte *p)
{
while(*p!='\0')
{
TxSCI(*p++);
}
}
//向串口发送1个字节十进制数
void TxSCI_1B(byte data)
{
byte temp[4];
temp[0] = data/100%10+0x30;
temp[1] = data/10%10+0x30;
temp[2] = data%10+0x30;
temp[3] = '\0';
TxsSCI(temp);
TxSCI_over();
}
//向串口发送2个字节十进制数
void TxSCI_2B(word data)
{
byte temp[6];
temp[0] = data/10000%10+0x30;
temp[1] = data/1000%10+0x30;
temp[2] = data/100%10+0x30;
temp[3] = data/10%10+0x30;
temp[4] = data%10+0x30;
temp[5] = '\0';
TxsSCI(temp);
TxSCI_over();
}
/////////////ECT////////////////
void init_ECT(void)
{
TCTL4=0b00010111;
TSCR1_TEN=1;
ICPAR_PA0EN=1;
//PBCTL_PBEN=1;
TSCR2_PR=0;
}
////////////IRQ///////////////
void init_IRQ(void)
{
INTCR_IRQE=1;
}
/////////////ATD////////////////
void init_ATD(void)
{
ATD1CTL2 = 0xc0;//AD0模块使能,读取转换结果后自动清零
ATD1CTL3 = 0x08;
ATD1CTL4 = 0x81;//8位精度,采样时间为2个AD转换时钟,4分频
ATD1CTL5=0xA0; //右对齐,单通道
ATD1DIEN=0x00; //禁止数字输入
}
////////////CCD_Info///////////
void CCD_Info(void)
{
//PORTB=0;
INTCR_IRQEN= 1;
while(!FieldFlag);
//PACN0=0;
for(m=0;m<LINE_MAX;m++)
{
while(LineNum<LineCount);
Delay_6us();
for(n=0;n<33;n++)
{
while(!ATD1STAT0_SCF);
LineValue[m][n]=ATD1DR0L;
}
LineCount+=7;
/* for(n=0;n<33;n++)
{
BlackCount[m]=0;
if(LineValue[m][n]<64)
{
LineValue[m][n]=0;
BlackCount[m]++;
}
else LineValue[m][n]=1;
}
if(BlackCount[m]>6)
{
BlackLocation[m]=127;
continue;
} */
}
/* for(Mid_left=16,Mid_right=16;Mid_right<33;Mid_left--,Mid_right++)
{
if(LineValue[m][Mid_left]==0)
{
BlackLocation[m]= Mid_left ;
break;
}
if(LineValue[m][Mid_right]==0)
{
BlackLocation[m]= Mid_right;
break;
}
if(Mid_right==32) BlackLocation[m]=127;
}
} */
ATD1CTL2=0X00;
//Speed = PACN0;
TIE_C1I=0;
FieldFlag=0;
LineNum=0;
LineCount=25;
}
////////////BlackLocation/////////
void CCD_BlackLocation(void)
{
for(m=LINE_MAX-1;m>=0;m--)
{ PORTA_BIT7=1;
BlackCount[m] = 0;
for(n=0;n<33;n++)
{
if(LineValue[m][n]<64)
{
LineValue[m][n]=0;
BlackCount[m]++;
}
else LineValue[m][n]=1;
}
if(BlackCount[m]>10)
{
BlackLocation[m]=127; //处理十字线和异常黑色区域标志
continue;
}
if(BlackCount[m] == 0)
{
BlackLocation[m]=125; //全白行标志
continue;
}
if(BlackLocation[m] != 125)
{
if(LineValue[m][Mid_def] != 0)
{
if( (LineValue[m][Mid_def - 2] == 0) && (Mid_def > 2))
{
Mid_left = Mid_right = Mid_def - 2;
}
if ((LineValue[m][Mid_def + 2] == 0) && (Mid_def < 30))
{
Mid_left = Mid_right = Mid_def +2;
}
if((LineValue[m][Mid_def-2] != 0) && (LineValue[m][Mid_def+2] != 0))
{
flag = 0;
}//没找到黑点,则从中间开始搜索
}
else
{
Mid_left = Mid_right = Mid_def;
}
if(flag == 0 || (m == LINE_MAX-1) )
{
flag=1;
for(Mid_left=16,Mid_right=16;Mid_right<33;Mid_left--,Mid_right++)
{
if(LineValue[m][Mid_left]==0)
{
BlackLocation[m]= Mid_left ;
break;
}
if(LineValue[m][Mid_right]==0)
{
BlackLocation[m]= Mid_right;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -