📄 rec.c
字号:
#include <mc9s12dg128.h>
#include "ATD.h"
#include "Uart.h"
#include "display.h"
#include "ctrl.h"
#include "lcd.h"
// extern void turn_R_L(float d);
//#define gate_v 180
//#define P_A PTH
#define P_A PORTA
extern unsigned char gate_v[14];
extern unsigned char key;
char cur_hsy[30];
unsigned char chy_p,gate_ch;
extern unsigned char spd_lock;
void time_delay(unsigned int i);
//unsigned char data[300][13] ;
//unsigned int data_p=0;
/////////// new +
/*
***************************************************************************************
* 函数名: void rgz(void)
*
* 功 能: 检测黑线;
*
* 说 明: 黑线=1;白线=0;放在lm_now[14]这个数组里,lm_now[1]~lm_now[13]对应红外检测管
* 从左到右共13个管
*
****************************************************************************************
*/
void rgz(void)
{
unsigned char temp1,temp2,temp4;
char temp3;
unsigned char lm_now[14];
unsigned char dp[14];
///////////////////// (1) +
P_A=3; //点亮第1、2组红外
//dp[0]=ATD1_ChannelX(1);
time_delay(500); //延迟一段时间
ATD0CTL5=1; //ATD0通道0转换开关 ,打开通道开始新的转换
ATD1CTL5=1; //ATD1通道0转换开关 ,打开通道开始新的转换
temp1=0;
temp2=0;
while (!(ATD0STAT1 & 0x01)); //等待ATD0第一次转换完成 1
if(ATD0DR0H<=gate_v[1])
temp1++;
dp[1]= ATD0DR0H;
while (!(ATD1STAT1 &0x01)); //等待ATD1第一次转换完成 7
if(ATD1DR0H<=gate_v[7])
temp2++;
dp[7]= ATD1DR0H;
while (!(ATD0STAT1 & 0x02)); //等待ATD0第二次转换完成 1
if(ATD0DR1H<=gate_v[1])
temp1++;
while (!(ATD1STAT1 & 0x02)); //等待ATD1第二次转换完成 7
if(ATD1DR1H<=gate_v[7])
temp2++;
while (!(ATD0STAT1 & 0x04)); //等待ATD0第三次转换完成 1
if(ATD0DR2H<=gate_v[1])
temp1++;
while (!(ATD1STAT1 & 0x04)); //等待ATD1第三次转换完成 7
if(ATD1DR2H<=gate_v[7])
temp2++;
P_A=6; //预点亮第2、3组红外
if(temp1>1) /////////// 1
lm_now[1]=0; //处在亮线
else /////第一组
lm_now[1]=1; //处在暗线
if(temp2>1) //////////// 7
lm_now[7]=0; //处在亮线
else
lm_now[7]=1; //处在暗线
///////////////////// (1) -
///////////////////// (2) +
time_delay(250); //延迟一段时间
ATD0CTL5=2; //ATD0通道1转换开关 ,打开通道开始新的转换
ATD1CTL5=2; //ATD1通道1转换开关 ,打开通道开始新的转换
temp1=0;
temp2=0;
while (!(ATD0STAT1 & 0x01)); //等待ATD0第一次转换完成 4
if(ATD0DR0H<=gate_v[4])
temp1++;
dp[4]= ATD0DR0H;
while (!(ATD1STAT1 &0x01)); //等待ATD1第一次转换完成 10
if(ATD1DR0H<=gate_v[10])
temp2++;
dp[10]= ATD1DR0H;
while (!(ATD0STAT1 & 0x02)); //等待ATD0第二次转换完成 4
if(ATD0DR1H<=gate_v[4])
temp1++;
while (!(ATD1STAT1 & 0x02)); //等待ATD1第二次转换完成 10
if(ATD1DR1H<=gate_v[10])
temp2++;
while (!(ATD0STAT1 & 0x04)); //等待ATD0第三次转换完成 4
if(ATD0DR2H<=gate_v[4])
temp1++;
while (!(ATD1STAT1 & 0x04)); //等待ATD1第三次转换完成 10
if(ATD1DR2H<=gate_v[10])
temp2++;
P_A=12; //预点亮第3、4组红外
if(temp1>1) /////////// 4
lm_now[4]=0; //处在亮线
else /////第二组
lm_now[4]=1; //处在暗线
if(temp2>1) //////////// 10
lm_now[10]=0; //处在亮线
else
lm_now[10]=1; //处在暗线
///////////////////// (2) -
///////////////////// (3) +
time_delay(250); //延迟一段时间
ATD0CTL5=3; //ATD0通道2转换开关 ,打开通道开始新的转换
ATD1CTL5=3; //ATD1通道2转换开关 ,打开通道开始新的转换
temp1=0;
temp2=0;
while (!(ATD0STAT1 & 0x01)); //等待ATD0第一次转换完成 2
if(ATD0DR0H<=gate_v[2])
temp1++;
dp[2]= ATD0DR0H;
while (!(ATD1STAT1 &0x01)); //等待ATD1第一次转换完成 8
if(ATD1DR0H<=gate_v[8])
temp2++;
dp[8]= ATD1DR0H;
while (!(ATD0STAT1 & 0x02)); //等待ATD0第二次转换完成 2
if(ATD0DR1H<=gate_v[2])
temp1++;
while (!(ATD1STAT1 & 0x02)); //等待ATD1第二次转换完成 8
if(ATD1DR1H<=gate_v[8])
temp2++;
while (!(ATD0STAT1 & 0x04)); //等待ATD0第三次转换完成 2
if(ATD0DR2H<=gate_v[2])
temp1++;
while (!(ATD1STAT1 & 0x04)); //等待ATD1第三次转换完成 8
if(ATD1DR2H<=gate_v[8])
temp2++;
P_A=24; //预点亮第4、5组红外
if(temp1>1) /////////// 2
lm_now[2]=0; //处在亮线
else /////第三组
lm_now[2]=1; //处在暗线
if(temp2>1) //////////// 8
lm_now[8]=0; //处在亮线
else
lm_now[8]=1; //处在暗线
///////////////////// (3) -
///////////////////// (4) +
time_delay(250); //延迟一段时间
ATD0CTL5=4; //ATD0通道4转换开关 ,打开通道开始新的转换
ATD1CTL5=4; //ATD1通道4转换开关 ,打开通道开始新的转换
temp1=0;
temp2=0;
while (!(ATD0STAT1 & 0x01)); //等待ATD0第一次转换完成 5
if(ATD0DR0H<=gate_v[5])
temp1++;
dp[5]= ATD0DR0H;
while (!(ATD1STAT1 &0x01)); //等待ATD1第一次转换完成 11
if(ATD1DR0H<=gate_v[11])
temp2++;
dp[11]= ATD1DR0H;
while (!(ATD0STAT1 & 0x02)); //等待ATD0第二次转换完成 5
if(ATD0DR1H<=gate_v[5])
temp1++;
while (!(ATD1STAT1 & 0x02)); //等待ATD1第二次转换完成 11
if(ATD1DR1H<=gate_v[11])
temp2++;
while (!(ATD0STAT1 & 0x04)); //等待ATD0第三次转换完成 5
if(ATD0DR2H<=gate_v[5])
temp1++;
while (!(ATD1STAT1 & 0x04)); //等待ATD1第三次转换完成 11
if(ATD1DR2H<=gate_v[11])
temp2++;
P_A=48; //预点亮第5、6组红外
if(temp1>1) /////////// 5
lm_now[5]=0; //处在亮线
else /////第四组
lm_now[5]=1; //处在暗线
if(temp2>1) //////////// 11
lm_now[11]=0; //处在亮线
else
lm_now[11]=1; //处在暗线
///////////////////// (4) -
///////////////////// (5) +
time_delay(250); //延迟一段时间
ATD0CTL5=5; //ATD0通道5转换开关 ,打开通道开始新的转换
ATD1CTL5=5; //ATD1通道5转换开关 ,打开通道开始新的转换
temp1=0;
temp2=0;
while (!(ATD0STAT1 & 0x01)); //等待ATD0第一次转换完成 3
if(ATD0DR0H<=gate_v[3])
temp1++;
dp[3]= ATD0DR0H;
while (!(ATD1STAT1 &0x01)); //等待ATD1第一次转换完成 9
if(ATD1DR0H<=gate_v[9])
temp2++;
dp[9]= ATD1DR0H;
while (!(ATD0STAT1 & 0x02)); //等待ATD0第二次转换完成 3
if(ATD0DR1H<=gate_v[3])
temp1++;
while (!(ATD1STAT1 & 0x02)); //等待ATD1第二次转换完成 9
if(ATD1DR1H<=gate_v[9])
temp2++;
while (!(ATD0STAT1 & 0x04)); //等待ATD0第三次转换完成 3
if(ATD0DR2H<=gate_v[3])
temp1++;
while (!(ATD1STAT1 & 0x04)); //等待ATD1第三次转换完成 9
if(ATD1DR2H<=gate_v[9])
temp2++;
P_A=32; //预点亮第6、7组红外
if(temp1>1) /////////// 3
lm_now[3]=0; //处在亮线
else /////第五组
lm_now[3]=1; //处在暗线
if(temp2>1) //////////// 9
lm_now[9]=0; //处在亮线
else
lm_now[9]=1; //处在暗线
///////////////////// (5) -
///////////////////// (6) +
time_delay(250); //延迟一段时间
ATD0CTL5=6; //ATD0通道6转换开关 ,打开通道开始新的转换
temp1=0;
while (!(ATD0STAT1 & 0x01)); //等待ATD0第一次转换完成 6
if(ATD0DR0H<=gate_v[6])
temp1++;
dp[6]= ATD0DR0H;
while (!(ATD0STAT1 & 0x02)); //等待ATD0第二次转换完成 6
if(ATD0DR1H<=gate_v[6])
temp1++;
while (!(ATD0STAT1 & 0x04)); //等待ATD0第三次转换完成 6
if(ATD0DR2H<=gate_v[6])
temp1++;
P_A=0; //灭掉所有红外
if(temp1>1) /////////// 7
lm_now[6]=0; //处在亮线
else /////第六组
lm_now[6]=1; //处在暗线
///////////////////// (6) -
if(gate_ch==1)
{
gate_ch=0;
for (temp1=1;temp1<12;temp1++)
{
gate_v[temp1]=dp[temp1]+17;
}
}
/*
//打印当前路面情况 +
uart_putchar('\n');
uart_putchar('\r');
for(temp1=1;temp1<14;temp1++)
{
uart_putchar(lm_now[temp1]+0x30);
uart_putchar(' ');
}
uart_putchar('\n');
uart_putchar('\r');
for(temp1=0;temp1<14;temp1++)
{
uart_putchar(' ');
display2((unsigned long)temp1);
uart_putchar(':');
display2((unsigned long)dp[temp1]);
uart_putchar(' ');
}
uart_putchar('\n');
uart_putchar('\r');
//打印当前路面情况 -
*/
///////处理路面数据 +
temp2=0;
temp3=0;
temp4=0;
for(temp1=1;temp1<12;temp1++)
{
temp2+=lm_now[temp1];
}
for(temp1=1;temp1<12;temp1++)
{
if(temp3==0)
{
if(lm_now[temp1] == 1)
{
temp3=temp1+temp1;
temp4++;
}
}
else
{
if(lm_now[temp1] == 1)
{
temp4++;
}
else
{
break;
}
}
}
temp1=chy_p;
chy_p++;//指向下一个cur_hsy
if(chy_p>29)
chy_p=0;
if(temp2==0)
{ //检测到没线
cur_hsy[chy_p]= 11;
}
else if((temp2==temp4)&&(temp4<=3))
{
//检测到黑线!但不是交叉线
temp3+=temp4;
temp3=13-temp3; //得到转弯的基角度
cur_hsy[chy_p]=temp3;
}
else
{ //检测是交叉线
cur_hsy[chy_p]=cur_hsy[temp1]; //转向不变
}
//uart_putchar(' ');
//display2((unsigned long)temp3);
///////处理路面数据 -
/*
uart_putchar('\n');
uart_putchar('\r');
uart_putchar('d');
uart_putchar(':');
uart_putchar(' ');
if(cur_hsy[chy_p]<0)
{
uart_putchar('-');
display2((unsigned long)(cur_hsy[chy_p]*(-1)));
} else
display2((unsigned long)cur_hsy[chy_p]);
uart_putchar(' ');
display2((unsigned long)temp4);
uart_putchar(' ');
display2((unsigned long)temp2);
uart_putchar(' ');
display2((unsigned long)temp3);
uart_putchar('\n');
uart_putchar('\r');
*/
////////转弯 +
SP_RL(cur_hsy[chy_p]);
////////转弯 -
if(key!=2)
{
speed_show(0,(unsigned int)dp[11]);
speed_show(4,(unsigned int)dp[10]);
speed_show(8,(unsigned int)dp[9]);
speed_show(12,(unsigned int)dp[8]);
speed_show(16,(unsigned int)dp[7]);
speed_show(20,(unsigned int)dp[6]);
speed_show(24,(unsigned int)dp[5]);
speed_show(28,(unsigned int)dp[4]);
speed_show(32,(unsigned int)dp[3]);
speed_show(36,(unsigned int)dp[2]);
speed_show(42,(unsigned int)dp[1]);
lcd_dsp_buff[53]=lm_now[11]+0x30;
lcd_dsp_buff[54]=lm_now[10]+0x30;
lcd_dsp_buff[55]=lm_now[9]+0x30;
lcd_dsp_buff[56]=lm_now[8]+0x30;
lcd_dsp_buff[57]=lm_now[7]+0x30;
lcd_dsp_buff[58]=lm_now[6]+0x30;
lcd_dsp_buff[59]=lm_now[5]+0x30;
lcd_dsp_buff[60]=lm_now[4]+0x30;
lcd_dsp_buff[61]=lm_now[3]+0x30;
lcd_dsp_buff[62]=lm_now[2]+0x30;
lcd_dsp_buff[63]=lm_now[1]+0x30;
}
}
/////////// new -
/*
***************************************************************************************
* 函数名: void time_delay(unsigned int i)
*
* 功 能: 延时
*
* 说 明:
*
*
****************************************************************************************
*/
void time_delay(unsigned int i)
{
for(;i>0;i--)
{
asm
{
nop
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -