找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自己写的51单片机智能车程序 不懂得可以问我

[复制链接]
跳转到指定楼层
楼主
ID:493513 发表于 2019-3-18 20:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不涉及路口判断

单片机源程序如下:
  1. #include<reg52.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int  u16;

  4. //占空比标志
  5. u8 ZKB_QZ,ZKB_QY,ZKB_HZ,ZKB_HY,Q_Z,Q_Y,H_Z,H_Y;

  6. //电机控制端口          P1
  7. sbit IN1=P1^0;           //前 左 反转                                       
  8. sbit IN2=P1^1;           //前 左 正转  
  9. sbit IN3=P1^2;           //前 右 正转
  10. sbit IN4=P1^3;           //前 右 反转
  11. sbit IN11=P1^4;           //后 右 反转
  12. sbit IN22=P1^5;           //后 右 正转
  13. sbit IN33=P1^6;           //后 左 正转
  14. sbit IN44=P1^7;           //后 左 反转

  15. //红外传感器          P3
  16. sbit hw_left=P3^7;
  17. sbit hw_mid=P3^6;
  18. sbit hw_right=P3^5;

  19. //PWM调速端口           P0
  20. sbit PWM_QZ=P0^1;  //前 左
  21. sbit PWM_QY=P0^2;  //前 右
  22. sbit PWM_HZ=P0^3;  //后 左               
  23. sbit PWM_HY=P0^4;  //后 右

  24. //延时函数
  25. void delay(u16 num)
  26. {
  27.   u16 x,y;
  28.   for(x=num;x>0;x--)
  29.   for(y=110;y>0;y--)
  30.   {
  31.   ;                                         
  32.   }
  33. }

  34. //定时器           初始化函数
  35. void Z_D()          
  36. {
  37.         TMOD=0x01;
  38.         TH0=(65536-100)/256;
  39.         TL0=(65536-100)%256        ;
  40.         EA=1;
  41.         ET0=1;
  42.         TR0=1;
  43.         PWM_QZ=1;  
  44.     PWM_QY=1;  
  45.     PWM_HZ=1;                 
  46.     PWM_HY=1;  
  47. }

  48. //中断服务函数                          
  49. void time_service(void) interrupt 1   
  50. {
  51.         Q_Z++,Q_Y++,H_Z++,H_Y++;                     //进入中断自加

  52.     //前 右
  53.         if(Q_Y<ZKB_QY)                                                 //如果小于设定值,使能端置1,否则置0
  54.         {
  55.           PWM_QY=1;
  56.         }                
  57.         else {PWM_QY=0;}
  58.         if(Q_Y==40)                                                         //如果i加到40;使能端取反,i置0
  59.         {
  60.              PWM_QY=~PWM_QY;
  61.           Q_Y=0;
  62.         }  
  63.        
  64.         //前 左                                                                                  
  65.         if(Q_Z<ZKB_QZ)                                                 //如果小于设定值,使能端置1,否则置0
  66.         {
  67.           PWM_QZ=1;
  68.         }                
  69.         else {PWM_QZ=0;}
  70.         if(Q_Z==40)                                                         //如果i加到40;使能端取反,i置0
  71.         {
  72.              PWM_QZ=~PWM_QZ;
  73.           Q_Z=0;
  74.         }  
  75.        
  76.         //后 右
  77.         if(H_Y<ZKB_HY)                                                 //如果小于设定值,使能端置1,否则置0
  78.         {
  79.           PWM_HY=1;
  80.         }                                                                
  81.         else {PWM_HY=0;}
  82.         if(H_Y==40)                                                         //如果i加到40;使能端取反,i置0
  83.         {
  84.              PWM_HY=~PWM_HY;
  85.           H_Y=0;
  86.         }  
  87.        
  88.     //后 左
  89.         if(H_Z<ZKB_HZ)                                                 //如果小于设定值,使能端置1,否则置0
  90.         {
  91.           PWM_HZ=1;
  92.         }                                                                
  93.         else {PWM_HZ=0;}
  94.         if(H_Z==40)                                                         //如果i加到40;使能端取反,i置0
  95.         {
  96.              PWM_HZ=~PWM_HZ;
  97.           H_Z=0;
  98.         }         
  99.         //定时器0重装初值
  100.         TH0=(65536-100)/256;          
  101.         TL0=(65536-100)%256;
  102. }

  103. //前进
  104. void go()       
  105. {
  106.           ZKB_QZ=13;
  107.         ZKB_QY=8;
  108.         ZKB_HZ=15;
  109.         ZKB_HY=8;
  110.        
  111.          IN2=1;               //前 左 正转            
  112.      IN3=1;               //前 右 正转
  113.          IN22=0;           //后 右 正转
  114.      IN33=0;       //后 左 正转
  115.          
  116.          IN1=0;               //前 左 反转
  117.          IN4=0;               //前 右 反转
  118.      IN11=1;           //后 右 反转
  119.      IN44=1;           //后 左 反转
  120. }
  121. //后退
  122. void back()       
  123. {
  124.         ZKB_QZ=6;
  125.         ZKB_QY=6;
  126.         ZKB_HZ=6;
  127.         ZKB_HY=6;
  128.        
  129.          IN2=0;               //前 左 正转            
  130.      IN3=0;               //前 右 正转
  131.          IN22=1;           //后 右 正转
  132.      IN33=1;       //后 左 正转
  133.          
  134.          IN1=1;               //前 左 反转
  135.          IN4=1;               //前 右 反转
  136.      IN11=0;           //后 右 反转
  137.      IN44=0;           //后 左 反转
  138. }
  139. //右转
  140. void right()       
  141. {
  142.         do
  143.         {
  144.         ZKB_QZ=15;
  145.         ZKB_QY=35;
  146.         ZKB_HZ=15;
  147.         ZKB_HY=35;
  148.        
  149.          IN2=0;               //前 左 反转            
  150.      IN3=1;               //前 右 反转
  151.          IN22=0;           //后 右 反转
  152.      IN33=1;       //后 左 反转
  153.          
  154.          IN1=1;               //前 左 正转
  155.          IN4=0;               //前 右 正转
  156.      IN11=1;           //后 右 正转
  157.      IN44=0;           //后 左 正转
  158.         }
  159.         while(hw_mid==1);
  160. }
  161. //左转
  162. void left()       
  163. {
  164.         do
  165.         {
  166.         ZKB_QZ=15;
  167.         ZKB_QY=35;
  168.         ZKB_HZ=15;
  169.         ZKB_HY=35;
  170.        
  171.          IN2=1;               //前 左 反转            
  172.      IN3=0;               //前 右 反转
  173.          IN22=1;           //后 右 反转
  174.      IN33=0;       //后 左 反转
  175.          
  176.          IN1=0;               //前 左 正转
  177.          IN4=1;               //前 右 正转
  178.      IN11=0;           //后 右 正转
  179.      IN44=1;           //后 左 正转
  180.          }
  181.          while(hw_mid==1);
  182. }
  183. void stop()                   //停止函数
  184. {
  185.          IN2=0;               //前 左 正转            
  186.      IN3=0;               //前 右 正转
  187.          IN22=0;           //后 右 正转
  188.      IN33=0;       //后 左 正转
  189.          
  190.          IN1=0;               //前 左 反转
  191.          IN4=0;               //前 右 反转
  192.      IN11=0;           //后 右 反转
  193.      IN44=0;           //后 左 反转
  194. }
  195. void go_rignt()
  196. {
  197.         ZKB_QZ=5;
  198.         ZKB_QY=5;
  199.         ZKB_HZ=5;
  200.         ZKB_HY=5;
  201.        
  202.          IN2=1;               //前 左 反转            
  203.      IN3=0;               //前 右 反转
  204.          IN22=1;           //后 右 反转
  205.      IN33=0;       //后 左 反转
  206.          
  207.          IN1=0;               //前 左 正转
  208.          IN4=1;               //前 右 正转
  209.      IN11=0;           //后 右 正转
  210.      IN44=1;           //后 左 正转
  211. }
  212. void go_left()
  213. {
  214.         ZKB_QZ=5;
  215.         ZKB_QY=5;
  216.         ZKB_HZ=5;
  217.         ZKB_HY=5;
  218.        
  219.          IN2=0;               //前 左 反转            
  220.      IN3=1;               //前 右 反转
  221.          IN22=0;           //后 右 反转
  222.      IN33=1;       //后 左 反转
  223.          
  224.          IN1=1;               //前 左 正转
  225.          IN4=0;               //前 右 正转
  226.      IN11=1;           //后 右 正转
  227.      IN44=0;           //后 左 正转
  228. }
  229. void huigui()
  230. {
  231.   u8 num;       
  232.           for(num=2;num>0;num--)
  233.                 {
  234.                           if(hw_left==0 & hw_mid==1 & hw_right==1)                                  
  235.                        {
  236.                        go_rignt();
  237.                     }
  238.                         if(hw_left==1 & hw_mid==1 & hw_right==0)                                  
  239.                        {
  240.                         go_left();
  241.                        }
  242.                
  243.                 }
  244. }
  245. void X_J()         //循迹函数
  246. {
  247.         u8 P_D;                                                             //定义判断
  248.         //未检测到黑线
  249.         if(hw_left==1 & hw_mid==1 & hw_right==1)
  250.         {
  251.             P_D=0;
  252.         }                                                                                                                       
  253.         //中间检测到黑线
  254.         if(hw_left==1 & hw_mid==0 & hw_right==1)                                  
  255.            {
  256.           P_D=1;
  257.         }
  258.         //左面检测到黑线
  259.         if(hw_left==0 & hw_mid==1 & hw_right==1)                                  
  260.            {
  261.           P_D=2;
  262.         }
  263.         //右面检测到黑线
  264.         if(hw_left==1 & hw_mid==1 & hw_right==0)                                  
  265.            {
  266.           P_D=3;
  267.         }
  268.         //全部都检测到黑线后退
  269.         if(hw_left==0 & hw_mid==0 & hw_right==0)                                  
  270.            {
  271.           P_D=4;
  272.         }     
  273.         //中间和左面检测到黑线
  274.         if(hw_left==0 & hw_mid==0 & hw_right==1)                                  
  275.            {
  276.           P_D=5;
  277.         }  
  278.         //中间和右面检测到黑线
  279.         if(hw_left==1 & hw_mid==0 & hw_right==0)                                  
  280.            {
  281.           P_D=6;
  282.         }  
  283.         switch (P_D)
  284.         {                                  
  285.                 case 0: huigui();break;        //情况0,停止
  286.                 case 1: go();    break;        //情况1,前进
  287.                 case 2: left();  break;        //情况2,左转
  288.                 case 3: right(); break;        //情况3,右转
  289.                 case 4:        back();         break; //情况4,后退
  290.             case 5:        left();         break; //情况5,左转
  291.             case 6:        right(); break; //情况6,右转
  292.         }
  293. }
  294. //主函数
  295. void main()
  296. {
  297.         Z_D();
  298.         delay(5);
  299.         while(1)
  300.         {
  301.           X_J();
  302.         }
  303. }
复制代码

所有资料51hei提供下载:
main.zip (1.73 KB, 下载次数: 17)



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:314803 发表于 2019-5-20 16:21 | 只看该作者
有原理图哇?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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