自动循迹小车的工作原理图展示了其如何通过传感器识别黑线,在不同环境下自主调整方向和速度,实现精确跟踪预定路线的功能。
```c
#include
#include qudong.h
#include duankou.h
#include lcd1602.h
#include celv.h
#define uchar unsigned char
#define uint unsigned int
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/100.0))
// 全局变量
float voltage = 6.0;
int RS1 = 100, LS1 = 100, RS0 = 100, LS0 = 100;
char heixian = 0x03; // 不等于表示检测到信号,等于表示没检测到
char ji_shu = 0; // 表示第几次检测到黑线
uint total_time_count;
// 时间相关变量
uint start_low_speed, end_low_speed, end_all, start_all;
// 测速相关变量
uint LM_cap_new, LM_cap_old, LM_cap_count, RM_cap_new, RM_cap_old, RM_cap_count;
float real_LM_speed = 0.0, top_speed = 0.0, average_speed = 0.0;
// 转换测量值为实际值相关变量
float dis1 = 0.0, dis0 = 0.0;
uint low_speed_time, total_time;
// 系统时钟初始化,aclk=32768k,mclk=XT2,SMCLK = XT2。
void Init_clock(void) {
DCOCTL = DCO0 + DCO1 + DCO2; // Max DCO数字晶振最高频率
BCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSEL选择高速晶振最高频率
BCSCTL2 |= SELM_2+SELS; // MCLK=8M,SMCLK = XT2,系统主时钟选择高速晶振
do { IFG1 &= ~OFIFG;
for(unsigned int i = 0XFF; i > 0; i--);
} while((IFG1 & OFIFG) != 0); // 清除振荡器失效标志,等待稳定
}
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR(void){
if(ADC12MEM0 < 2816)
P6OUT &= ~BIT3; // 欠压指示灯亮
else
P6OUT |= BIT3;
}
// 标志线控制策略
void ce_lve_2(char biao_zhi) {
switch(biao_zhi){
case 0: { LM_speed = LM_speed * 0.5; RM_speed = RM_speed * 0.5; break;}
case 1: { dian_ji(-100,-100); delay_ms(50); dian_ji(0,0);
char i=0;
do {
delay_ms(500);
P6OUT |= BIT6;
P6OUT ^= BIT4;
i++; } while(i<21);
LM_speed = 100; RM_speed = 100;
start_all = total_time_count;
ji_shu++;
break;}
// 其他情况...
}
}
// 干簧管部分
void gan_huang_guan(void){
if(youxinhao == 1) return;
heixian = P3IN & 0X03;
if(heixian != 0x03){ // 检测到信号
ji_shu++;
youxinhao = 1;
TBCCR0=TBR+32768; TBCCTL0=CCIE;
} else {
youxinhao = 0;
}
}
void Init_timer_B(void){
TBCTL = TBSSEL_1 + MC_2+TBIE + TBCLR;
TBCCTL0 = CCIE;
// 干簧管用
TBCCTL1 = CM_1 + CCIS_1 + CAP + CCIE;
// 右轮测速用
TBCCTL2 = CM_1 + CCIS_1 + CAP + CCIE;
TBCCR0 =TBR+32768;
_EINT();
}
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0(void){
youxinhao = 0;
TBCCTL0 &=