2011-11-07
之前路由连接51板串口发送字符的测试不成功,想起liuhuiviking的博文提到要串接一个1k的电阻,电阻这个小东西啊,几分钱一只,但不知道哪里有卖,只有求助万能的淘宝。收到电阻之后马上接起来,发现还是不行,后来尝试了好多方法,终于在一块6块钱的最小系统板上测试成功,而且是不用串接电阻的。之前失败的原因,可能是我那块30块的开发板上面集成了USB-TTL,而且USB兼供电,可能会对串口接收产生冲突吧。
买电阻的时候顺便也买了一个15块钱的9g舵机,经过一轮查找资料,编写代码和测试,终于完成了舵机的51程序,在我那块30元的开发板P0口测试成功(P0有1k上拉电阻),但是在我那块6元的最小板死活都不行,P0, P1, P3都试过,1k,5K都试过。最后无意中改用电池供电的时候居然成功了(P0口上拉5k电阻)!估计是6元的最小板用料比较省,电源的滤波不行,而舵机对电源的要求比较高,所以导致用USB线供电时怎么都不行。
到此51最小系统的程序就全部测试完,准备开始组装小车啦。
源代码如下:
/*预处理命令*/
#include <reg52.h> //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
#define motor P1
/***L298N接法
IN1 > P10
IN2 > P11
IN3 > P12
IN4 > P13***/
uchar serVal, hvc, lvc, angleValue;
sbit steeringGearSignal=P0^0;
bit PWMCTL=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;
angleValue=15;//初始90度
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;
if (PWMCTL)//正在输出高电平
{
if(++hvc>=angleValue){//开始输出低电平
PWMCTL=!PWMCTL;
lvc=0;
steeringGearSignal=0;
}else
steeringGearSignal=1;
}else{//正在输出低电平
if(++lvc>=200){//开始输出高电平
PWMCTL=!PWMCTL;
hvc=0;
steeringGearSignal=1;
}else
steeringGearSignal=0;
}
}
/********************************************************************
* 名称 :SteeringGearUp()
* 功能 : 舵机向上转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGearUp()
{
if(angleValue>5)
angleValue--;
serVal=0xFF; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 :SteeringGearDown()
* 功能 : 舵机向下转。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SteeringGearDown()
{
if(angleValue<25)
angleValue++;
serVal=0xFF; //清除缓存,不然会一下子调到尽头
}
/********************************************************************
* 名称 : ser()
* 功能 : 串口中断接收数据
* 输入 : 无
* 输出 : 无
***********************************************************************/
void ser() interrupt 4
{
RI=0;
serVal=SBUF;
}
/*********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
*********************************************************************************/
void main()
{
Com_Init();//串口初始化
Timer0Init();//舵机初始化
while(1)
{
switch(serVal-48) //ASCII字符码
{
case 0: motor=0xff; break; //11111111,停止
case 1: motor=0xf5; break; //11110101,前进
case 2: motor=0xf7; break; //11110111,左转
case 3: motor=0xfa; break; //11111010,后退
case 4: motor=0xfd; break; //11111101,右转
case 5: SteeringGearUp(); break;
case 6: SteeringGearDown(); break;
default:break;
}
}
}