注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hellorobot

全民机器人,零起步实现你童年的梦想

 
 
 

日志

 
 

红外避障与红外遥控例子  

2013-07-20 23:55:12|  分类: 51单片机与机器人 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <STC12C5A60S2.h>
#define uchar unsigned char
uchar data IRcode[4]; //定义一个4字节的数组用来存储代码
uchar CodeTemp; //编码字节缓存变量
uchar i,j,k,aa; //延时用的循环变量
sbit IR=P3^2; //接收头OUT端直接连P3.2(INT0)
sbit LEDUP = P3^4; //避障朝上
sbit LED = P3^3; //避障朝前(容易受到左右腿的干扰,不加)
sbit LEDL = P3^6; //避障朝左
sbit LEDR = P3^5; //避障朝右

/**************************延时0.9ms子程序**********************/
void Delay0_9ms(void)
{
uchar i,j;
for(i=12;i>0;i--)
for(j=180;j>0;j--) ;
}
/***************************延时1ms子程序**********************/
void Delay1ms(void)
{
uchar i,j;
for(i=12;i>0;i--)
for(j=230;j>0;j--) ;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{
uchar i,j;
for(i=60;i>0;i--)
for(j=225;j>0;j--) ;
}
/**************************** 延时子程序 ************************/
void Delay(void)
{
uchar i,j,k;
for(i=60;i>0;i--)
for(j=200;j>0;j--)
for(k=10;k>0;k--) ;
}

void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/************************串口发送***********************************/
void UART_T (uchar UART_data)
{
SBUF = UART_data; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
void UART_TC (unsigned char *str)
{
while(*str != '\0')
{
UART_T(*str);
*str++;
}
*str = 0;
}
/************************中断0解码服务子程序**********************/
void int0(void) interrupt 0 using 2
{
EA=0;
for(k=0;k<10;k++) //不同型号请改成5/10
{
Delay0_9ms();
if (IR==1) //如果0.9ms后IRsignal=1,说明不是引导码
{
k=10;break;
}
else if(k==9) //如果持续了10×0.9ms=9ms的低电平,说明是引导码
{
while(IR==0);
Delay4_5ms(); //跳过持续4.5ms的高电平
for(i=0;i<4;i++) //分别读取4个字节
{
for(j=1;j<=8;j++) //每个字节8个bit的判断
{
while(IR==0); //等待上升沿
Delay0_9ms(); //从上升沿那一时刻开始延时0.9ms,再判断IRsignal
if(IR==1) //如果IRsignal是"1",则向右移入一位"1"
{
Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8) CodeTemp=CodeTemp>>1;
}
else
if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
}
IRcode[i]=CodeTemp;
CodeTemp=0;
}
Delay();
Delay();
}
aa=1;
}
EA=1;
}
/***********************单步动作指令*********************/ 动作组指令需要执行完一条才能执行下一条,实时性不好,这里不用
void forward (){ //前进

UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1569#7P886#8P982#10P1500#11P1131#12P1001#13P1500#14P2050#15P1880#17P1569#18P1830#19P1914#21P1500#22P2050#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1369#7P886#8P982#10P1500#11P1131#12P1001#13P1700#14P2050#15P1880#17P1569#18P1830#19P1914#21P1700#22P2050#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1369#7P1086#8P982#10P1500#11P1131#12P1001#13P1700#14P1850#15P1880#17P1569#18P1830#19P1914#21P1700#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P931#4P1017#6P1569#7P1086#8P982#10P1500#11P931#12P1001#13P1500#14P1850#15P1880#17P1569#18P2030#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1300#3P931#4P1017#6P1569#7P1086#8P982#10P1300#11P931#12P1001#13P1500#14P1850#15P1880#17P1769#18P2030#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1300#3P1131#4P1017#6P1569#7P1086#8P982#10P1300#11P1131#12P1001#13P1500#14P1850#15P1880#17P1769#18P1830#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
}



void back (){ //后退

UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1569#7P886#8P982#10P1500#11P1131#12P1001#13P1500#14P2050#15P1880#17P1569#18P1830#19P1914#21P1500#22P2050#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1769#7P886#8P982#10P1500#11P1131#12P1001#13P1300#14P2050#15P1880#17P1569#18P1830#19P1914#21P1300#22P2050#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1769#7P1086#8P982#10P1500#11P1131#12P1001#13P1300#14P1850#15P1880#17P1569#18P1830#19P1914#21P1300#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P931#4P1017#6P1569#7P1086#8P982#10P1500#11P931#12P1001#13P1500#14P1850#15P1880#17P1569#18P2030#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1700#3P931#4P1017#6P1569#7P1086#8P982#10P1700#11P931#12P1001#13P1500#14P1850#15P1880#17P1369#18P2030#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1700#3P1131#4P1017#6P1569#7P1086#8P982#10P1700#11P1131#12P1001#13P1500#14P1850#15P1880#17P1369#18P1830#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
}

void left (){ //左转

UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1569#7P886#8P982#10P1500#11P1131#12P1001#13P1500#14P2050#15P1880#17P1569#18P1830#19P1914#21P1500#22P2050#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1369#7P886#8P982#10P1500#11P1131#12P1001#13P1300#14P2050#15P1880#17P1569#18P1830#19P1914#21P1300#22P2050#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1369#7P1086#8P982#10P1500#11P1131#12P1001#13P1300#14P1850#15P1880#17P1569#18P1830#19P1914#21P1300#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P931#4P1017#6P1569#7P1086#8P982#10P1500#11P931#12P1001#13P1500#14P1850#15P1880#17P1569#18P2030#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1300#3P931#4P1017#6P1569#7P1086#8P982#10P1300#11P931#12P1001#13P1500#14P1850#15P1880#17P1369#18P2030#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1300#3P1131#4P1017#6P1569#7P1086#8P982#10P1300#11P1131#12P1001#13P1500#14P1850#15P1880#17P1369#18P1830#19P1914#21P1500#22P1850#23P1914T500\r\n");

}

void right (){ //右转

UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1569#7P886#8P982#10P1500#11P1131#12P1001#13P1500#14P2050#15P1880#17P1569#18P1830#19P1914#21P1500#22P2050#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1769#7P886#8P982#10P1500#11P1131#12P1001#13P1700#14P2050#15P1880#17P1569#18P1830#19P1914#21P1700#22P2050#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1769#7P1086#8P982#10P1500#11P1131#12P1001#13P1700#14P1850#15P1880#17P1569#18P1830#19P1914#21P1700#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P931#4P1017#6P1569#7P1086#8P982#10P1500#11P931#12P1001#13P1500#14P1850#15P1880#17P1569#18P2030#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1700#3P931#4P1017#6P1569#7P1086#8P982#10P1700#11P931#12P1001#13P1500#14P1850#15P1880#17P1769#18P2030#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1700#3P1131#4P1017#6P1569#7P1086#8P982#10P1700#11P1131#12P1001#13P1500#14P1850#15P1880#17P1769#18P1830#19P1914#21P1500#22P1850#23P1914T500\r\n");
DELAY_MS (200);


}
void DD (){ //待定

UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1569#7P1086#8P982#10P1500#11P1131#12P1001#13P1500#14P1900#15P1880#17P1569#18P1880#19P1914#21P1500#22P1900#23P1914T300\r\n");
DELAY_MS (200);

}
void SLEEP (){ //休息
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P741#4P1017#6P1569#7P741#8P982#10P1500#11P776#12P1001#13P1500#14P2293#15P1880#17P1569#18P2293#19P1914#21P1500#22P2293#23P1914T500\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P672#4P603#6P1569#7P638#8P569#10P1500#11P707#12P638#13P1500#14P2362#15P2397#17P1569#18P2362#19P2397#21P1500#22P2397#23P2328T500\r\n");
DELAY_MS (200);

}







/***********************串口初始化程序*********************/
void initUart(void)
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
/**************************主程序*************************/
void main()
{
uchar a;
initUart();
IT0=1; //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
EX0=1; //外部中断INT0开, (1:开, 0:关 )
EA=1; //开所有中断
CodeTemp=0; //初始化红外编码字节缓存变量
Delay();
UART_TC("#1P1500#2P1500#3P1131#4P1017#6P1569#7P1086#8P982#10P1500#11P1131#12P1001#13P1500#14P1900#15P1880#17P1569#18P1880#19P1914#21P1500#22P1900#23P1914T300\r\n");
while(1)
{if(LED==0){
DELAY_MS (300); //参照视频,当手在六足面前前后移动,时间不超过300ms六足就会前进,超过300ms就后退
if(LED==0){

back ();
DELAY_MS (100);


//while(LED==0); //可以把双斜杠去掉试试效果
}
else{
forward ();

DELAY_MS (100);
}
}
if(LEDUP==0){
DELAY_MS (10);
if(LEDUP==0){
SLEEP ();

//while(LEDL==0);


DELAY_MS (100);


}
}
if(LEDL==0){
DELAY_MS (10);
if(LEDL==0){
left ();

//while(LEDL==0);


DELAY_MS (100);


}
}
if(LEDR==0){
DELAY_MS (10);
if(LEDR==0){
right ();
//while(LEDR==0);


DELAY_MS (100);


}
}
if(aa==1)
{
for(a=0;a<2;a++) {
if(IRcode[a]==0xff){
for(a=2;a<3;a++){

switch (IRcode[a]){



case 0x45:
DD();
break;
case 0x0C:
SLEEP ();
break;
case 0x40:
forward();
break;
case 0x19:
back();
break;
case 0x07:
left();
break;
case 0x09:
right();
break;
default:
break;

}

}
}



}

Delay();
aa=0;
}
}
}

  评论这张
 
阅读(1195)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017