南昌航空大学学士学位论文
鉴于使单片机信号接收更加稳定,特别在解码后对信号进行放大,以便信号能够
正常被识别。电路如图3.7所示。
图 3.7 无线接收模块电路图
表 3.2 单片机 I/O 口分配 单片机 I/O 口分配 P1.0 P1.1 P1.2 P1.3 P2.2 P2.6 P2.7 经放大的解码芯片 PT2272 信号通道 D0 经放大的解码芯片 PT2272 信号通道 D1 经放大的解码芯片 PT2272 信号通道 D2 经放大的解码芯片 PT2272 信号通道 D3 转动舵机控制线 竖直舵机控制线 水平舵机控制线
为了方便对机器人进行控制,在无线接收模块中使用C51语言进行编程,程序头
文件如下:
#include
#define uchar unsigned char
#define uint unsigned int
uint a,b,c,d,order;
/*a,b,c,d为中间变量,order指示中断顺序*/
第 24页共 32页
南昌航空大学学士学位论文
/*以下定义输出管脚*/
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3; //4位指令
sbit P22=P2^2; //转动舵机控制线
sbit P26=P2^6; //竖直舵机控制线
sbit P27=P2^7; //水平舵机控制线
因为舵机的控制信号是PWM波,89S51有16位内部计数器,本设计就用它来产生周
期20ms的脉冲信号,并且根据需要改变输出脉宽。程序如下:
void timer0(void) interrupt 1 using 1
{
P26=!P26; /*输出取反*/
c=20000-c; /*20000代表20 ms,为一个周期的时间*/
TH0=-(c/256); TL0=-(c%6); /*重新定义计数初值*/
}
/*定时器1,控制转动舵机控制线,输出引脚为P22 */
void timer1(void) interrupt 3 using 1
{
switch(order) /*判断是控制竖直舵机或是控制水平舵机*/
{
case(0):
P27=!P27;
break;
case(1):
P22=!P22;
break;
}
d=20000-d;
TH1=-(d/256); TL1=-(d%6);
}
第 25页共 32页
南昌航空大学学士学位论文
单片机的晶振频率为12M,一个时钟周期为12
数器每隔1/1000 ms计一次数。以计数器1为例,先设定脉宽的初始值,程序中初始为
1.5ms,设定计数器计数初始值为c,并置输出p22为高位。当计数结束时,触发计数
器溢出中断函数,就是void timer0(void) interrupt 1 using1 ,在子函数中,改
变输出p22为反相(此时跳为低位),在用20000(代表20ms周期)减去高位用的时间c,
就是本周期中低位的时间,c=20000-c,,直到定时器再次产生溢出中断,重复上一过
程。
程序流程图如图3.8所示。
程序初始化
个晶振周期,正好是1/1000 ms,计
P2 口接收无线模块指令
指令=?
动作 1# 动作 2# …… 动作 14# 动作 15#
单片机输出响应 PWM 控制舵机
图3.8 无线接收模块流程图
把机器人的每个动作,即前进,后退,左转和右转封装成一个子函数,以便在主
程序中进行调用。下面以前进子函数为例:
void forward(int a0,int a1,int b0,int b1) //形参传递机器人前进距离
{
P26=1; //置竖直控制信号为高电平
a=a0;
c=a;
第 26页共 32页
南昌航空大学学士学位论文
TH0=-(a/256);TL0=-(a%6);
TR0=1; //启动定时器1
delay50ms(25); //延时,通过定时器不断提供控制信号
TR0=0; //关闭定时器1
P27=1; //置水平控制信号为高电平
order=0; //置控制信号顺序 b=b0; d=b; TH1=-(b/256);TL1=-(b%6); TR1=1; delay50ms(25); TR1=0; P26=1;
a=a1; c=a; TH0=-(a/256);TL0=-(a%6); TR0=1; delay50ms(25); TR0=0; P27=1;
order=0; b=b1; d=b; TH1=-(b/256);TL1=-(b%6); TR1=1; delay50ms(25); TR1=0; }
//启动定时器2 //关闭定时器2 第 27页共 32页
南昌航空大学学士学位论文
主程序即识别由无线发射模块传送过来的指令:
main()
{
EA=1;
ET0=1;ET1=1;
EX0=1;EX1=1; //程序初始化
TMOD=0x11; //设初值
PX0=0;PX1=0;PT1=1;PT0=1; //设定中断优先级
while(1)
{
If (P10==1&&P11==1&&P12==1&&P13==1) //默认指令
{stop(960,2700,2200);} //调用子函数
else if(P10==1&&P11==0&&P12==0&&P13==0) //前进指令
{forward(2000,960,900,2700);}
else if(P10==0&&P11==1&&P12==0&&P13==0) //左转指令
{left(2000,960,1700,2200);}
?
?
else if(P10==0&&P11==1&&P12==1&&P13==0) //右转指令
{right(2000,960,2040,2200);}
else
{stop(960,2700,2200);}
}
}
第 28页共 32页
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库六足爬行机器人设计(7)在线全文阅读。
相关推荐: