找回密码
 立即注册

QQ登录

只需一步,快速开始

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

4路红外循迹加超声波避障程序和资料-网上买的的智能小车

  [复制链接]
跳转到指定楼层
楼主
ID:224025 发表于 2017-8-12 09:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本小车是从网上买的,7.2v电车供电,L298N电机驱动模块。
系统的硬件包括以下几个部分:
(1)MCU:STC89C52;
(2)电源:7.2V、1600mah的可充电镍镉电池;
(3)红外光电传感器;
(4)超声波传感器:HC-SR04
(5)两个直流电机;
(6)电机驱动芯片:L298N。

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define somenop  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();
  4. #define DIS_DATA  P0

  5. unsigned char code DIS_TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  6.                     0x88,0x83,0xc6,0xa1,0x86,0x8e};
  7. sbit cs0 = P2^0;
  8. sbit cs1 = P2^1;
  9. sbit cs2 = P2^2;
  10. sbit cs3 = P2^3;
  11. sbit MOTO1_IN1 = P1^0;//左轮电机
  12. sbit MOTO1_IN2 = P1^1;
  13. sbit MOTO2_IN1 = P1^2;//右轮电机
  14. sbit MOTO2_IN2 = P1^3;
  15. sbit MOTO1_PWM = P1^4;
  16. sbit MOTO2_PWM = P1^5;
  17. sbit Tx = P3^3;
  18. sbit Rx = P3^2;
  19. sbit Key_1 = P3^5;
  20. sbit Key_2 = P3^4;
  21. sbit Led = P1^7;

  22. void RED_SCAN(void);
  23. void Turn_Forward(void);
  24. void Turn_Right(void);
  25. void Turn_Left(void);
  26. void Turn_Stop(void);
  27. void Turn_SRight(void);
  28. void Turn_SLeft(void);
  29. void Test(void);
  30. void Key_Scan(void);
  31. void send_wave(void);
  32. void Delay10us(void);
  33.        
  34. unsigned char i = 0,j = 0;
  35. unsigned char a = 0,b = 0;
  36. unsigned char flag = 0;
  37. unsigned char flag1 = 0;
  38. unsigned char timeH = 0,timeL = 0,time = 0;
  39. unsigned char mode;
  40. unsigned char flag_csb_juli=0;
  41. unsigned char iCnt;
  42. unsigned int displayvalue;
  43. unsigned int scan_status;

  44. float distance;

  45. int main()
  46. {
  47.         Tx = 0;
  48.         EA = 1;
  49.         TMOD = 0x11;
  50.         TR0=0;
  51.         TR1=0;
  52.         MOTO1_PWM = 0;
  53.         MOTO2_PWM = 0;
  54.         TH0 = 65517/256;
  55.         TL0 = 65517%256;
  56.        
  57.         while(1)
  58.         {       
  59.                 Key_Scan();
  60.                 if(mode == 1)
  61.                 {
  62.                         ET0 = 1;
  63.                         TR0 = 1;
  64.                 }
  65.                 if(mode == 2)
  66.                 {
  67.                         ET0 = 0;
  68.                         TR0 = 0;
  69.                         MOTO1_PWM = 1;
  70.                         MOTO2_PWM = 1;
  71.                         send_wave();
  72.                        
  73.                 }
  74.         }
  75.        
  76. }

  77. void RED_SCAN(void)
  78. {
  79.         switch(P2&0xf0)
  80.         {
  81.                
  82.                         case 0x60:        Turn_Forward();flag = 0;scan_status=110;
  83.                         break;
  84.                
  85.                         case 0xC0:        Turn_Right();flag = 0;scan_status=1100;
  86.                         break;
  87.                
  88.                         case 0x30:  Turn_Left();flag = 0;scan_status=11;
  89.                         break;
  90.                
  91.                         case 0x80:  Turn_SRight();flag = 2;scan_status=1000;
  92.                         break;
  93.                
  94.                         case 0x10:  Turn_SLeft(); flag = 1;scan_status=1;
  95.                         break;
  96.                
  97.                         case 0xE0:  Turn_Right();flag = 0;scan_status=1110;
  98.                         break;
  99.                
  100.                         case 0x70:  Turn_Left();flag = 0;scan_status=111;
  101.                         break;
  102.                        
  103.                         case 0x20:  Turn_Right();flag = 0;scan_status=10;
  104.                         break;
  105.                        
  106.                         case 0x40:         Turn_Left();flag = 0;scan_status=100;
  107.                         break;
  108.                        
  109.                         default:                Test();        scan_status=0;
  110.                         break;

  111.         }

  112. }

  113. void Turn_Forward(void)
  114. {
  115.         MOTO1_IN1=0;
  116.         MOTO1_IN2=1;
  117.         MOTO2_IN1=0;
  118.         MOTO2_IN2=1;
  119.         a=80;
  120.         b=70;
  121. }

  122. void Turn_Right(void)
  123. {
  124.         MOTO1_IN1=0;
  125.         MOTO1_IN2=1;
  126.         MOTO2_IN1=0;
  127.         MOTO2_IN2=1;
  128.         a=70;
  129.         b=85;
  130. }


  131. void Turn_Left(void)
  132. {
  133.         MOTO1_IN1=0;
  134.         MOTO1_IN2=1;
  135.         MOTO2_IN1=0;
  136.         MOTO2_IN2=1;
  137.         a=85;
  138.         b=70;
  139. }
  140. void Turn_SRight(void)
  141. {
  142.         MOTO1_IN1=0;
  143.         MOTO1_IN2=1;
  144.         MOTO2_IN1=0;
  145.         MOTO2_IN2=0;
  146. //        TR0=1;
  147.         a=80;
  148.         b=70;

  149. }
  150. void Turn_SLeft(void)
  151. {
  152.         MOTO1_IN1=0;
  153.         MOTO1_IN2=0;
  154.         MOTO2_IN1=0;
  155.         MOTO2_IN2=1;
  156.         a=80;
  157.         b=70;
  158. }
  159. void Turn_Stop(void)
  160. {
  161.         MOTO1_IN1=0;
  162.         MOTO1_IN2=0;
  163.         MOTO2_IN1=0;
  164.         MOTO2_IN2=0;

  165. }

  166. void Test(void)
  167. {
  168.         if(flag==0)
  169.         Turn_Stop();
  170.         if(flag==1)
  171.         Turn_SLeft();
  172.         if(flag==2)
  173.         Turn_SRight();
  174. }

  175. void timer0() interrupt 1
  176. {       
  177.                
  178.                 TR0 = 0;
  179.                
  180.                 i++;
  181.                 TH0=65517/256;
  182.                 TL0=65517%256;
  183.                  
  184.         iCnt++;
  185.                         if(mode == 1)
  186.                         {
  187.                                 displayvalue=scan_status;
  188.                                 //displayvalue=1234;
  189.                         }
  190.                         else
  191.                         {
  192.                             displayvalue=(int)distance;
  193.                        
  194.                         }
  195.                        
  196.                         if(iCnt == 10)
  197.                         {
  198.                                 DIS_DATA = 0xff;        //消影
  199.                                 cs0 = 1;
  200.                                 cs1 = 1;
  201.                                 cs2 = 1;
  202.                                 cs3 = 0;
  203.                                 DIS_DATA = DIS_TABLE[displayvalue % 10];
  204.                         }
  205.                         if(iCnt == 20)
  206.                         {
  207.                                 DIS_DATA = 0xff;        //消影
  208.                                 cs0 = 1;
  209.                                 cs1 = 1;
  210.                                 cs2 = 0;
  211.                                 cs3 = 1;
  212.                                 DIS_DATA = DIS_TABLE[displayvalue /10 % 10];                         
  213.                        
  214.                         }
  215.                         if(iCnt == 30)
  216.                         {
  217.                                 DIS_DATA = 0xff;        //消影
  218.                                 cs0 = 1;
  219.                                 cs1 = 0;
  220.                                 cs2 = 1;
  221.                                 cs3 = 1;
  222.                                 DIS_DATA = DIS_TABLE[displayvalue /100 % 10];                       
  223.                         }
  224.                         if(iCnt == 40)
  225.                         {
  226.                            // iCnt == 0;
  227.                                 DIS_DATA = 0xff;        //消影
  228.                                 cs0 = 0;
  229.                                 cs1 = 1;
  230.                                 cs2 = 1;
  231.                                 cs3 = 1;
  232.                                 DIS_DATA = DIS_TABLE[displayvalue /1000 % 10];                       
  233.                         }
  234.                         if(iCnt == 50)
  235.                         {
  236.                             iCnt == 0;
  237.                     DIS_DATA = 0xff;        //消影
  238.                         }


  239.                 if(i==a)  
  240.                 {
  241.                         MOTO1_PWM = 1;
  242.                 }
  243.                 if(i==b)
  244.                 {
  245.                         MOTO2_PWM = 1;
  246.                 }
  247.        
  248.                 if(i==100)
  249.                 {
  250.                         i=0;
  251.                         MOTO1_PWM = 0;
  252.                         MOTO2_PWM = 0;
  253.                         RED_SCAN();
  254.                        
  255.                 }
  256.                 TR0 = 1;
  257. }
  258. void Key_Scan(void)
  259. {
  260.         if(Key_1 == 0)
  261.         {
  262.                 mode = 1;
  263.                 while(!Key_1);
  264.         }
  265.         if(Key_2 == 0)
  266.         {
  267.                 mode = 2;
  268.                 while(!Key_2);
  269.         }
  270. }

  271. void send_wave()
  272. {
  273.         Tx = 1;                        //10us的高电平触发
  274.         Delay10us();
  275.         Tx = 0;
  276.         flag_csb_juli = 0;
  277.         TH1 = 0;                        //给定时器0清零
  278.         TL1 = 0;
  279.         TR1 = 0;                        //关定时器0定时
  280.         while(Rx==0);                //当Echo为零时等待
  281.         TR1=1;
  282.         while(Rx==1)                        //当Echo为1计数并等待
  283.         {
  284.                    flag_csb_juli = 1;
  285.          }
  286.         if(flag_csb_juli == 1)
  287.         {
  288.                   TR1=0;        //关定时器0定时
  289.                   distance =TH1 * 256 + TL1;    //读出定时器1的定时时间
  290.                   distance *= 0.017;               // 0.017 = 340M / 2 = 170M = 0.017cM 算出来是c米
  291.                                                                                                 // distance单位是厘米
  292.                 if((distance < 20))                                        //距离 = 速度 * 时间
  293.                 {
  294.                         Turn_SLeft();                                        //如果大于3.8m就超出超声波的量程
  295.                
  296.                 }
  297.                         if((distance > 20))                                        //距离 = 速度 * 时间
  298.                 {
  299.                         Turn_Forward();                                        //如果大于3.8m就超出超声波的量程
  300.                 }
  301.         }
  302. }

  303. void Delay10us()                //@11.0592MHz
  304. {
  305.         unsigned char i;

  306.         _nop_();
  307.         i = 25;
  308.         while (--i);
  309. }
复制代码

所有资料51hei提供下载:

共享程序 循迹加数码管.rar (1.6 KB, 下载次数: 154)
【Realplay】HC-SR04 超声波模块 测距模块 超声波 传感器 送资料.rar (1.67 MB, 下载次数: 162)




评分

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

查看全部评分

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

使用道具 举报

沙发
ID:223438 发表于 2017-8-18 02:17 | 只看该作者
感谢分享
回复

使用道具 举报

板凳
ID:228376 发表于 2017-8-19 11:56 | 只看该作者
谢谢LZ的分享
回复

使用道具 举报

地板
ID:262559 发表于 2018-2-3 14:48 来自手机 | 只看该作者
收藏了
回复

使用道具 举报

5#
ID:538658 发表于 2019-5-20 13:36 | 只看该作者
请问楼主有这个程序的电路原理图么,有的话发1572166292@qq.com,谢谢。
回复

使用道具 举报

6#
ID:528547 发表于 2019-5-20 15:29 | 只看该作者
感谢分享
回复

使用道具 举报

7#
ID:560755 发表于 2019-6-21 11:03 | 只看该作者
18730630826 发表于 2019-5-20 13:36
请问楼主有这个程序的电路原理图么,有的话发,谢谢。

同问楼主跪求
回复

使用道具 举报

8#
ID:569149 发表于 2019-6-21 21:59 | 只看该作者
在哪买的,链接发一下呗
回复

使用道具 举报

9#
ID:242298 发表于 2019-12-22 11:40 | 只看该作者
O(∩_∩)O谢谢LZ分享
回复

使用道具 举报

10#
ID:676153 发表于 2020-2-24 13:16 | 只看该作者
感谢分享,学到很多
回复

使用道具 举报

11#
ID:641629 发表于 2020-10-8 09:58 | 只看该作者
资料没啥用   原理图都没有一个
回复

使用道具 举报

12#
ID:747323 发表于 2020-12-22 10:29 | 只看该作者
能给发一下原理图吗?
回复

使用道具 举报

13#
ID:876226 发表于 2021-1-26 12:06 | 只看该作者
有用,刚好和我的硬件符合
回复

使用道具 举报

14#
ID:704424 发表于 2021-3-23 10:11 | 只看该作者
感觉还是不错的,支持一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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