找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3000|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机红外小车避障软硬件分析(汇编语言程序)

[复制链接]
跳转到指定楼层
楼主
ID:865999 发表于 2020-12-24 08:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前做过的红外小车避障可以做个参考,是固定的障碍,要过障碍还是要通过算法,要自己算一下,

控制小车的运动一直是实验室中的重点项目之一,这次我们进行的项目就是运用红外检测模块对小车进行运动控制,从而让小车达到自动前进避开障碍物的目的。此次实验我们要用到AT89C51 单片机来控制,实现的目标为让小车自动走出迷宫以及记录障碍物遇到的个数。

基本内容
在一个有障碍物的区域内,小车可以自由前进,不碰撞到任何障碍物。
在行进的过程中,记录下遇到障碍物的个数
2.扩展内容
小车在光源的引导下,进入停车区到达车库并停止

小车的行走电机由两个H桥驱动,Q1到Q6是左边电机的驱动电路,Q3,Q4,Q7,Q8,Q11,Q12是右边电机的驱动电路,电路如图所示,图中的逻辑门电路U6A,U6B,U6C.U6D构成了一个逻辑互锁电路,避免H桥驱动电路中Q3与Q4同时导通,使得Q7,Q8,Q11,Q12全部导通,造成短路。其执行时Q3的基极为高电平时,Q3导通Q8,Q11也导通,右电机反转。当Q4的基极为高电平时,Q4导通Q7,Q12也导通,右电机正转。

第二节  红外模块介绍
要保证小车在前进运动中正确地避开障碍物,至少需要三组红外传感器来探测障碍物是在左面还是右面或者是在前方,并且三组传感器还要能探测到小车正前方的障碍物。为达到此要求,传感器的使用方案如下: 在小车的正中向前的方向安装红外接收模块,在小车前面朝左右方向各安装-一 个发射模块。安装时要注意调整安装位置,要确保反射回来的红外线能被接收到,所以要调整好方位。如果三个发射模块同时发射,接受模块将无法区分所接收到的信号来自何方。如果我们采用时分复用的方法就可以解决这个问题,让他们交替工作,只要交替的速度快就可以保证检测的正确性。
L为“1”表示接收模块接收到左面的反射信号,为“0”表示没有 接收到反射信号R为“1”表示接收模块接收到右面的反射信号,为“0”表示没有接收到反射信号。程序中除了要对判断是否有障碍外,还要对障碍物的方位做出准确的判断才能使小车做出正确的避让。先选择三个标志位,用于表示前,左,右
是否有障碍。有障碍置1,无障碍置0,最好是选择相邻的位,便于逻辑判断。
左边为红外发射模块电路图,右为红外接受电路图。

第三章  软件程序
第一节
流程图编写
本系统采用汇编语言编程。软件程序由主程序,PWM调速程序,红外模块控制程序,判断障碍物方位程序,障碍物个数显示程序和延时子程序组成。小车开机,检测先进行PWM调速,在对障碍物的方位进行检测从而对小车的运动状态进行调整,最后在对障碍物个数进行计数并且顺利走出搭建迷宫以完成实验。实验流程图如下:


第二节 程序编写
PWM调速:
调用调速模块,设置各项初值以及PWM调速的频率,最后改变其占空比来实现对小车速度的控制。
控制障碍物方位;
设置一个寄存器20H,使其高五位清零,再把三个传感器分别检测到障碍物个数时的情况列举出来,设置有障碍物为1没有障碍物为0,并和20H相与,最后得到检测障碍物方向的结论。
障碍物数目显示:
在转向时说明是检测到了前方有障碍物,让R7置1,转向变为直行说明前方已经没有了障碍物,就检测R7是否为1,如果为1,就说明有障碍物,那显示就加一
红外检测:
先关闭所有发射端口,设定发送脉冲数目,然后接受寄存器清零,然后启动第一个发射模块,然后给延时,判断是否接受到反射信号,接收到就脉冲数目加1,没有就停止发射,延时,然后判断是否发射10次,没有就继续启动发射模块重复直到10次发射完毕,然后判断接受脉冲数目是否等于或者大于2(等于或者大于2是为了检测更加灵敏),小于2就是没有障碍物,等于或者大于2就是有障碍物,另外两个模块也是这样。
附录1   传感器接口与其引脚功能

单片机源程序如下:
  1. CCON                DATA              0D8H
  2. CMOD                DATA              0D9H
  3. CCAPM0              DATA              0DAH
  4. CCAPM1              DATA              0DBH
  5. CCAPM2              DATA              0DCH
  6. CCAPM3              DATA              0DDH
  7. CCAPM4              DATA              0DEH
  8. CL                  DATA              0E9H
  9. CCAP0L              DATA              0EAH
  10. CCAP1L              DATA              0EBH
  11. CCAP2L              DATA              0ECH
  12. CCAP3L              DATA              0EDH
  13. CCAP4L              DATA              0EEH
  14. CH                  DATA              0F9H
  15. CCAP0H              DATA              0FAH
  16. CCAP1H              DATA              0FBH
  17. CCAP2H              DATA              0FCH
  18. CCAP3H              DATA              0FDH
  19. CCAP4H              DATA              0FEH

  20.               ORG                            0000H
  21.               LJMP              MAIN
  22.               ORG                            0030H

  23. MAIN:

  24.               MOV                                          20H,#00H
  25.               LCALL                            PWM                 // PWM初始化
  26. N1:            
  27.             
  28.               CLR                                          P3.2                            //关闭红外发射端口P3.2
  29.               CLR                                          P3.4                            //关闭红外发射端口P3.4
  30.               CLR                                          P3.7                            //关闭红外发射端口P3.7
  31.               MOV                                          R0,#10                            //设定脉冲发射数目
  32.               MOV                                          R1,#00                            //接收寄存器清零
  33. LOOP0:
  34.               SETB                            P3.7                            //打开红外发射端口P3.7
  35.               LCALL                            DE600U                            //延时
  36.               JB                                          P2.3,LOOP1//判断接收端口P2.3是否为1,不是则跳转到LOOP1
  37.               INC                                          R1                            //接收端口为1,R1加一
  38. LOOP1:
  39.               CLR                                          P3.7                            //关闭红外发射端口P3.7
  40.               LCALL                            DE600U                            //延时
  41.               DJNZ                            R0,LOOP0              //判断R0减一是否为0不为零则跳转到LOOP0
  42.               CJNE                            R1,#2,LOOP2                            //判断R1是否等于2,不等则跳转
  43. LOOP2:            
  44.             
  45.               JC                                          N2                            //有进位、即CF=1,则跳转N2            
  46.               SETB                            02H                            //02H置1
  47. N2:            
  48.             
  49.               CLR                                          P3.2                            //关闭红外发射端口P3.2
  50.               CLR                                          P3.4                            //关闭红外发射端口P3.4
  51.               CLR                                          P3.7                            //关闭红外发射端口P3.7
  52.               MOV                                          R2,#10                            //设定脉冲发射数目
  53.               MOV                                          R3,#00              //接收寄存器清零
  54. LOOP3:
  55.               SETB                            P3.4                            //打开红外发射端口P3.4
  56.               LCALL                            DE600U                            //延时
  57.               JB                                          P3.5,LOOP4//判断接收端口P3.5是否为1,不是则跳转到LOOP4
  58.               INC                                          R3                            //接收端口为1,R3加一
  59. LOOP4:
  60.               CLR                                          P3.4                            //关闭红外发射端口P3.4
  61.               LCALL                            DE600U                            //延时
  62.               DJNZ                            R2,LOOP3              //判断R2减一是否为0不为零则跳转到LOOP3
  63.               CJNE                            R3,#2,LOOP5                            //判断R3是否等于2,不等则跳转到LOOP5
  64. LOOP5:
  65.             
  66.               JC                                          MAIN1              //有进位、即CF=1,则跳转MAIN1
  67.               SETB                            01H                            //01H置1            
  68. MAIN1:            
  69.             
  70.               CLR                                          P3.2                            //关闭红外发射端口P3.2
  71.               CLR                                          P3.4                            //关闭红外发射端口P3.4
  72.               CLR                                          P3.7                            //关闭红外发射端口P3.7
  73.               MOV                                          R4,#10                            //设定脉冲发射数目
  74.               MOV                                          R5,#00              //接收寄存器清零
  75. LOOP6:
  76.               SETB                            P3.2                            //打开红外发射端口P3.2
  77.               LCALL                            DE600U                            //延时
  78.               JB                                          P3.3,LOOP7//判断接收端口P3.3是否为1,不是则跳转到LOOP7
  79.               INC                                          R5                            //接收端口为1,R5加一
  80. LOOP7:
  81.               CLR                                          P3.2                            //关闭红外发射端口P3.2
  82.               LCALL                            DE600U                            //延时
  83.               DJNZ                            R4,LOOP6              //判断R4减一是否为0不为零则跳转到LOOP6
  84.               CJNE                            R5,#2,LOOP8                            //判断R5是否等于2,不等则跳转到LOOP8
  85. LOOP8:
  86.             
  87.               JC                                          PD//有进位、即CF=1,则跳转PD
  88.               SETB                            00H                                          //00H置1               

  89. PD:            
  90.             
  91.               ANL                                          20H,#07H                            //把20H里的值和07H相与
  92.               MOV                                          A,20H                                          //把20H里的值给A
  93.               CJNE                            A,#00H, PD0                            //判断A是否等于00H,不等则跳转到PD0
  94.               LCALL                            mansu                            //进入直行慢速子程序
  95.               CJNE                            R7,#01H,SL                            //判断R7是否等于01H,不等则跳转到SL
  96.               LCALL                            JSXS                            //进入计数显示子程序
  97.               LJMP                            MAIN                            //跳转到MAIN
  98. PD0:
  99.               CJNE                            A,#01H,PD1              //判断A是否等于01H,不等则跳转到PD1
  100.               LCALL                            mansu1                            //进入直行慢速1子程序
  101.               CJNE                            R7,#01H,SL              //判断R7是否等于01H,不等则跳转到SL
  102.               LCALL                            JSXS                            //进入计数显示子程序
  103.               LJMP                            MAIN                            //跳转到MAIN
  104. PD1:
  105.               CJNE                            A,#02H,PD2              //判断A是否等于02H,不等则跳转到PD2
  106.               LCALL                            mansu2                            //进入直行慢速2子程序
  107.               CJNE                            R7,#01H,SL                            //判断R7是否等于01H,不等则跳转到SL
  108.               LCALL                            JSXS                            //进入计数显示子程序
  109.               LJMP                            MAIN                            //跳转到MAIN
  110. PD2:
  111.               CJNE                            A,#03H,PD3              //判断A是否等于03H,不等则跳转到PD3
  112.               LCALL                            mansu                            //进入直行慢速子程序
  113.               CJNE                            R7,#01H,SL                            //判断R7是否等于01H,不等则跳转到SL
  114.               LCALL                            JSXS                            //进入计数显示子程序
  115.               LJMP                            MAIN                            //跳转到MAIN
  116. PD3:
  117.               CJNE                            A,#04H,PD4              //判断A是否等于04H,不等则跳转到PD4
  118.               LCALL                            YZ                                          //进入右转子程序
  119.               MOV                                          R7,#01H                            //给R7赋值01H
  120.               LJMP                            MAIN                            //跳转到MAIN
  121. PD4:
  122.               CJNE                            A,#05H,PD5              //判断A是否等于05H,不等则跳转到PD5
  123.               LCALL                            ZZ                            //进入左转子程序
  124.               MOV                                          R7,#01H                            //给R7赋值01H
  125.               LJMP                            MAIN                            //跳转到MAIN
  126. PD5:
  127.               CJNE                            A,#06H,PD6              //判断A是否等于06H,不等则跳转到PD6
  128.               LCALL                            YZ                            //进入右转子程序
  129.               MOV                                          R7,#01H                            //给R7赋值01H
  130.               LJMP                            MAIN                            //跳转到MAIN
  131. PD6:
  132.               CJNE                            A,#07H,SL              //判断A是否等于07H,不等则跳转到SL
  133.               LCALL                            YZ                            //进入右转子程序
  134.               MOV                                          R7,#01H                                          //给R7赋值01H
  135. SL:            
  136.               LJMP                            MAIN                            //跳转到MAIN
  137. DE600U:                                                        //延时子程序
  138.               MOV                            30H,#200
  139. K1:              NOP
  140.               DJNZ              30H,K1
  141.               RET
  142. DE:                                                                      //延时子程序
  143.               MOV              33H,#10
  144. K4:              MOV              31H,#123
  145. K2:              MOV              32H,#200
  146. K3:              DJNZ              32H,K3
  147.               DJNZ              31H,K2
  148.               DJNZ              33H,K4
  149.               RET            
  150. DEL3S:              MOV                            48H,#60
  151. DEL0:              MOV                            49H,#123
  152. DEL1:              MOV                            50H,#200
  153. DEL2:              DJNZ              50H,DEL2
  154.                             DJNZ              49H,DEL1
  155.                             DJNZ              48H,DEL0
  156.                             RET
  157. ST:                            SETB              P1.4                            //小车停止程序
  158.                             SETB              P1.5
  159.                             SETB              P1.6
  160.                             SETB              P1.7
  161.                             RET
  162. mansu:                                                                      //前进慢速子程序
  163.               MOV                            CCON,#00H
  164.               LCALL                            ST
  165.               MOV                            CCAPM1,#00H
  166.               MOV                            CCAPM3,#00H
  167.               MOV                            CCAP2H,#48
  168.               MOV                            CCAPM2,#42H
  169.               MOV                            CCAP4H,#30
  170.               MOV                            CCAPM4,#42H
  171.               MOV                            CCON,#40H
  172.               RET
  173. mansu1:
  174.               MOV                            CCON,#00H
  175.               LCALL                            ST
  176.               MOV                            CCAPM1,#00H
  177.               MOV                            CCAPM3,#00H
  178.               MOV                            CCAP2H,#35
  179.               MOV                            CCAPM2,#42H
  180.               MOV                            CCAP4H,#20
  181.               MOV                            CCAPM4,#42H
  182.               MOV                            CCON,#40H
  183.               RET
  184. mansu2:
  185.               MOV                            CCON,#00H
  186.               LCALL                            ST
  187.               MOV                            CCAPM1,#00H
  188.               MOV                            CCAPM3,#00H
  189.               MOV                            CCAP2H,#40
  190.               MOV                            CCAPM2,#42H
  191.               MOV                            CCAP4H,#30
  192.               MOV                            CCAPM4,#42H
  193.               MOV                            CCON,#40H
  194.               RET
  195. YZ:              //右转子程序
  196.               MOV                            CCON,#00H
  197.               LCALL                            ST
  198.               MOV                            CCAPM2,#00H
  199.               MOV                            CCAPM3,#00H
  200.               MOV                            CCAPM1,#42H
  201.               MOV                            CCAP1H,#12
  202.               MOV                            CCAPM4,#42H
  203.               MOV                            CCAP4H,#30
  204.               MOV                            CCON,#40H
  205.               RET
  206. ZZ:                            //左转子程序
  207.               MOV                            CCON,#00H
  208.               LCALL                            ST
  209.               MOV                            CCAPM1,#00H
  210.               MOV                            CCAPM4,#00H
  211. ……………………

  212. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

以上资料51hei提供下载:
红外避障小车.docx (697.52 KB, 下载次数: 20)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表