ad采集和跟随小车的程序
/****************************************************************************
硬件连接
P1_3 接驱动模块ENA使能端,输入PWM信号调节速度
P1_4 接驱动模块ENB使能端,输入PWM信号调节速度
P3_2 P3_3 接IN1 IN2 当 P3_2=1,P3_3=0; 时左电机正转 驱动蓝色输出端OUT1 OUT2接左电机
P3_2 P3_3 接IN1 IN2 当 P3_2=0,P3_3=1; 时左电机反转
P3_4 P3_5 接IN3 IN4 当 P3_4=1,P3_4=0; 时右电机正转 驱动蓝色输出端OUT3 OUT4接右电机
P3_4 P3_5 接IN3 IN4 当 P3_5=0,P3_5=1; 时右电机反转
四路寻迹传感器电源+5V GND 取自于单片机板靠近液晶调节对比度的电源输出接口
关于单片机电源:本店驱动模块内带LDO稳压芯片,当电池输入最低的电压6V时候可以输出稳定的5V
分别在针脚标+5 与GND 。这个电源可以作为单片机系统的供电电源。
****************************************************************************/
#include <AT89x51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define Left_moto_pwm P1_5 //接驱动模块ENA使能端,输入PWM信号调节速度
#define Right_moto_pwm P1_6 //接驱动模块ENB
/*#define Left_1_led P1_0 //四路寻迹模块接口第一路
#define Left_2_led P1_1 //四路寻迹模块接口第二路
#define Right_1_led P1_2 //四路寻迹模块接口第三路
#define Right_2_led P1_3 //四路寻迹模块接口第四路*/
#define Left_moto_go {P3_2=0,P3_3=1;} //P3_2 P3_3 接IN1 IN2 当 P3_2=0,P3_3=1; 时左电机前进
#define Left_moto_back {P3_2=1,P3_3=0;} //P3_2 P3_3 接IN1 IN2 当 P3_2=1,P3_3=0; 时左电机后退
#define Right_moto_go {P3_4=0,P3_5=1;} //P3_4 P3_5 接IN1 IN2 当 P3_4=0,P3_5=1; 时右电机前转
#define Right_moto_back {P3_4=1,P3_5=0;} //P3_4 P3_5 接IN1 IN2 当 P3_4=1,P3_5=0; 时右电机后退
sbit k1=P0^0;
sbit k2=P0^1;
sbit k3=P0^2;
sbit k4=P0^3;
sbit k5=P0^4;
unsigned char pwm_val_left =0;//变量定义
unsigned char push_val_left =0;// 左电机占空比N/100
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右电机占空比N/100
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned int time=0;
int IT=110;
int Base=100;
char Pi;
char Pi1=2.3;
char Pi2=2;
#define SI_H P2_7=1 //数据输入为高
#define SI_L P2_7=0 //数据输入为低
#define RCK_H P2_6=1 //总控制输入为高
#define RCK_L P2_6=0 //总控制输入为低
#define SCK_H P2_5=1 //时钟输入为高
#define SCK_L P2_5=0 //时钟输入为低
//uchar code duan1[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共阴极
uchar code duan1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极
//uchar code wei1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //共阴极
uchar code wei1[] ={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //共阳极
sfr P1ASF = 0X9D; //P1口选择功能寄存器1001 1101
sfr ADC_CONTR = 0XBC; //ADC控制寄存器1011 1100
sfr ADC_RES = 0XBD; //ADC转换结果寄存器高 1011 1101
sfr ADC_RESL = 0XBE; //ADC转换结果寄存器低 1011 1110
sfr AUXR1 = 0XA2; //ADC转换结果调整位 1010 0010
//sfr IE = 0XA8; //ADC中断允许寄存器
//sfr IP = 0XB8; //ADC中断优先级控制寄存器高
//sfr IPH = 0XB7; //ADC中断优先级控制寄存器低
uint ADC_Result,ADC_Result1, ADC_Result2,ADC_Result3, ADC_Result11,ADC_Result22;
uint a, b, c,d,e,f;
char Motor_R,Motor_L,Mid;
/************************************************************************/
void Motor_Control_L(void) //左电机控制
{
if(Motor_L>=0)
{
if(Motor_L>=100)
{
Motor_L=100;
}
push_val_left =Motor_L; //? // 正转
Left_moto_go;
}
if(Motor_L<0)
{
if(Motor_L<=(-100))
{
Motor_L=100;
}
push_val_left=-(Motor_L); //反转
Left_moto_back;
}
}
void Motor_Control_R(void)//右电机控制
{
if(Motor_R>=0)
{
if(Motor_R>=100)
{
Motor_R=100;
}
push_val_right=Motor_R; // 正转
Right_moto_go;
}
if(Motor_R<0)
{
if(Motor_R<=(-100))
{
Motor_R=100;
}
push_val_right =-(Motor_R); //反转?
Right_moto_back ;
}
}
/************************************************************************/
/* PWM调制电机转速 */
/************************************************************************/
/* 左电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_out_left_moto(void)
{
if(Left_moto_stop) //?
{
if(pwm_val_left<=push_val_left)
Left_moto_pwm=1; //??
else
Left_moto_pwm=0;
if(pwm_val_left>=100)
pwm_val_left=0;
}
else Left_moto_pwm=0;
}
/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
Right_moto_pwm=1;
else
Right_moto_pwm=0;
if(pwm_val_right>=100)
pwm_val_right=0;
}
else Right_moto_pwm=0;
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 2
{
TH0=0X0FF; //0.1Ms定时 //?
TL0=0X0A4; //?
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void ADC_init(void) //AD转换初始化
{
ADC_CONTR = 0Xf8;
ADC_Result1 = ADC_RES;//?
ADC_Result2 = ADC_RESL; //?
}
void ADC_init1(void) //AD转换初始化
{
ADC_CONTR = 0Xf9;
ADC_Result1 = ADC_RES;//?
ADC_Result2 = ADC_RESL;//?
}