标题:
单片机编程玩具机器人设计 Proteus仿真加源程序
[打印本页]
作者:
51黑电子happy
时间:
2017-3-30 14:50
标题:
单片机编程玩具机器人设计 Proteus仿真加源程序
51单片机做的编程玩具机器人仿真原理图(proteus工程文件可到本帖附件下载):
0.png
(37.27 KB, 下载次数: 147)
下载附件
2017-3-30 02:47 上传
机器人的51单片机源程序:
//----------------------------------------------------------------------------------------------------------------------------------
// 程序名:JQR12-1.c
// 程序功能:编程玩具机器人
// --------------------------------------------------------------------------------------------------------------------------------
#include<reg51.h> //头文件
sbit IRIN=P3^2; //定义红外IR信号输入位
sbit SLED=P3^1 ; //定义工作指示灯接口
sbit YJ=P3^0 ; //定义眼睛闪动LED接口
unsigned char IRDATA[7]; //定义数组,存储红外接收到的数据
void delay(unsigned char x); //延时约x*0.1ms 函数
void delay10ms(unsigned int count); //延时函数
void XQZ() ; //向前走函数
void DT(); //倒退走函数
void ZZ(); //向前左转函数
void ZZ_Z(); //向前左转函数
void YZ(); //向前右转函数
void YZ_Z(); //向前右转函数
void T_ZZ(); //向左瞄准函数
void T_YZ(); //向右瞄准函数
void TW(); //跳舞函数
void FS(); //发射函数
void LFS(); //连续发射函数
void SD_LED( ); //工作灯函数
void SD_JQR( ); //眼睛闪动函数
void IR_ZX(); //遥控执行函数
//-------------------------------------- 主函数 --------------------------------------
void main() //主函数
{
EA=1; //允许总中断
EX0=1; //允许外部中断INT0中断
IT0=1; //外部中断INT0采用脉冲触发方式
SD_LED( ); //调用工作灯函数
{
IRIN=1; //IR 输入位设置为高电平
P2=0x00;
while(1); //无限循环
}
}
//------------------------------------ 延时函数 ------------------------------------
void delay(unsigned char x) //延时约x*0.1ms
{
unsigned char i;
while(x--)
{for(i=0;i<10;i++){}}
}
//------------------------------------- 中断解码函数 -----------------------------------
void IR_IN() interrupt 0 using 0 //外部中断INT0函数
{
unsigned char j,k,n=0; //定义变量,且n=0
EX0=0; //暂时先关中断
delay(20); //延时0.10ms*20=2ms
if(IRIN==1) //如果IRIN出现高电平,是干扰信号
{
EX0=1;
return; //返回
}
while(!IRIN){delay(1);} //避开9ms前导低电平信
for(j=0;j<4;j++) //一共有4组数据
{
for(k=0;k<8;k++) //每组数据有8位
{
while(IRIN){delay(1);} // 避开4.5ms高电平
while(!IRIN){delay(1);}
// 开始接收数据
while(IRIN)
{
delay(1); //延时0.1ms
n++; //每过0.1ms时n就加1
if(n>=30) //如果超过30,放弃
{
EX0=1;
return;} //返回
}
IRDATA[j]=IRDATA[j]>>1; //右移1位
if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}
n=0; //n清0
}
}
//检查接收的数据和数据反码是否相反
if(IRDATA[2]!=~IRDATA[3]) //判断数据码和数据反码是不是相反
{ //否则就放弃
EX0=1;
return;
}
// 遥控执行
else
IR_ZX();
EX0=1; //开中断
}
//-------------------------------------- 延时函数 ------------------------------------------
void delay10ms(unsigned int count) //延时函数
{
unsigned int i,j,k;
for(i=0; i<count; i++)
for(j=0; j<10; j++)
for(k=0; k<120; k++);
}
//------------------------------------ 向前走函数 ----------------------------------------
void XQZ() //向前走函数
{
P2=0x01; //左腿驱动电机正转,机器人向前迈左腿
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
P2=0x04; //右腿驱动电机正转,机器人向前迈右腿
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
P2=0x01; //左腿驱动电机正转,机器人向前迈左腿
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
P2=0x04; //右腿驱动电机正转,机器人向前迈右腿
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
}
//------------------------------------ 倒退走函数 ---------------------------------------
void DT() //倒退函数
{
P2=0x08; //右腿驱动电机反转,机器人右腿后退
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
P2=0x02; //左腿驱动电机反转,机器人左腿后退
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
P2=0x08; //右腿驱动电机反转,机器人右腿后退
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
P2=0x02; //左腿驱动电机反转,机器人左腿后退
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
}
//------------------------------------ 向前左转函数 -------------------------------------------------
void ZZ() //向前左转函数
{
P2=0x06; //左腿驱动电机反转,右腿驱动电机正转
delay10ms(50); //延时0.5s
P2=0x00; //停止
}
//--------------------------------- 向前左转函数 -------------------------------------------
void ZZ_Z() //向前左转函数
{
P2=0x06; //左腿驱动电机反转,右腿驱动电机正转
delay10ms(200); //延时2s
P2=0x00; //停止
}
//--------------------------------- 向前右转函数 ------------------------------------------------
void YZ() //向前右转函数
{
P2=0x09; //右腿驱动电机反转,左腿驱动电机正转
delay10ms(50); //延时0.5s
P2=0x00; //停止
}
//---------------------------------- 向前右转函数 --------------------------------------------------
void YZ_Z() //向前右转函数
{
P2=0x09; //右腿驱动电机反转,左腿驱动电机正转
delay10ms(200); //延时2s
P2=0x00; //停止
}
//---------------------------------- 向左瞄准函数 -------------------------------------------------
void T_ZZ() //头左转
{
P2=0x10; //头驱动电机正转
delay10ms(30); //延时0.3s
P2=0x00; //停止
}
//------------------------------------- 向右瞄准函数 -----------------------------------------------
void T_YZ() //头右转
{
P2=0x20; //头驱动电机反转
delay10ms(30); //延时0.3s
P2=0x00; //停止
}
//------------------------------------- 跳舞函数 ----------------------------------------------------
void TW() //跳舞
{
SD_JQR();
XQZ();
ZZ_Z();
DT();
YZ_Z();
XQZ();
DT();
SD_JQR();
}
//----------------------------------- 发射函数 ------------------------------------------------------
void FS() // 发射
{
P2=0x40; //加速驱动电机正转
delay10ms(100); //延时1s
P2=0x80; //发射驱动电机正转
delay10ms(50); //延时0.5s
P2=0x00; //停止
}
//----------------------------------- 连续发射函数 ---------------------------------------------
void LFS() // 连续发射
{
P2=0x40; //加速驱动电机正转
delay10ms(100); //延时1s
P2=0x80; //发射驱动电机正转
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
P2=0x40; //加速驱动电机正转
delay10ms(100); //延时1s
P2=0x80; //发射驱动电机正转
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
P2=0x40; //加速驱动电机正转
delay10ms(100); //延时1s
P2=0x80; //发射驱动电机正转
delay10ms(50); //延时0.5s
P2=0x00; //停止
delay10ms(100); //延时1s
}
//--------------------------------------- 工作灯函数 -------------------------------------------------
void SD_LED( ) //LED闪动
{
int y,i; //变量声明
for(y=0;y<=30;y++) //循环30次
{
SLED=~SLED; //反相输出
for(i=0;i<=30000;i++); //延时
}
SLED=1;
}
//---------------------------------------- 眼睛闪动函数 ---------------------------------------------
void SD_JQR( ) //LED闪动
{
int y,i; //变量声明
for(y=0;y<=4;y++) //循环30次
{
YJ=~YJ; //反相输出
for(i=0;i<=30000;i++); //延时
}
YJ=1;
}
//---------------------------------------- 遥控执行函数 -------------------------------------------------
void IR_ZX() //遥控执行函数
{
if(IRDATA[2]==0x01) //向前走
{
SD_JQR();
XQZ();
XQZ();
return;
}
else if(IRDATA[2]==0x02) //倒退
{
SD_JQR();
DT();
DT();
return;
}
else if(IRDATA[2]==0x03) //向前左转
{
SD_JQR();
ZZ();
return;
}
else if(IRDATA[2]==0x04) //向前右转
{
SD_JQR();
YZ();
return;
}
else if(IRDATA[2]==0x05) //跳舞
{
SD_JQR();
TW();
return;
}
else if(IRDATA[2]==0x06) //向左瞄准
{
SD_JQR();
T_ZZ();
return;
}
else if(IRDATA[2]==0x07) //向右瞄准
{
SD_JQR();
T_YZ();
return;
}
else if(IRDATA[2]==0x08) //发射
{
SD_JQR();
FS();
return;
}
else if(IRDATA[2]==0x09) //连续发射
{
SD_JQR();
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
(68.83 KB, 下载次数: 151)
下载附件
2017-3-30 02:53 上传
该系列源码包含有很多非常经典,代码风格十分规范,而且注释详细的单片机例程,还带仿真,对于MCU学习特别是初学者是很有帮助的,全部源码下载(共25个项目):
http://www.51hei.com/bbs/dpj-79328-1.html
本例程下载(含proteus仿真工程文件与源码):
单片机编程玩具机器人设计.rar
(72.33 KB, 下载次数: 61)
2017-3-30 02:52 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1