找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2120|回复: 1
收起左侧

大一的时候做的非常简单的红外循迹小车程序

[复制链接]
ID:328225 发表于 2020-4-6 15:28 | 显示全部楼层 |阅读模式
基本是手动调节参数,所以很适合入门吧
大佬就别看了,从来没有接触过的可以看看,都是非常基础的c语言

单片机源程序如下:
  1. #include <reg52.h>  

  2. #define uint unsigned int
  3. #define uchar unsigned char  
  4. #define left    0
  5. #define right   1

  6. sbit IN1 = P1^0;   
  7. sbit IN2 = P1^1;  
  8. sbit ENA = P1^2;  
  9. sbit IN3 = P1^3;  
  10. sbit IN4 = P1^4;  
  11. sbit ENB = P1^5;  
  12.   
  13. sbit left2 = P0^0;  
  14. sbit left1 = P0^1;  
  15. sbit right1 = P0^2;  
  16. sbit right2 = P0^3;  
  17. sbit right3 = P0^4;
  18. sbit left3 = P0^5;
  19. sbit  key1=P3^2;
  20.   
  21. sbit beep=P3^4;       
  22. sbit DOUT=P1^6;               

  23. unsigned char zkb1 = 0;  
  24. unsigned char zkb2 = 0;  
  25. unsigned char t = 0;  
  26. unsigned char i,j,a,b;
  27. unsigned char speed=25;
  28. uint flag=0;
  29. unsigned char SignalFlag[2];
  30. void init()  
  31. {  
  32.     EA = 1;  
  33.     TMOD |= 0x01;  
  34.     TH0 =(65536 - 100) / 256;  
  35.     TL0 = (65536 - 100)% 256;     
  36.     ET0 = 1;
  37.     TR0 = 1;  
  38. }  
  39.   
  40. void timer0() interrupt 1  
  41. {  
  42.   
  43.     TH0 = (65536 - 100) / 256;  
  44.     TL0 = (65536 - 100) % 256;  
  45.          
  46.     if(t < zkb1)  
  47.     {  

  48.         ENA = 1;  
  49.     }  
  50.     else   
  51.     {  
  52.         ENA = 0;  
  53.     }  
  54.     if(t < zkb2)            
  55.     {  
  56.         ENB =1;  
  57.     }  
  58.     else   
  59.     {  
  60.         ENB = 0;  
  61.     }  
  62.     ++t;  
  63.     if(t >= 200)  
  64.     {  
  65.         t = 0;  
  66.     }  
  67.       
  68.       
  69.   
  70. }  
  71. void delay( uint z)
  72. { uint j;
  73.   while( z--)
  74.   { for(j=110;j>0;j--);}
  75. }
  76.   
  77. void turn_left()  
  78. {
  79.     zkb1 =29;//15;
  80.     zkb2 =38;
  81.           
  82.     IN1 = 1;  
  83.     IN2 = 0;  
  84.     IN3 = 1;  
  85.     IN4 = 0;       
  86. }  
  87.    
  88. void turn_right()  
  89. {  
  90.     zkb1 = 38;
  91.     zkb2 = 29;//15;
  92.     IN1 = 1;  
  93.     IN2 = 0;  
  94.     IN3 = 1;  
  95.     IN4 = 0;
  96. }  
  97. void turn_left1()  
  98. {
  99.     zkb1 =12;//15;
  100.     zkb2 =45;
  101.           
  102.     IN1 = 1;  
  103.     IN2 = 0;  //左轮反转
  104.     IN3 = 1;  
  105.     IN4 = 0;
  106. }  
  107.    
  108. void turn_right1()  
  109. {  
  110.     zkb1 = 45;
  111.     zkb2 = 12;//15;
  112.     IN1 = 1;  
  113.     IN2 = 0;  
  114.     IN3 = 1;  
  115.     IN4 = 0;       
  116. }  
  117.   void turn_right2()  
  118. {
  119.        
  120.     zkb1 =32;//15;
  121.     zkb2 =32;
  122.           
  123.     IN1 = 0;  
  124.     IN2 = 1;  
  125.     IN3 = 1;  
  126.     IN4 = 0;       
  127.         }

  128.    
  129. void turn_left2()  
  130. {  
  131.     zkb1 = 32;
  132.     zkb2 = 32;//15;
  133.     IN1 = 1;  
  134.     IN2 = 0;  
  135.     IN3 = 0;  
  136.     IN4 = 1;       

  137. }  
  138. void qianjin()  
  139. {  
  140.     zkb1 =30;
  141.     zkb2 =30;
  142.           IN1 = 1;  
  143.     IN2 = 0;  
  144.     IN3 = 1;  
  145.     IN4 = 0;       
  146. }

  147. void tingzhi()  
  148. {  

  149.   zkb1 = 0;
  150.         zkb2 = 0;
  151.    delay(250);
  152.        
  153. }  


  154. void delay1()//延时程序
  155. {
  156. uchar m,n,s;
  157. for(m=20;m>0;m--)
  158. for(n=20;n>0;n--)
  159. for(s=248;s>0;s--);
  160. }


  161. void xunji()  
  162. {  
  163.     unsigned char flag=0;  

  164.     if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0)&&(left3 == 0)&&(right3 == 0))
  165.     {  
  166.         flag = 0;  
  167.     }  
  168.     else if(((right2 == 0)&&(right1 ==0)&&(left1 == 1)&&(left2 == 0))&&(left3 == 0)&&(right3 == 0)||((right2 == 0)&&(right1 == 0)&&(left1 == 1)&&(left2 == 1))&&(left3 == 0)&&(right3 == 0))
  169.                 {  
  170.         flag = 1;  
  171.     }  
  172.     else if(((right2 == 0)&&(right1 == 1)&&(left1 == 0)&&(left2 == 0))&&(left3 == 0)&&(right3 == 0)||((right2 == 1)&&(right1 == 1)&&(left1 == 0)&&(left2 == 0))&&(left3 == 0)&&(right3 == 0))  
  173.     {  
  174.         flag = 2;  
  175.     }  
  176.     else if((right2 == 1)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0)&&(left3 == 0)&&(right3 == 0))  
  177.     {  
  178.         flag = 3;  
  179.     }  
  180.     else if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 1)&&(left3 == 0)&&(right3 == 0))
  181.     {  
  182.         flag = 4;  
  183.     }
  184.     else if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0)&&(left3 == 0)&&(right3 == 1))  
  185.     {  
  186.         flag = 5;  
  187.     }  
  188.     else if((right2 == 0)&&(right1 == 0)&&(left1 == 0)&&(left2 == 0)&&(left3 == 1)&&(right3 == 0))
  189.     {  
  190.         flag = 6;  
  191.     }               
  192.                 else if((right2 == 1)&&(right1 == 1)&&(left1 == 1)&&(left2 == 1))  
  193.     {  
  194.         flag = 7;  
  195.     }
  196.                 else flag=0;
  197.     switch(flag)  
  198.     {  
  199.         case 0:qianjin();break;  
  200.          
  201.         case 1:turn_left();break;  
  202.          
  203.         case 2:turn_right();break;  
  204.          
  205.         case 3:turn_right1();break;  
  206.          
  207.         case 4:turn_left1();break;
  208.                        
  209.         case 5:turn_right2();break;  
  210.          
  211.         case 6:turn_left2();break;                       
  212.                        
  213.         case 7:tingzhi();break;  
  214.                        
  215.         default:qianjin();break;                        
  216.     }  
  217. }  
  218.   
  219.    void main()
  220. {  
  221.     init();   
  222.      while(1)  
  223.     {  
  224.        if (key1==0)
  225.                           {
  226.                                         do
  227.                                   {
  228.                                                 IN1 = 1;  
  229.             IN2 = 0;  
  230.             IN3 = 0;  
  231.             IN4 = 1;       
  232.                                                 zkb1 = 27;
  233.             zkb2 = 27;
  234.                                                 beep=1;
  235.           }
  236.                                         while(right3==0);
  237.                                         do
  238.                                         {
  239.                                                 IN1 = 1;  
  240.             IN2 = 0;  
  241.             IN3 = 1;  
  242.             IN4 = 0;       
  243.                                                 beep= 1;
  244.                                                 zkb1 = 40;
  245.             zkb2 = 20;
  246.                                         }
  247.                                         while(right1==0);
  248.                                         turn_left1();
  249.                                         delay(220);
  250.                                 }
  251.                                 else
  252.                                 {      
  253.                 xunji();
  254.         }
  255. }
  256. }
复制代码

以上程序51hei提供下载:
xunji.zip (41.62 KB, 下载次数: 17)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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