|
发表于 2012-9-26 15:26:18
|
显示全部楼层
本帖最后由 sunxiaofei 于 2012-9-26 15:36 编辑
我的双字符版可以控制但要把控制A1变成4131即A的字符十六进制编码是41,1的字符十六进制编码是31 我的是四个减速电机,两个驱动轮子(链条四驱)两个云台,没舵机。下位机里有舵机控制我没用过。
电机由八个继电器控制 下位机(51单片机)源码:
/*预处理命令*/
#include <reg52.h> //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
#define motor P1 /*规定电机为p1端口组
/***L298N接法
1INA > P10
1INB > P11
2INA > P12
2INB > P13***/
uchar serVal[2]; /*无符号型字符数据serVal[2] */
uchar hightVotage1, lowVotage1, angleValue1;
uchar hightVotage2, lowVotage2, angleValue2;
uchar hightVotage3, lowVotage3, angleValue3;
uchar hightVotage4, lowVotage4, angleValue4;
sbit kai1=P2^0;
sbit kai2=P2^1;
sbit kai3=P2^2;
sbit kai4=P2^3;
sbit steeringGearSignal=P0^0;
sbit steeringGearSigna2=P0^1;
sbit steeringGearSigna3=P0^2;
sbit steeringGearSigna4=P0^3;
bit PWMCTL1=0;
bit PWMCTL2=0;
bit PWMCTL3=0;
bit PWMCTL4=0;
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init()
{
motor=0xff;
TMOD=0x20; //用定时器设置串口波特率
TH1=0xfd; //256-11059200/(32*12*9600)=253 (FD)
TL1=0xfd;
TR1=1;
REN=1; //串口初始化
SM0=0;
SM1=1;
EA=1; //开启总中断
ES=1;
}
/********************************************************************
* 名称 : Timer0Init()
* 功能 : 舵机PWM中断初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Timer0Init()
{
//0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
//0.1ms初始值 FFA3, (12n/11059200=0.1/1000, n=92, X=65535-92=65443 > FFA3)
steeringGearSignal=0;
steeringGearSigna2=0;
steeringGearSigna3=0;
steeringGearSigna4=0;
angleValue1=15; //初始90度
angleValue2=15;
angleValue3=15;
angleValue4=15;
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=0xFF; //给定初值,0.1ms中断
TL0=0xA3;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/********************************************************************
* 名称 : SteeringGear()
* 功能 : 舵机PWM中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGear() interrupt 1
{
TH0=0xFF; //重置计时器初始值
TL0=0xA3;
//舵机信号1
if (PWMCTL1) //正在输出高电平
{
if(++hightVotage1>=angleValue1){//开始输出低电平
PWMCTL1=!PWMCTL1;
lowVotage1=0;
steeringGearSignal=0;
}else
steeringGearSignal=1;
}else{ //正在输出低电平
if(++lowVotage1>=200){//开始输出高电平
PWMCTL1=!PWMCTL1;
hightVotage1=0;
steeringGearSignal=1;
}else
steeringGearSignal=0;
}
//舵机信号2
if (PWMCTL2) //正在输出高电平
{
if(++hightVotage2>=angleValue2){//开始输出低电平
PWMCTL2=!PWMCTL2;
lowVotage2=0;
steeringGearSigna2=0;
}else
steeringGearSigna2=1;
}else{ //正在输出低电平
if(++lowVotage2>=200){//开始输出高电平
PWMCTL2=!PWMCTL2;
hightVotage2=0;
steeringGearSigna2=1;
}else
steeringGearSigna2=0;
}
//舵机信号3
if (PWMCTL3) //正在输出高电平
{
if(++hightVotage3>=angleValue3){//开始输出低电平
PWMCTL3=!PWMCTL3;
lowVotage3=0;
steeringGearSigna3=0;
}else
steeringGearSigna3=1;
}else{ //正在输出低电平
if(++lowVotage3>=200){//开始输出高电平
PWMCTL3=!PWMCTL3;
hightVotage3=0;
steeringGearSigna3=1;
}else
steeringGearSigna3=0;
}
//舵机信号4
if (PWMCTL4) //正在输出高电平
{
if(++hightVotage4>=angleValue4){//开始输出低电平
PWMCTL4=!PWMCTL4;
lowVotage4=0;
steeringGearSigna4=0;
}else
steeringGearSigna4=1;
}else{ //正在输出低电平
if(++lowVotage4>=200){//开始输出高电平
PWMCTL4=!PWMCTL4;
hightVotage4=0;
steeringGearSigna4=1;
}else
steeringGearSigna4=0;
}
}
/********************************************************************
* 名称 :SteeringGear1Up()
* 功能 : 舵机1向上转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGear1Up()
{
if(angleValue1>5)
angleValue1--;
serVal[0]='z'; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 :SteeringGear1Down()
* 功能 : 舵机1向下转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGear1Down()
{
if(angleValue1<25)
angleValue1++;
serVal[0]='z'; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 :SteeringGear2Up()
* 功能 : 舵机2向上转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGear2Up()
{
if(angleValue2>5)
angleValue2--;
serVal[0]='z'; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 :SteeringGear2Down()
* 功能 : 舵机2向下转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGear2Down()
{
if(angleValue2<25)
angleValue2++;
serVal[0]='z'; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 :SteeringGear3Up()
* 功能 : 舵机3向上转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGear3Up()
{
if(angleValue3>5)
angleValue3--;
serVal[0]='z'; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 :SteeringGear3Down()
* 功能 : 舵机3向下转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGear3Down()
{
if(angleValue3<25)
angleValue3++;
serVal[0]='z'; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 :SteeringGear4Up()
* 功能 : 舵机4向上转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGear4Up()
{
if(angleValue4>5)
angleValue4--;
serVal[0]='z'; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 :SteeringGear4Down()
* 功能 : 舵机4向下转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGear4Down()
{
if(angleValue4<25)
angleValue4++;
serVal[0]='z'; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 : ser()
* 功能 : 串口中断接收数据
* 输入 : 无
* 输出 : 无
***********************************************************************/
void ser() interrupt 4
{
RI=0;
serVal[0]=serVal[1];
serVal[1]=SBUF;
}
/*********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
*********************************************************************************/
void main()
{
P1=0x00
Com_Init();//串口初始化
Timer0Init();//舵机初始化
while(1)
{
if(serVal[0]=='A'){
switch(serVal[1])
{
case '0': motor=0x00; break; //停止
case '1': motor=0x0a; break; //前进 00001010
case '2': motor=0x05; break; //左转 00000101
case '3': motor=0x09; break; //后退 00001001
case '4': motor=0x06; break; //右转 00000110
case '5': motor=0x10; break; // 向上 00010000
case '6': motor=0x20; break; //向下 00100000
case '7': motor=0x40; break; //向左 01000000
case '8': motor=0x80; break; //向右 100000000
default:break;
}
}else if(serVal[0]=='B'){
switch(serVal[1])
{
case '1': SteeringGear1Up(); break;
case '2': SteeringGear1Down(); break;
case '3': SteeringGear2Up(); break;
case '4': SteeringGear2Down(); break;
case '5': SteeringGear3Up(); break;
case '6': SteeringGear3Down(); break;
case '7': SteeringGear4Up(); break;
case '8': SteeringGear4Down(); break;
default:break;
}
}else if(serVal[0]=='C'){
switch(serVal[1])
{
case '1':kai1=0; break; //1开
case '2': kai1=1; break; //1关
case '3': kai2 =0; break; //2开
case '4': kai2 =1; break; //2关
case '5': kai3 =0; break; //3开
case '6': kai3=1; break; //3关
case '7': kai4 =0; break; //4开
case '8': kai4 =1; break; //4关
default:break;
}
}
}
}
|
|