首页资源分类嵌入式处理器51内核 > 简易光控制小车论文

简易光控制小车论文

已有 445010个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:光控制STC89C52单片机

    分    享:

    文档简介

    硬件、软件全部都贴出来了

    文档预览

    简易光控制智能小车设计报告 目录 摘要 本系统由51单片机最小系统主控制电路,L298N驱动电路,7805稳压电源电路,光源检测电路,红外信号检测电路,声光报警电路,电磁继电器电路,LED显示电路组成。能够控制小车自动寻找光源,并到达指定车库停车,途中经过A、B、C线发出声光报警并按照指令执行停车并放下硬币的动作。 The system consists of 51 smallest single-chip system main control circuit, L298N driver circuit ,7805 power supply circuit, a light detection circuit, the infrared signal detection circuit, sound and light alarm circuit, electromagnetic relay circuit, LED display circuit. Able to control the car automatically find sources and reach the designated parking garages, on his way through A, B, C line audible alarm and the parking and drop coins in accordance with the instruction of action. 一、 设计任务 设计并制作一个光控智能小车,小车能通过光引导自动从出发区走到车库。 1.1、基本要求 (1)电动小车在出发区(车体不能超出出发区,按起动键后不能对小车进行操作),能自动把车头对准光源,对准后发出声或光提示,并且停15秒钟; (2)完成基本要求(1)后,小车自动起动,小车能通过光引导自动从出发区走到车库; (3)电动小车在行驶过程中遇到A、B、C线分别发出声或光提示; (4)电动小车在行驶过程中任何部位不能超出场地; (5)电动小车从出发区出发到车库停车的时间不超过90秒; 1.2、发挥部分 (1)电动小车能预装2枚一元的硬币; (2)在基本要求(1)停车的15秒钟内能识别光源发出的指令信号(指令信号见说明),接收到指令后发出声或光提示; (3)接收到指令一信号,小车行驶到A线上时停车5秒; (4)接收到指令二信号,小车行驶到A线上时停车5秒,并且在线上放下一枚硬币; (5)接收到指令三信号,小车行驶到B线上时停车5秒,并且线上放下一枚硬币; (6)到达车库并且在车库中心放下一枚硬币,小车停在车库中停车后发出声或光提示; (7)其他。 二、 系统方案选择与论证 (一) 主控电路方案选择 方案一:采用飞思卡尔公司MCSXS128单片机,此单片机功能强大,寄存器丰富,但程序配置复杂,价格昂贵。 方案二:采用STC89C52单片机最小系统构成主控电路,IO口丰富,操作简单,通用性强,价格低廉。 方案比较 :考虑到传统的STC89C52单片机就可以满足题目的需要,而且价格低廉,电路简单,性价比高,因此选择方案二。 (二) 驱动电路方案选择 采用电机驱动芯片L298,该芯片是利用 TTL电平进行控制,对电机的操作方便,通过改变芯片的输入电平,即可以对电机进行正反转操作,通过控制占空比输出不同的PWM波很方便单片机对小车方向的控制。因此采用此方案驱动直流电机。 (三) 光源检测电路选择 方案一:采用光敏二极管的感光特性实现对光照的检测,二极管响应快,但一般灵敏度比光敏电阻低,稳定性差 。 方案二:采用光敏电阻的高灵敏感光特性,且有光谱特性,在高温、多湿的恶劣环境下,仍能保持其高度的稳定性和可靠性;在黑暗环境里,它的电阻值很高,当受到光照时,其电阻率变少,从而造成光敏电阻阻值下降,输出信号电位 会发生变化,再经过运放比较,实现高低电平的变化,把信号送单片机处理。 方案比较:经上述论证比较和实际的测试,光敏电阻的稳定性和感光性更好,决定选择方案二。 (四) 黑线检测电路 采用红外对管,利用光反射的原理,红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,发出的红外线照射到黑色的平面后红外线被吸收 。若红外接收管能接收到反射回的红外线则检测出自线继而输出低电平,若接收不到红外线则检测出黑线继而输出高电平,同时将对管的输出与单片机 I/0 口相连接,由单片来检测识别,来控制声光报警电路。 此方案稳定性强,操作简单,决定采用此方案。 (五) 声光报警电路方案 采用蜂鸣器报警电路,当检测到黑线时,单片机给一个脉冲信号给蜂鸣器,及时报警,提高检测的准确性。采用LED灯完成显示黑线指示,此电路模块结构简单,符合题目要求,因此使用此方案。 (六) 电源模块方案 采用12V蓄电池为直流电机供电,用7805稳压芯片降压至5V为单片机及其他电路模块供电。蓄电池具有较强的电流驱动能力以及稳定的电压输出性能,因此决定采用此方案作为电源模块。 (七) 硬币吸放模块方案 利用电磁继电器在通电时可产生磁场的原理,通过主控芯片的IO口高低电平控制电磁线圈的有无电流来控制电磁继电器的磁性来吸放硬币。电磁继电器电流小,磁性强,易于单片机IO口控制,选用此方案作为硬币吸放模块。 三、 系统硬件模块设计与原理 (一)系统整体设计分析 系统主要由单片机控制电路、电机驱动电路、光源检测电路、信号检测电路、声光报警电路和电源电路、硬币吸放电路七个部分组成。首先由光源检测检测电路检测光源,然后把信号送给单片机处理,并根据所采集到的信息控制电机的转动,小车实现自动寻光,通过光的引导从出发区行驶到车库,途中遇到黑线发出声光报警,并根据信号实现停车放硬币。整体框图如图(1)所示: 图(1) (二)单片机主控系统 电路如图(2)所示。51单片机最小系统由STC89C52芯片和晶振电路、复位电路、电源电路构成最小系统电路。 图(2) (三)驱动电路模块 电路如图(3)电机驱动芯片 L298 内部包含4通道逻辑驱动电路,是一种二相和四相电机专用驱动器,可驱动46V、2A以下的电机,OUTl、OUT2和OUT3、OUT4之间分别接2个电机,INl 、IN2、IN3、IN4引脚从单片机输入控制电平,控制电机的正反转,从而实现控制小车的方向。 图(3) (四)光源检测模块 光源检测电路采用光敏电阻传感器,如下图(4)所示。1.有光照情况,光敏电阻变小,V2变大,假设V2=4.6V,V3电压4V,V2>V3 反向输入端大于同向输入端,则OUT输出低电平为0给单片机识别;2.无光照情况,光敏电阻变大,V2变小,假设V2=3.2V,V3电压不变还是4V,V2 #include #include #define uchar unsigned char #define uint unsigned int sbit ENA=P3^6; //电机1使能端 sbit IN1=P1^0; //电机1输出IO口 sbit IN2=P1^1; sbit ENB=P3^7; //电机2使能端 sbit IN3=P1^2; //电机2输出IO口 sbit IN4=P1^3; sbit light1=P2^0; //左光敏二极管 sbit light2=P2^1; //右光敏二极管 sbit light3=P2^2; //中间光敏二极管 sbit lights=P2^3; //入库光敏二极管 sbit LED1=P0^0; //黑线信号灯 sbit LED2=P0^1; //光源信号灯 sbit LED3=P0^2; //小车中心灯 sbit MONEY1=P0^4; sbit MONEY2=P0^5; sbit hongwai=P1^4; //红外对管输入端 sbit SPEAKER=P1^5; //蜂鸣器 /*定义变量*/ unsigned char timer1; unsigned int black_flag=0; //黑线标志位 unsigned char num=0; //定时器计数值 uchar heixian_jishu; //黑线数量 uchar begin; uchar heixian_flag; //黑线停车标志位 uchar flag; //光源信号检测标志 uchar ruku_flag; //入库信号标志 uchar time_flag; //信号接收时间计时标志 uchar temp1,time1,sec,jishu_light,temp_time,k; uchar PWM; uchar i; /*函数声明*/ void delayms(uint ms); //1ms延时函数 void Init_system(); //系统初始化函数 void T0_Init(); //定时器初始化函数 void Time1Config(); void blackline(); //黑线检测函数 void TIMEOUT(); void forward(); //前进 void backward(); //后退 void stop(); //停车 void turn_left(); //左转弯 void turn_right(); //右转弯 void rotate_left(); //原地左转 void rotate_right(); //原地右转 void light_scan_ready(); //小车原地寻光源对准 void light_scan(); //小车寻光源前进 void light_scan_back(); //小车寻光源后退入库 void light_receive(); //光源信号接收函数 void sign1(); //信号1 void sign2(); //信号2 void sign3(); //信号3 void car_garage(); //小车入库函数 void blackline() //黑线检测函数 { if(hongwai==1) //黑线为高电平 { black_flag=1; SPEAKER=0; LED1=0; } if((hongwai==0)&&(black_flag==1)) { black_flag=0; SPEAKER=1; LED1=1; heixian_jishu++; } } void light_scan_ready() //小车原地寻光源对准 { if(begin==0) { if((light1==1)&&(light3==1)&&(light2==1)) //左右均无光照,小车左转寻找光源 {rotate_right();} else if((light1==1)&&(light3==0)&&(light2==0)) //左光敏无光照,右光敏有光照 右转 {rotate_right();} else if((light1==1)&&(light3==1)&&(light2==0)) {rotate_right();} else if((light1==0)&&(light3==1)&&(light2==1)) //左光敏有光照,右光敏无光照 左转 {rotate_left();} else if((light1==0)&&(light3==0)&&(light2==1)) {rotate_left();} else if((light1==1)&&(light3==0)&&(light2==1)) //左右光敏均有光照 停车 { LED2=0; stop(); TR0=1; //计时开启 flag=1; //光源信号接收标志 开启 begin=3; //寻光关闭 delayms(2000); LED2=1; } } } void light_scan() { if(begin==1) { LED3=0; if((light1==1)&&(light3==1)&&(light2==1)) //左右均无光照,小车左转寻找光源 {rotate_right();} else if((light1==1)&&(light3==0)&&(light2==0)) //左光敏无光照,右光敏有光照 右转 {turn_right();} else if((light1==1)&&(light3==1)&&(light2==0)) {turn_right();} else if((light1==0)&&(light3==1)&&(light2==1)) //左光敏有光照,右光敏无光照 左转 {turn_left();} else if((light1==0)&&(light3==0)&&(light2==1)) {turn_left();} else if((light1==1)&&(light3==0)&&(light2==1)) //左右光敏均有光照 { LED2=0; forward(); } //两轮前进 else if((light1==0)&&(light3==0)&&(light2==0)) { LED2=0; forward(); } } } void light_scan_back() { if(begin==2) { if((light1==1)&&(light2==1)) //左右均无光照,小车左转寻找光源 {turn_left();} else if((light1==1)&&(light2==0)) //左光敏无光照,右光敏有光照 右转 {turn_right();} else if((light1==0)&&(light2==1)) //左光敏有光照,右光敏无光照 左转 {turn_left();} else if((light1==0)&&(light2==0)) //左右光敏均有光照 两轮后退 { LED2=0; backward(); TR0=1; } } } void light_receive() //光源信号检测接收 { if(flag==1) { if(light3==1) { temp1=1; if(time_flag==1) { time1=sec; time_flag=0; } } if((light3==1)&&(temp1==1)) { LED2=0; temp1=0; if(sec-time1<=4&&sec<=15) //15秒内发信号,3秒内接收完信号 { jishu_light++; LED1=0; delayms(500); LED1=1; } } } } void sign1() //信号1 A线停5S { if((jishu_light%3)==1) { if((heixian_jishu==1)&&(heixian_flag==1)) //在黑线A停车5S 停止寻光 { heixian_flag=0; temp_time=sec; begin=3; stop(); } if(sec-temp_time==6&&heixian_flag==0) // 5S后自动启动 { begin=1; car_garage(); } } } void sign2() //信号2 A线停5S { if((jishu_light%3)==2) { if((heixian_jishu==1)&&(heixian_flag==1)) //A线停车 { heixian_flag=0; temp_time=sec; begin=3; stop(); MONEY1=1; } if(sec-temp_time==6&&heixian_flag==0) //5S后小车自启动 { begin=1; car_garage(); } } } void sign3() { if(jishu_light==3) { if((heixian_jishu==2)&&(heixian_flag==1)) //B线停车 { heixian_flag=0; temp_time=sec; begin=3; stop(); } if(sec-temp_time==6&&heixian_flag==0) //5S后小车自启动 { begin=1; car_garage(); } } } void car_garage() //小车入库函数 { if((lights==0)&&(heixian_jishu>=3)&&(ruku_flag==1)) //过第3根线开启光敏入库扫描 { ruku_flag=0; stop(); for(i=0;i<110000;i++) {MONEY2=1;} begin=3; IE=0x00; for(k=0;k<=8;k++) { LED1=0; LED2=0; delayms(250); LED1=1; LED2=1; delayms(250); } } if(light3==1&&ruku_flag==0) { stop(); begin=0; } } void TIMEOUT() { if(sec>=90) { stop(); begin=3; //关闭寻光 IE=0x00; //关闭中断 } } void forward() //两轮前进 前驱 极性和正常相反 { IN1=0; IN2=PWM; IN3=0; IN4=PWM; ENA=1; ENB=1; } void backward() //两轮后退 前驱 极性和正常相反 { IN1=PWM; IN2=0; IN3=PWM; IN4=0; ENA=1; ENB=1; } void turn_left() //左轮前进,右轮静止 { IN1=0; IN2=1; IN3=0; IN4=0; ENA=1; ENB=1; } void rotate_left() //左轮后退,右轮前进 { IN1=0; IN2=PWM; IN3=PWM; IN4=0; ENA=1; ENB=1; } void turn_right() //左轮静止,右轮前进 { IN1=0; IN2=0; IN3=0; IN4=1; ENA=1; ENB=1; } void rotate_right() //左轮前进,右轮后退 { IN1=PWM; IN2=0; IN3=0; IN4=PWM; ENA=1; ENB=1; } void stop() //停止 { IN1=0; IN2=0; IN3=0; IN4=0; ENA=1; ENB=1; } void T0_Init() { TMOD=0x01; //设置定时器0为工作方式1(M1M0为01) TH0=0x4c; //装初值 11.0592M晶振定时50ms数为45872 TL0=0x00; EA=1; //开总中断 ET0=1; //开定时器0中断 //TR0=1; //启动定时器0 } void Time1Config() //PWM定时器 { TMOD|= 0x10; //设置定时计数器工作方式1为定时器 //--定时器赋初始值,12MHZ下定时0.5ms--// TH1 = 0xFE; TL1 = 0x0C; ET1 = 1; //开启定时器1中断 EA = 1; TR1 = 1; //开启定时器 } void Init_system() { begin=0; //原地对准光源开启 heixian_flag=3; //黑线停车标志 关闭 time_flag=1; //信号接收时间计时 开启 ruku_flag=1; //入库信号标志 开启 LED3=0; //初始化灯 MONEY1=0; //信号2硬币初始化 MONEY2=0; //入库硬币初始化 } void main(void) { T0_Init(); Init_system(); Time1Config(); while(1) { if(timer1>100) //PWM周期为100*0.5ms { timer1=0; } if(timer1 < 50) //改变30这个值可以改变直流电机的速度 { PWM=1; } else { PWM=0; } light_scan_ready(); //光源扫描确定 blackline(); //红外扫描黑线 light_scan(); //实时扫描光源 light_receive(); //光源信号接收 sign1(); //信号1 sign2(); //信号2 sign3(); //信号3 car_garage(); //小车入库 light_scan_back(); //寻光倒回 TIMEOUT(); //超出时限,强制停车 } } void T0_time(void)interrupt 1 //定时计数器0溢出服务函数 { TH0=0x4c; //重装初值 TL0=0x00; num++; if(num==20) //1S计时一次 { num=0; sec++; if(sec==15) //计时15S 小车前进 { LED3=1; begin=1; //实时寻光模式 开启 flag=0; //光源信号检测 关闭 forward(); //前进 heixian_flag=1; //黑线停车标志 开启 } } } void T1_Time(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断 { TH1 = 0xFE; //重新赋初值 TL1 = 0x0C; timer1++; }

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高员外,我们会尽快处理。