本文源于 百度 单片机吧 楼主洗洗
楼主对智能小车情有独钟,当然本人也是小白一个,欢迎大家多提意见~~~
楼主的小车主要有超声波避障两驱车,温湿监控循迹两驱,蓝牙四驱车,彩灯六驱车,欢迎交流~~~
上图片了先看看我的试验台 小寒酸了
这个是超声波测距避障和点阵结合的一款小车,可以自动避障并且可以在点阵上实现汉字的流水显示
这个就是我忙活了一天半蓝牙温湿检测的小车,,
可以手机控制小车,并能检测周围的温湿度并实时显示在5110液晶上
接下来就是彩灯的制作了~~
不过焊工好差。。。。。
不过名称霸气 叫魔鬼之心
这个是六驱的彩车 也是手机蓝牙遥控的,不过手机还能控制车载彩灯变化花样 和亮闪的频率,,,,,
由于考虑到场地不是很好和车重设计成了六驱
飞思卡尔 ,,,楼主努力中 不过不简单啊
楼主这里还有公布一些程序~~
发福利了~~~
最简单的小车PWM小车调速
/****************************************************************************
硬件连接
P1_6 接驱动模块ENA使能端,输入PWM信号调节速度
P1_7 接驱动模块ENB使能端,输入PWM信号调节速度
P3_4 P3_5 接IN1 IN2 当 P3_4=1,P3_5=0; 时左电机正转 驱动蓝色输出端OUT1 OUT2接左电机
P3_4 P3_5 接IN1 IN2 当 P3_4=0,P3_5=1; 时左电机反转
P3_6 P3_7 接IN3 IN4 当 P3_6=1,P3_7=0; 时右电机正转 驱动蓝色输出端OUT3 OUT4接右电机
P3_6 P3_7 接IN3 IN4 当 P3_6=0,P3_7=1; 时右电机反转
P1_0接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1
P1_1接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2
P1_2接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
P1_3接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4
四路寻迹传感器有信号(白线)为0 没有信号(黑线)为1
四路寻迹传感器电源+5V GND 取自于单片机板靠近液晶调节对比度的电源输出接口
关于单片机电源:本店驱动模块内带LDO稳压芯片,当电池输入最低的电压6V时候可以输出稳定的5V
分别在针脚标+5 与GND 。这个电源可以作为单片机系统的供电电源。
****************************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
sbit zpwm=P1^0;//接驱动模块ENA使能端,输入PWM信号调节速度
sbit ypwm=P1^1; //接驱动模块ENB
sbit dj11=P0^0; //电机
sbit dj12=P0^1;
sbit dj21=P0^2;
sbit dj22=P0^3;
uchar pwm_val_left =0;//变量定义
uchar push_val_left =0;// 左电机占空比N/10
uchar pwm_val_right =0;
uchar push_val_right=0;// 右电机占空比N/10
bit Right_moto_stop=1;
bit Left_moto_stop =1;
uint time=0;
void zqj() //左前进
{
dj11=0;
dj12=1;
}
void zht() //左后退
{
dj11=1;
dj12=0;
}
void yqj() //右前进
{
dj21=0;
dj22=1;
}
void yht() //右后退
{
dj21=1;
dj22=0;
}
/************************************************************************/
void qj()//前进函数
{
push_val_left =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
push_val_right =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
zqj();
yqj();
}
void zz() //左转
{
push_val_left =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
push_val_right =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
zht(); //执行左后退的函数
yqj(); //执行右前进的函数 实现左转
}
void yz()
{
push_val_left =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度 push 推动 速度的调节
push_val_right =10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度
yht();
zqj();
}
/************************************************************************/
/* PWM调制电机转速 //pwm满款调频 */
/************************************************************************/
/* 左电机调速 */
/*调节push_val_left的值改变电机转速,占空比 */
void pwm_out_left_moto(void)//??????????????????????
{
if(Left_moto_stop) //moto 运动的意识
{
if(pwm_val_left<=push_val_left)
zpwm=1;
else
zpwm=0;
if(pwm_val_left>=10)
pwm_val_left=0;
}
else zpwm=0;
}
/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
ypwm=1;
else
ypwm=0;
if(pwm_val_right>=10)
pwm_val_right=0;
}
else ypwm=0;
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 2
{
TH0=0XF8; //1Ms定时
TL0=0X30;
time++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/***************************************************/
void main(void)
{
TMOD=0X01;
TH0= 0XF8; //1ms定时
TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
while(1)/*无限循环*/
{
zz();
}
}
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
#include
#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;//?
}
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;//?
}
void AD_caiji()
{
uint i;
ADC_init();
ADC_Result11 = ADC_Result2 + ADC_Result1 * 256;
for(i=0;i<10;i++) //AD采集累加十次
{
if(i<10)
ADC_Result11++; //?
/*if(ADC_Result11<15)
{ IT=50; }
else
{ IT=700; } */
}
ADC_Result=ADC_Result11/IT;
a = ADC_Result % 10;
b = ADC_Result / 10 % 10;
c = ADC_Result / 100 % 10;
ADC_init1();
ADC_Result22 = ADC_Result2 + ADC_Result1 * 256;
for(i=0;i<10;i++) //AD采集累加十次
{
if(i<10)
ADC_Result22++; //?
/* if(ADC_Result22<15)
{ IT=50; }
else
{ IT=700; } */
}
ADC_Result3=ADC_Result22/IT;
d = ADC_Result3 % 10;
e = ADC_Result3 / 10 % 10;
f = ADC_Result3/ 100 % 10;
if(P3_6==0) //P3^6调节Pi值
{
Pi=Pi2;
}
else
{
Pi=Pi1;
}
Mid=(int)((ADC_Result-ADC_Result3)*Pi);
/*if(Mid<-15)
{
Mid=-15;
}
if(Mid>15)
{
Mid=15;
}*/
Motor_L=Base-Mid;
Motor_R=Base+Mid;
Motor_Control_L();
Motor_Control_R();
}
void senddata_595(uchar wei,uchar duan)
{
uchar i;
RCK_L;
for(i=1;i<=8;i++)
{
SCK_L;
if((wei&0x80)!=0) //注意优先级
SI_H;
else
SI_L;
SCK_H;
wei<<=1;
}
for(i=1;i<=8;i++)
{
SCK_L;
if((duan&0x80)!=0) //注意优先级
SI_H;
else
SI_L;
SCK_H;
duan<<=1;
}
RCK_H;
}
void main(void)
{
TMOD=0X01; //?
TH0= 0X0FF;//? //0.1ms定时
TL0= 0X0A4; //?
TR0= 1;
ET0= 1;
EA = 1;
while (1)
{
if(k5==0)
{
if(k3==0&&k1==1&&k2==1)
{
Motor_L=20;
Motor_R=20;
Motor_Control_L();
Motor_Control_R();
}
if(k3==0&&k1==0)
{
Motor_L=0;
Motor_R=30;
Motor_Control_L();
Motor_Control_R();
}
if(k3==0&&k2==0)
{
Motor_L=30;
Motor_R=0;
Motor_Control_L();
Motor_Control_R();
}
if(k1==0)
{
Motor_L=-5;
Motor_R=60;
Motor_Control_L();
Motor_Control_R();
}
if(k2==0)
{
Motor_L=60;
Motor_R=-5;
Motor_Control_L();
Motor_Control_R();
}
if(k1==1&&k2==1&&k3==1)
{
Motor_L=30;
Motor_R=30;
Motor_Control_L();
Motor_Control_R();
}
if(k1==0&&k2==0&&k3==0&&k4==0)
{
Motor_L=0;
Motor_R=0;
Motor_Control_L();
Motor_Control_R();
}
}
else
{
AD_caiji();
senddata_595(wei1[3],duan1[a]);//数码管动态显示采集数值
senddata_595(wei1[2],duan1[b]);
senddata_595(wei1[1],duan1[c]);
senddata_595(wei1[7],duan1[d]);//数码管动态显示采集数值
senddata_595(wei1[6],duan1[e]);
senddata_595(wei1[5],duan1[f]);
}
}
}