程序如下:
//主程序文件1 main.c://
#include<REG52.H> //包含51单片机头文件,内部有各种寄存器定义
#include<PWM.H> //包含HL-1蓝牙智能小车驱动IO口定义等函数
#include<intrins.H> //包含HL-1蓝牙智能小车驱动IO口定义等函数
unsigned int i;
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay100ms() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{
P1=0X00; //关电机
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TR0= 1;
ET0= 1;
EA = 1;
//开总中断
B: for(i=0;i<10;i++) //判断K3是否按下
{
Delay1ms(); //1ms内判断50次,如果其中有一次被判断到K3没按下,便重新检测
if(anniu!=0 )//当K3按下时,启动小车
goto B; //跳转到标号B,重新检测
}
//蜂鸣器响一声
BUZZ=0; //50次检测K3确认是按下之后,蜂鸣器发出“滴”声响,然后启动小车。
Delay500ms();
BUZZ=1;//响50ms后关闭蜂鸣器
while(1) //无限循环
{
//有信号为0 没有信号为1
if(Left_1_led==0&&Right_1_led==0&&Left_2_led==1&&Right_2_led==1)
run(); //调用前进函数
else
{
if(Left_1_led==1&&Right_1_led==0) //左边检测到黑线
{
backrun();
Delay100ms();
Delay100ms();
rightrun(); //调用小车右转 函数
Delay100ms();
// leftrun(); //调用小车左转 函数
}
if(Left_2_led==1&&Right_2_led==0) //左边检测到黑线
{
backrun();
Delay100ms();
Delay100ms();
leftrun(); //调用小车左转 函数
Delay100ms();
Delay100ms();
Delay100ms();
Delay100ms();
// leftrun(); //调用小车左转 函数
// rightrun(); //调用小车右转 函数
}
if(Right_1_led==1&&Left_1_led==0) //右边检测到黑线
{
// rightrun(); //调用小车右转 函数
backrun();
Delay100ms();
Delay100ms();
leftrun(); //调用小车左转 函数
Delay100ms();
}
if(Right_2_led==1&&Left_2_led==0) //右边检测到黑线
{
backrun();
Delay100ms();
Delay100ms();
rightrun(); //调用小车右转 函数
Delay100ms();
Delay100ms();
Delay100ms();
Delay100ms();
// leftrun(); //调用小车左转 函数
// rightrun(); //调用小车右转 函数
}
if(Right_1_led==1&&Left_1_led==1) //悬空状态 避悬崖
{
stop(); //调用小车停止
}
}
}
}
//调速文件2 pwm.h//
#ifndef __PWM_H_
#define __PWM_H_
//定义小车驱动模块输入IO口
sbit L293D_IN1=P1^2;
sbit L293D_IN2=P1^3;
sbit L293D_IN3=P1^4;
sbit L293D_IN4=P1^5;
/***蜂鸣器接线定义*****/
sbit BUZZ=P2^3;
sbit anniu=P3^2;
sbit Left_1_led=P3^7; //左传感器
sbit Right_1_led=P3^6; //右传感器
sbit Left_2_led=P3^4; //左传感器
sbit Right_2_led=P3^5; //右传感器
sbit Left_moto_pwm=P1^6; //PWM信号端
sbit Right_moto_pwm=P1^7; //PWM信号端
#define Left_moto_Stop {P1_2=0,P1_3=0;} //左边电机停转
#define Right_moto_Stop {P1_4=0,P1_5=0;} //右边电机停转
unsigned char pwm_val_left =0;//变量定义
unsigned char push_val_left =0;// 左电机占空比N/20
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;// 右电机占空比N/20
bit Right_moto_stop=1;
bit Left_moto_stop =1;
/************************************************************************/
//前速前进
void run(void)
{
push_val_left=5; //速度调节变量 0-20。。。0最小,20最大
push_val_right=5;
L293D_IN1=1;
L293D_IN2=0;
L293D_IN3=1;
L293D_IN4=0;
}
//后退函数
void backrun(void)
{
push_val_left=10; //速度调节变量 0-20。。。0最小,20最大
push_val_right=10;
L293D_IN1=0;
L293D_IN2=1;
L293D_IN3=0;
L293D_IN4=1;
}
//左转
void leftrun(void)
{
push_val_left=7;
push_val_right=20;
L293D_IN1=0;
L293D_IN2=1;
L293D_IN3=1;
L293D_IN4=0;
}
//右转
void rightrun(void)
{
push_val_left=20;
push_val_right=7;
L293D_IN1=1;
L293D_IN2=0;
L293D_IN3=0;
L293D_IN4=1;
}
//停止
void stop(void)
{
L293D_IN1=0;
L293D_IN2=0;
L293D_IN3=0;
L293D_IN4=0;
}
/************************************************************************/
/* 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>=20)
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>=20)
pwm_val_right=0;
}
else
{
Right_moto_pwm=0;
}
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
void Timer0Init() interrupt 1
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/*********************************************************************/
//void Timer0Init(void) //1毫秒@11.0592MHz
//{
// AUXR &= 0x7F; //定时器时钟12T模式
// TMOD &= 0xF0; //设置定时器模式
// TMOD |= 0x01; //设置定时器模式
// TL0 = 0x66; //设置定时初值
// TH0 = 0xFC; //设置定时初值
// TF0 = 0; //清除TF0标志
// TR0 = 1; //定时器0开始计时
//}
#endif
资料下载地址:
2.传感器底板.pdf
(67.53 KB, 下载次数: 11)
1.主板原理图.pdf
(105.15 KB, 下载次数: 6)
|