循迹小车往返

仙人球 2012-04-19 08:27:51
1、 实现目标:
掌握自动往返机器人工作原理;
掌握PWM调速基本原理;
掌握单片机定时器用于时间显示的方法;
熟悉自动往返机器人各模块接线端子的作用
利用对管对黑线和白线所产生不同效果,来作为信号实现小车的循迹、、对黑线的计数和自动往返功能。
具体要求:
1、从起始位开始显示0000;
2、到第一条黑线开始计黑线数,直至小车返回起始位置。
3、PWM调速:第二条黑线到第四条黑线之间低速行驶(占空比为70%),其余段全速行驶。
2、 硬件选择
小车采用三五个对管(前后各两个是循迹,一个计数),两个比较器,一个稳压模块,一个单片机最小系统,一个静态显示,一个驱动模块。
对管采集信号经过比较器输入给单片机P1口,单片机根据输入信号来判断,用P2口来发出信号控制小车的状态。

3、 软件


...全文
414 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
仙人球 2012-04-21
  • 打赏
  • 举报
回复
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit s1=P1^6; // s1=P1^4;
sbit s2=P1^7; // s2=P1^5;
sbit s3=P1^4; // s3=P1^6;
sbit s4=P1^5; // s4=P1^7;
void car_controlq();
void car_controlh();
void go();
void turn_right();
void turn_left();
void stop();
void back_go();
void back_right();
void back_left();
void dis(uint i);////////
//void delay_ms(uint t);
void system_zd();////////
uchar code LED_Val[] = {0xC0,0xF9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//0-9
uchar data num[4];
uchar data led_point[4]={0xfe,0xfd,0xfb,0xf7};
void Bcd(uint bcd_value);
uint flag;
uint flage;
void main()
{
// system_pwm();
while(1)
{
car_controlq();
}
}
/**************************************
文件名: 小车前进
**************************************/
void car_controlq()
{
dis(0);
if(s1==0&&s2==0)
{
go();
}
if(s1==1&&s2==0)
{
turn_left();
}
if(s1==0&&s2==1)
{
turn_right();
}
if(s1==1&&s2==1)
{
flag++;
system_zd();
/*
switch(flag)
{
// case 0: go();break;
case 1: dis(1);go();break;
case 2: dis(2);go();break;
case 3: dis(3);go();break;
case 4: dis(4);go();break;
case 5: dis(5);go();if(s3==1&s4==1);{car_controlh();}break;
}
*/
}
}
/***************************************
文件名: 小车后退
***************************************/
void car_controlh()
{
if(s4==0&&s3==0)
{
back_go();
}
if(s4==1&&s3==0)
{
back_right();
}
if(s4==0&&s3==1)
{
back_left();
}
if(s4==1&s3==1)
{
flage++;
system_zd();
/*
switch(flage)
{
case 2: dis(6);go();break;
case 3: dis(7);go();break;
case 4: dis(8);go();break;
case 5: dis(9);go();break;
case 6: dis(10);delay_ms(2000);stop();break;
}
*/
}
}
/***************************************
文件名: 显示函数
***************************************/
void dis(uint i)
{
uchar z;
Bcd(i); // 分离disp_value//
for(z=0;z<4;z++)
{
SBUF=LED_Val[num[z]]; // 将数据写入发送缓冲器SBUF//
while(TI==0); // 等待发送完毕//
TI=0; // 中断标志位清零//
}
}
/*
{
uchar z;
Bcd(i);
for(z=0;z<4;z++)
{
P0=LED_Val[num[z]];
P2=led_point[z];
// delay_ms(4);
P2=0XFF;
P0=0XFF;
}
}
*/
/**************************************
文件名: 数据分离
**************************************/
void Bcd(uint bcd_value)
{
num[0]=bcd_value/1000;
num[1]=(bcd_value%1000)/100;
num[2]=((bcd_value%1000)%100)/10;
num[3]=((bcd_value%1000)%100)%10;
}
/*************************************
文件名: go函数
*************************************/
///////////////////////正向前进
void go()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
void turn_right()
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
void turn_left()
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
/////////////////////反向前进
void back_go()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
void back_right()
{
IN1=0;
IN2=1;
IN3=0;
IN4=0;
}
void back_left()
{
IN1=0;
IN2=0;
IN3=0;
IN4=1;
}
////////////////////////停止
void stop()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}

/**************************************
文件名: 延时函数
**************************************/
/*
void delay_ms(uint t)
{
uchar q
while(t--)
{
for(q=0;q<125;q++)
{;}
}
}
*/
/**************************************
文件名: 初始化
**************************************/
void system_zd()
{
EA=1;
IT0=1;
EX0=1;
}
/**************************************
文件名: 中断0
**************************************/
void zhongduan0() interrupt 0
{
switch(flag)
{
// case 0: go();break;
case 1: dis(1);go();break;
case 2: dis(2);go();break;
case 3: dis(3);go();break;
case 4: dis(4);go();break;
case 5: dis(5);go();if(s3==1&s4==1);{car_controlh();}break;
}
//////////////////////////////////////////////////////////////////////////////////
switch(flage)
{
case 2: dis(6);go();break;
case 3: dis(7);go();break;
case 4: dis(8);go();break;
case 5: dis(9);go();break;
case 6: dis(10);/*delay_ms(2000);*/stop();break;
}
}

各位大侠看看.是不是中断进不去啊?????
chenlunju 2012-04-20
  • 打赏
  • 举报
回复
这个我原来做个。用51单片机就可以。
liheng0509 2012-04-20
  • 打赏
  • 举报
回复
可以再项目中作为参考

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧