找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5437|回复: 6
收起左侧

智能车资料 有单片机源码,原理图和PCB库

[复制链接]
ID:224914 发表于 2017-11-16 20:54 | 显示全部楼层 |阅读模式
智能车的原理图如下:
主控.png 7805.png 红外.png
驱动 负极1厘米  12V  6毫米  其他2mm.png 信号处理.png

单片机源程序:
  1. include "reg52.h"
  2. # include<intrins.h>

  3. //定义全局变量

  4. char count=0,cheer=0;         //  调节占空比
  5. char left=0,right=0;  // 左右轮速度          可在主函数中修改
  6. char duojizhongzhi=0;       // 舵机中值
  7. //  定义I/O口
  8. //  定义 红外检测  电机引脚 舵机   以上IO口可修改  
  9. //  定义 红外检测         

  10. sbit hw1=P2^0;
  11. sbit hw2=P2^1;
  12. sbit hw3=P2^2;
  13. sbit hw4=P2^3;
  14. sbit hw5=P2^4;
  15. sbit hw6=P2^5;
  16. sbit hw7=P2^6;
  17. sbit hw8=P2^7;

  18. //定义电机I/O口          可修改

  19. sbit dianji1=P1^0;
  20. sbit dianji2=P1^1;
  21. sbit dianji3=P1^2;
  22. sbit dianji4=P1^3;

  23. // 定义舵机         I/O口          可修改

  24. sbit duoji=P1^7;

  25. //  申明 自定义函数          // 不懂勿动
  26. void time1init();
  27. void time0init();

  28. // 红外检测情况          如果用少于8个红外  可自行删减
  29. int hongwaijiance ()                //8个红外检测黑线情况   返回值为 整形
  30. {                                                                                //红外信号为1检测白,为0检测黑(不一定,根据情况自行调整0和1)
  31.         if((hw1==0)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1)        )  //左边第一个检测到黑线并且其余
  32.                 return 1;                                                                                                                                                                                                                                                                                                   //7个检测白,此时返回1
  33.         
  34.         if((hw1==1)&&(hw2==0)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1)        )          // 左边第二个检测黑线并且其余7个
  35.                 return 2;                                                                                                                                                                                                                                                                                                                //检测白,此时返回2
  36.         
  37.         if((hw1==1)&&(hw2==1)&&(hw3==0)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1)        )        //
  38.                 return 3;
  39.         
  40.         if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==0)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==1)        )        //
  41.                 return 4;
  42.         
  43.         if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==0)&&(hw6==1)&&(hw7==1)&&(hw8==1)        )         //
  44.                 return 5;
  45.         
  46.         if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==0)&&(hw7==1)&&(hw8==1)        )        //
  47.                 return 6;
  48.         
  49.         if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==0)&&(hw8==1)        )        //
  50.                 return 7;
  51.         
  52.         if((hw1==1)&&(hw2==1)&&(hw3==1)&&(hw4==1)&&(hw5==1)&&(hw6==1)&&(hw7==1)&&(hw8==0)        )        //
  53.                 return 8;
  54.                                                                                        
  55.                 return 0;         // 以上情况都没有  什么都不执行
  56. }

  57. //     延时函数  延时2S             用于延时启动

  58. void delay2s()   //误差 0us
  59. {
  60.     unsigned char a,b,c,n;
  61.     for(c=167;c>0;c--)
  62.         for(b=39;b>0;b--)
  63.             for(a=152;a>0;a--);
  64.     for(n=1;n>0;n--);
  65. }

  66. //      主函数
  67. void main()
  68. {
  69.     char Data,Data_1;
  70.         time0init();          // 定时器函数
  71.         time1init();          // 定时器函数
  72.         left=50;    // 左轮速度
  73.         right=50;        // 右轮速度
  74.         duojizhongzhi=15;        //  舵机中值
  75.         delay2s();   //  延时启动
  76.         while(1)
  77.                 {   
  78.                         Data=hongwaijiance();                        //对变量 Data 赋值
  79.                         if(Data == 0)                        //
  80.                                 Data=Data_1;                //
  81.                         Data_1=Data;                        //这4句使车冲出去后能自己回来
  82.                         //  停车程序  
  83.                     if((hw1==0)&&(hw2==0)&&(hw3==0)&&(hw4==0)&&(hw5==0)&&(hw6==0)&&(hw7==0)&&(hw8==0)        )
  84.                     {
  85.                                 _nop_();
  86.                                 _nop_();
  87.                         if ( (hw1==0)&&(hw2==0)&&(hw3==0)&&(hw4==0)&&(hw5==0)&&(hw6==0)&&(hw7==0)&&(hw8==0) )
  88.                                 {
  89.                                         left=0;
  90.                                         right=0;
  91.                                         duojizhongzhi=16;     //  此时该值为舵机在最中央位置的值   也就是中值
  92.                                 }
  93.                     }
  94.                         switch(Data)                        //switch语句对之前红外检测情况进行处理(由实际情况调整里面各变量数值)
  95.                         {                          

  96.                         case 1: duojizhongzhi = 16;left = 90;right =20;  _nop_(); _nop_();        break;        //Delay_Nms(8)给舵机转动留时间,数8可调整
  97.                         case 2:                                                                                                                                                                                                                                  break;
  98.                         case 3:                                                                                                                                                                                                                                        break;
  99.                         case 4:                                                                                                                                                                                                                                  break;
  100.                         case 5:                                                                                                                                                                                                                                        break;                                
  101.                         case 6:                                                                                                                                                                                                                                        break;
  102.                         case 7:                                                                                                                                                                                                                                        break;
  103.                         case 8:                                                                                                                                                                                                                                  break;
  104.                                 
  105.                         default:
  106.                                 break;
  107.                         }
  108.                
  109.                            
  110.                 }
  111. }

  112. // 定时器 0  中断   

  113. void time0init()
  114. {
  115.   TMOD=0X11;
  116.   TH0=0XFF;
  117.   TL0=0XF6;
  118.   ET0=1;
  119.   TR0=1;
  120.   EA=1;
  121. }

  122. // 定时器 1  中断

  123. void time1init()
  124. {
  125. //        TMOD=0X11;
  126.         EA=1;
  127.         ET1=1;
  128.         TR1=1;
  129.         TL1=0XF6;
  130.         TH1=0XFF;
  131. }

  132. // 定时器0控制电机速度
  133. /***********************
  134.   占空比越大 速度越快
  135. ************************/
  136. void  time0()   interrupt 1            // 定时器0执行函数            中断号1
  137. {
  138.   //重新装载
  139.    TL0=0XF6;                                 //  初值           
  140.    TH0=0XFF;                                 // 每隔10US  进一次中断
  141.    count++;                  //占空比不断增加
  142.    if(count>100)
  143.    count=0;
  144.    if(count<left)  // 占空比对应的速度小于需要的速度  让电机加速
  145.    {
  146.    dianji1=1;                 
  147.    dianji2=0;
  148.    }
  149.    else
  150.    {
  151.    dianji1=0;                 
  152.    dianji2=1;
  153.    }
  154.    if(count<right)  // 占空比对应的速度小于需要的速度  让电机加速
  155.    {
  156.    dianji3=1;                 
  157.    dianji4=0;
  158.    }
  159.    else
  160.    {
  161.    dianji4=0;                 
  162.    dianji3=1;
  163.    }
  164. }

  165. // 定时器1控制舵机转向
  166. /***********************
  167. 占空比越大偏转的角度越大
  168. ***********************/
  169. void  time1()  interrupt 3            //定时器1执行函数   中断号3
  170. {
  171.         TL1=0XF6;
  172.     TH1=0XFF;
  173.         cheer++;  // 占空比增加
  174.         if(cheer>100)
  175.         cheer=0;
  176.         if(cheer<duojizhongzhi)             // 如果占空比所对应的角度没达到所需要的值
  177.         duoji=1;                         //  高电平
  178.         else
  179.         duoji=0;
  180. }
复制代码
  1. //  智能车程序
  2. # include "reg52.h"                 //  头文件 包含一定定义
  3. # include "intrins.h"
  4. //  用uint  uchar 代替无符号整型 字符型
  5. typedef unsigned int uint ;                  
  6. typedef unsigned char uchar;

  7. //  定义 电机引脚 可修改
  8. sbit IN1=P1^0;
  9. sbit IN2=P1^1;
  10. sbit IN3=P1^2;
  11. sbit IN4=P1^3;

  12. // 定义红外引脚  可修改
  13. sbit Infrared1=P0^0;
  14. sbit Infrared2=P0^1;
  15. sbit Infrared3=P0^2;
  16. sbit Infrared4=P0^3;
  17. sbit Infrared5=P0^4;
  18. sbit Infrared6=P0^5;
  19. sbit Infrared7=P0^6;
  20. sbit Infrared8=P0^7;

  21. // 定义舵机引脚          可修改

  22. sbit Servo=P2^0;

  23. // 定义变量  左右轮速度 及占空比                  舵机中值
  24. uint speed_left=0, speed_right=0,count=0,add=0,djzz=0;
  25. uint receive;  //  用于接受返回值

  26. // 定义自定义函数
  27. void time0init();
  28. void delay2s();
  29. void delay100us();
  30. uint  HW() ;
  31. void Drive( uint left ,uint right,uint dj );
  32. void Stop();
  33. //  主函数
  34. void main()
  35. {        
  36.         uchar Data_1;        //申明变量
  37.         time0init(); // 不断执行定时器中断        
  38.         delay2s(); // 延时启动
  39.         // 以下需要修改
  40.         while(1)
  41.         {
  42.                 djzz=15;        //改这个值 使舵机居中
  43.                   delay100us();
  44.                 break;
  45.         }         
  46.         speed_left=1;           // 调节电机速度
  47.         speed_right=1;            // 调节电机速度
  48.         //   以上需要修改
  49.         while(1)
  50.         {         
  51.                         receive=HW();        //receive接受HW函数返回值        
  52.                         if(receive == 0)        //使车自己回去               
  53.                         receive=Data_1;        
  54.                         Data_1=receive;
  55.                  HW();           //引用自定义函数
  56.         Drive( speed_left,speed_right,djzz ); //引用自定义函数
  57.                 Stop();          //停止
  58.         }
  59. }

  60. //  延时函数  延时2S
  61. void delay2s()   //误差 0us
  62. {
  63.     unsigned char a,b,c;
  64.     for(c=127;c>0;c--)
  65.         for(b=235;b>0;b--)
  66.             for(a=32;a>0;a--);
  67.     _nop_();
  68. }

  69. void delay100us()   //误差 0us
  70. {
  71.     unsigned char a,b;
  72.     for(b=1;b>0;b--)
  73.         for(a=47;a>0;a--);
  74. }

  75. //红外检测函数                //需要自己添加情况
  76. uint HW()
  77. {
  78. //如果红外一检测到 执行情况
  79.         if( Infrared1==1&&Infrared2==0&&Infrared3==0&&Infrared4==0&&Infrared5==0&&Infrared6==0&&Infrared7==0&&Infrared8==0 )
  80.                          return 1;

  81.         /*
  82.                         以下情况复制上面自己改
  83.         */
  84.         else
  85.         {
  86.                 return 0;
  87.         }
  88. }
  89. // 电机驱动函数           //需要自己添加情况
  90. void Drive( uint left ,uint right,uint dj )
  91. {
  92.         if( receive==1 )
  93.         {
  94.                 left =10;
  95.                 right=10;
  96.                 dj=10;
  97.         }
  98.         /*
  99.           根据所需要自己添加
  100.         */
  101. }
  102. /*******************************************************************************
  103.                                                  以下函数不能修改
  104. *******************************************************************************/
  105. //  停止函数    当红外八个灯同时检测到 之后停止
  106. void Stop()
  107. {
  108.            if( Infrared1==1&&Infrared2==1&&Infrared3==1&&Infrared4==1&&Infrared5==1&&Infrared6==1&&Infrared7==1&&Infrared8==1 )
  109.         {
  110.                 delay100us();
  111.                 if( Infrared1==1&&Infrared2==1&&Infrared3==1&&Infrared4==1&&Infrared5==1&&Infrared6==1&&Infrared7==1&&Infrared8==1 )
  112.                 speed_left=0;
  113.                 speed_right=0;        
  114.         }
  115. }

  116. void time0init()
  117. {
  118.         TMOD|=0X11;
  119.         TH0=(65536-50)/256;
  120.         TL0=(65536-50)%256;
  121.         TH1=(65536-100)/256;
  122.         TL1=(65536-100)%256;
  123.         ET0=1;
  124.         ET1=1;
  125.         EA=1;
  126.         TR0=1;
  127.         TR1=1;
  128. }
  129. //  定时器0 用于控制电机速度
  130. void Motor0 () interrupt 1
  131. {
  132.         TR0=0;
  133.         TH0=(65536-50)/256;
  134.         TL0=(65536-50)%256;
  135.         count++;
  136.         if(count>100)
  137.         {
  138.                 count=0;
  139.         }
  140.         if( count>speed_left )        //  
  141.         {
  142.                 IN1=0;
  143.                 IN2=0;
  144.         }
  145.         else
  146.         {
  147.                 IN1=1;
  148.                 IN2=0;
  149.         }
  150.                 if( count>speed_right )        //  
  151.         {
  152.                 IN3=0;
  153.                 IN4=0;
  154.         }
  155.         else
  156.         {
  157.                 IN3=1;
  158.                 IN4=0;
  159.         }
  160.         TR0=1;
  161. }                                
  162. void ServoTemper() interrupt 3
  163. {   
  164.         add++;
  165.         TH1=(65536-100)/256;
  166.         TL1=(65536-100)%256;
  167.         if( add>=200 )
  168.         {
  169.                 add=0;
  170.         }
  171.         if( djzz>=add )
  172.         {
  173.                 Servo=1;
  174.         }         
  175.         else
  176.         {
  177.                 Servo=0;
  178.         }
  179. }<div class="quote"><blockquote>
复制代码

原理图.7z

826.6 KB, 下载次数: 55, 下载积分: 黑币 -5

最新库.7z

79.76 KB, 下载次数: 38, 下载积分: 黑币 -5

评分

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

查看全部评分

回复

使用道具 举报

ID:224914 发表于 2017-11-16 20:56 | 显示全部楼层
这个舵机调时需要延时 ,用的是定时器仿真PWM,望互相学习
回复

使用道具 举报

ID:87193 发表于 2017-11-30 14:50 | 显示全部楼层
不知道做出来的实物是怎么样的呢
回复

使用道具 举报

ID:224914 发表于 2018-1-18 21:13 | 显示全部楼层
lemon0210 发表于 2017-11-30 14:50
不知道做出来的实物是怎么样的呢

白色赛道中间有黑色胶带,能按照黑色的轨迹跑
回复

使用道具 举报

ID:224914 发表于 2018-1-18 21:15 | 显示全部楼层
lemon0210 发表于 2017-11-30 14:50
不知道做出来的实物是怎么样的呢

白色赛道,黑色轨迹,能根据轨迹跑
回复

使用道具 举报

ID:818853 发表于 2020-9-14 14:23 | 显示全部楼层

不知道做出来的实物是怎么样的呢
回复

使用道具 举报

ID:1068978 发表于 2023-3-29 21:08 | 显示全部楼层
有没有CH32V307的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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