这个是为了去年参加某比赛的作品。
功能:
蓝牙启动,
变速,
蔽障,
舵机摆臂攻击,
目标搜索,
其它
硬件搭建布局图:
在实验室写的程序,没及时备份。。完整版的程序没有了!
只实现部分模块功能的源码:
#include "reg52.h"
#include
#define uint unsigned int
#define uchar unsigned char
#define Cycle 20000 //定义周期
uint PWM_Value[8];
uchar order=0; //中断步长
//按键检测
//sbit key1=P2^0;
//sbit key2=P2^1;
//PWM的输出端口
sbit PWM_OUT0=P2^5;
sbit PWM_OUT1=P2^6;
//红外检测口
sbit H1 = P0^0;
sbit H2 = P0^1;
sbit H3 = P0^2;
sbit H4 = P0^3;
sbit H5 = P0^4;
sbit H6 = P0^5;
sbit H7 = P0^6;
sbit H8 = P0^7;
//步进电机方向口
sbit B1 = P1^4;
sbit B2 = P1^5;
sbit B3 = P1^6;
sbit B4 = P1^7;
//步进电机脉冲口
sbit BU1 = P1^0;
sbit BU2 = P1^1;
sbit BU3 = P1^2;
sbit BU4 = P1^3;
int i,key1,key2;
/********************************************
延时程序
*********************************************/
void delay(uint t,uint ti)
{
uint k;
while(t--)
{
for(k=0; k1000)
PWM_Value[0]-=2;
if(PWM_Value[1]>1000)
PWM_Value[1]-=2;
}
delay(5,20);
}
/**********************************************************
* *
* 步进电机驱动 *
*num表示距离,num1表示步进电机脉冲频率, *
*num2和num3表示延迟时间长度 *
***********************************************************/
void motor_forward(int num,int num1,int num2,int num3) //前进
{
B1 = 1;
B2 = 1;
B3 = 0;
B4 = 0;
while(num--){
motor_ffw(num1,num2,num3);
}
}
void motor_backward(int num,int num1,int num2,int num3) //后退
{
B1 = 0;
B2 = 0;
B3 = 1;
B4 = 1;
while(num--){
motor_ffw(num1,num2,num3);
}
}
void motor_left(int num,int num1,int num2,int num3) //左转
{
B1 = 0;
B2 = 0;
B3 = 0;
B4 = 0;
while(num--){
motor_ffw(num1,num2,num3);
}
}
void motor_right(int num,int num1,int num2,int num3) //右转
{
B1 = 1;
B2 = 1;
B3 = 1;
B4 = 1;
while(num--){
motor_ffw(num1,num2,num3);
}
}
/********************************************************
*
*红外测距传感器函数 ,0为检测到障碍物,1为正常
*
*********************************************************/
void red_driver()
{
if((H5|H6|H7|H8) == 1) //检测小车是否到达擂台边缘
{
if((H5&H7) == 1){//检测小车正前方到达边缘,先退后,再右转
motor_backward(20,20,2,50);
motor_right(36,16,2,50);
}
else if((H6&H8) == 1){//检测小册正后方到达边缘
motor_forward(20,20,2,50);
motor_right(36,16,2,50);
}
else
{ //检测小车四个角落到达边缘
if (H5 == 1){
motor_backward(20,20,2,50);
motor_right(36,16,2,50);
}
else if (H6 == 1){
motor_forward(10,20,2,50);
}
else if (H7 == 1){
motor_backward(20,20,2,50);
motor_left(36,16,2,50);
}
else if (H8 == 1){
motor_forward(10,20,2,50);
}
}
}
else if((H3&H4) == 0) //检测小车左右两边是否有障碍物
{
if (H3 == 0){
motor_left(36,16,2,50);
}
else if (H4 == 0){
motor_right(36,16,2,50);//38
}
}
else if(H2 == 0){ //检测小车后面是否有障碍物,加速倒退
motor_backward(20,16,2,40);
}
else if(H1 == 0){ //检测小车前面是否有障碍物,加速冲击
motor_backward(20,16,2,40);
}
else
motor_forward(1,20,2,50);
}
/********************************************
初始化
*********************************************/
void init()
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x21; //定时器工作方式2
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR1 = 1; //打开定时器1中断
TR0 = 1; //启动定时器0
ES = 1; //开串口中断
ET0 = 1; //打开定时器0中断
ET1 = 1; //打开定时器1中断
EA = 1; // 开总中断
PT0 = 0; //定时器0 设置为最高优先中断,1表示高,0表示低
PX0 = 0; // 外部中断0 设置最低中断
PS = 1; //串口中断
}
/********************************************************
*
*主函数
*
*********************************************************/
void main()
{
init();
PWM_Value[0]=1500;
PWM_Value[1]=1500;
H5=H6=H7=H8 =0;
H1=H2=H3=1;
H4 = key1 = 0;
RI = 1;
for(i=0;i<100;i++)
{
keyscan();
}
key1 = 1;
key2 = 0;
while(1)
{
}
}
/********************************************************
*
*串口中断
*
*********************************************************/
void serial() interrupt 4
{
motor_forward(60,20,2,50);
while(1)
{
for(i=0;i<100;i++)
{
keyscan();
}
key2 = 1;
red_driver();
}
}
/********************************************************
//定时器0 中断子函数
//这里输出几路波形 就应该为 20MS/N =X 那么X 就是N路平分时间
//在用N-高电平时间 就为该路低电平时间咯。 就这么简单。。。
*********************************************************/
void timer0() interrupt 1
{
switch(order)
{
case 1:PWM_OUT0=1;
TH0=-PWM_Value[0]/256; //第一路输出高电平时长
TL0=-PWM_Value[0]%256;
break;
case 2:PWM_OUT0=0;
TH0=-(5000-PWM_Value[0])/256; //第一路 输出低电平时长
TL0=-(5000-PWM_Value[0])%256;
break;
case 3:PWM_OUT1=1;
TH0=-PWM_Value[1]/256;
TL0=-PWM_Value[1]%256;
break;
case 4:PWM_OUT1=0;
TH0=-(5000-PWM_Value[1])/256;
TL0=-(5000-PWM_Value[1])%256;
break;
order=0;
break;
default: order=0;
}
order++;
}