云计算百科
云计算领域专业知识百科平台

基于单片机智能自动扫地机器人控制系统Proteus仿真(含全部资料)

    全套资料包含:Proteus仿真源文件+keil C语言源程序+AD原理图+流程图+元器件清单+说明书等

资料下载:

通过网盘分享的文件:资料分享 链接: 百度网盘 请输入提取码 提取码: tgnu


目录

资料下载:

Proteus仿真功能

项目文件资料:

一、Proteus仿真源文件

二、AD原理图文件

二、报告说明书

三、系统流程图

四、Keil c语言程序源代码


项目功能:

系统由单片机+避障+电机驱动模块+电机+按键模块+LED。 功能: 1、可以根据红外自动的躲避障碍 2、LED上显示运行时间 3、通过差速来实现转弯 4、通过一个电机的转动来实现扫地的功能


项目文件:

一、Proteus仿真源文件

二、AD原理图文件

二、报告说明书

三、系统流程图

四、器件清单

2、STC89C51单片机

3、40P芯片座

4、L293D芯片(D7-2-2-5L)

5、16脚IC座

6、30P瓷片电容 *2

7、10uF电解电容

8、100uF电解电容

9、470uF电解电容

10、10K电阻

11、1K电阻*6

12、5v有源蜂鸣器

13、9012三极管*2

14、L7805

15、11.0592M晶振

16、8*8自锁开关

17、104独石电容*4

18、XH2.54-2p直针座*3

19、XH2.54-3p直针座*2

20、6*6*5轻触开关*2

21、E18-D50NK红外传感器*2(线长10cm,帮做好3p端子)

五、Keil c语言程序源代码(部分)

#include <reg52.h> //包含52系统头文件
#include "bst_car.h" //包含bst_car.h智能小车头文件

#define uc unsigned char
#define ui unsigned int //宏定义

uc pwm_val_left =0;//变量定义
uc pwm_val_right =0;
uc push_val_left =9;// 左电机占空比N/20//速度调节变量 0-20。。。0最小,20最大
uc push_val_right=9;// 右电机占空比N/20

bit Right_PWM_ON=1; //右电机PWM开关
bit Left_PWM_ON =1; //左电机PWM开关

bit kaishi,jishi; //开始运行标志位 计时开始标志位
uc sec,min,xiuxi,flag2; //秒、分钟、休息、调时按键定义

//延时函数
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i–) //i=xms即延时约xms毫秒
for(j=112;j>0;j–);
}

//设置时间函数
void settime(void)
{
if(kset==0)//按键按下
{
delay(20);//延时去抖
if((kset==0)&&(flag2==0))//再次判断按键按下并且计时模式为0时
{
FM=0;//蜂鸣器响
shiwu=0;//十五分钟灯亮
sanshi=1;
liushi=1;
xiuxi=15;//计时时间赋值15
flag2++;//计时模式加
while(kset==0);//按键释放
FM=1; //蜂鸣器停止
}
if((kset==0)&&(flag2==1))//按键按下,计时模式为1时
{
FM=0;//蜂鸣器响
shiwu=1;
sanshi=0;//三十分钟灯亮
liushi=1;
xiuxi=30;//计时时间赋值30
flag2++;
while(kset==0);
FM=1; //蜂鸣器停止
}
if((kset==0)&&(flag2==2))
{
FM=0;//蜂鸣器响
shiwu=0;//十五和三十分钟灯亮
sanshi=0;
liushi=1;
xiuxi=45;//计时时间赋值45分钟
flag2++;
while(kset==0);
FM=1; //蜂鸣器停止
}
if((kset==0)&&(flag2==3))
{
FM=0;//蜂鸣器响
shiwu=1;
sanshi=1;
liushi=0;//六十分钟灯亮
xiuxi=60;//计时时间赋值60
flag2++;
while(kset==0);
FM=1; //蜂鸣器停止
}
if((kset==0)&&(flag2==4))
{
FM=0;//蜂鸣器响
shiwu=0;//十五和60分钟灯亮
sanshi=1;
liushi=0;
xiuxi=75;//计时时间赋值75分钟
flag2++;
while(kset==0);
FM=1; //蜂鸣器停止
}
if((kset==0)&&(flag2==5))
{
FM=0;//蜂鸣器响
shiwu=1;
sanshi=0;
liushi=0;//三十和六十灯亮
xiuxi=90;//计时时间赋值90分钟
flag2=0;
while(kset==0);
FM=1; //蜂鸣器停止
}
}
}

//停转
void stop(void)
{
Right_moto_Stop ; //停转
Left_moto_Stop ; //
}

//前进
void run(void)
{
//push_val_left=5; //速度调节变量 0-20。。。0最小,20最大
//push_val_right=5;
Left_moto_go ; //左电机往前走
Right_moto_go ; //右电机往前走
}

//后退
void backrun(void)
{
Left_moto_back; //左电机往后走
Right_moto_back; //右电机往后走
}

//向右原地打转(掉头)
void rightspin(void)
{
//push_val_left=5;
//push_val_right=5;
Left_moto_go ; //左电机往前走
Right_moto_back ; //右电机往前走
}

//向左原地打转(掉头)
void leftspin(void)
{
//push_val_left=5;
//push_val_right=5;
Right_moto_go ; //左电机往前走
Left_moto_back ; //右电机往前走
}
/************************************************************************/
// PWM调制电机转速

// 左电机调速
/*调节push_val_left的值改变电机转速,占空比*/
void pwm_out_left_moto(void)
{
if(Left_PWM_ON)
{
if(pwm_val_left<=push_val_left)
{
EN1=1;
}
else
{
EN1=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
EN1=0; //若未开启PWM则EN1=0 左电机 停止
}
}
/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_PWM_ON)
{
if(pwm_val_right<=push_val_right)//20ms内电平信号 111 111 0000 0000 0000 00
{
EN2=1; //占空比6:20
}
else
{
EN2=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
EN2=0; //若未开启PWM则EN2=0 右电机 停止
}
}

//TIMER0中断服务子函数产生PWM信号
void timer0()interrupt 1 using 2
{
ui m;
TH0=0XFC; //1Ms定时
TL0=0X66;
m++;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
if(m==100&&jishi==1)//加到1000次为1s (把100改成1000,还有往下4行的10改成60,就是正常的秒了,现在是15分钟其实就走了15秒,为了方便演示)
{
m=0; //清零
sec++; //秒加
if(sec==10) //计时到60秒
{
sec=0; //秒清零
min++; //分加
if(min>=xiuxi) //时间是否到达设定时间
{
min=0;
kaishi=0;//开始暂停的变量关
EN1=0;
EN2=0; //两个电机都停止一下
jishi=0; //计时变量也关闭
FS=1;//风扇关
TR0=0;//开关pwm定时器中断关
}
}
}
}

void keyscan(void) //开始按键扫描函数
{
if(K4==0)//判断是否有按下信号
{
delay(20); //延时10ms
if(K4==0)//再次判断是否按下
{
FM=0; //蜂鸣器响
while(K4==0);//判断是否松开按键
delay(200);//延时200ms等待手拿走
TR0=!TR0;//开关pwm定时器中断
kaishi=!kaishi;//开始暂停的变量取反
EN1=0;
EN2=0; //两个电机都停止一下
jishi=!jishi;
FS=!FS;//风扇取反
sec=0;//秒清零
min=0;//分钟清零
FM=1; //蜂鸣器停止
}
}
}

//主函数
void main(void)
{
TMOD=0X01;
TH0= 0XFC; //1ms定时
TL0= 0X66;
TR0= 0;
ET0= 1;
EA = 1; //开总中断
kaishi=0;//开始暂停的变量 为0
shiwu=0;
sanshi=0; //默认开机45分钟
liushi=1;
xiuxi=45;
flag2=0; //模式0
jishi=0; //计时为0
FS=1; //关闭风扇
kset=1; //设置时间按键拉高;

while(1)//无限循环
{
keyscan();//按键启动停止检测
settime();//设置时间检测
//有信号为0 没有信号为1
if(Left_2_led==1&&Right_2_led==1&&kaishi==1)
{
run(); //调用前进函数
}

if(Left_2_led==0&&Right_2_led==1&&kaishi==1) //左边检测到障碍物
{
stop();
delay(300);
rightspin();//调用小车右旋转函数
delay(300);//旋转450毫秒
}
if(Right_2_led==0&&Left_2_led==1&&kaishi==1)//右边检测到障碍物
{
stop();
delay(300);
leftspin(); //调用小车左转函数
delay(300);//旋转450毫秒
}
if(Right_2_led==0&&Left_2_led==0&&kaishi==1)//两边传感器同时检测到障碍物
{
stop();
delay(200);
backrun();//调用电机后退函数
delay(300);//后退450毫秒

}
}
}

六、全套资料包含

七:项目资源获取

需要完整的资料可以点击下面的名片关注,回复“资料”!

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

赞(0)
未经允许不得转载:网硕互联帮助中心 » 基于单片机智能自动扫地机器人控制系统Proteus仿真(含全部资料)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!