找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机小车控制系统源代码

[复制链接]
跳转到指定楼层
楼主
ID:394085 发表于 2020-2-10 20:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <STC15F2K60S2.H>
  2. #include "stdio.h"

  3. #include "intrins.h"


  4. sbit DJ1=P2^4;//L298N  IN1
  5. sbit DJ2=P2^5;//L298N  IN2
  6. sbit DJ3=P2^6;//L298N  IN3
  7. sbit DJ4=P2^7;//L298N  IN4


  8. sbit tirg=P0^5;//超声波
  9. sbit tur=P0^6;//舵机
  10. sbit echo=P0^7;//超声波

  11. void forward(){          //直走
  12.         DJ1=1;DJ2=0;
  13.   DJ3=0;DJ4=1;
  14. }

  15. void back(){          //直走
  16.         DJ1=0;DJ2=1;
  17.   DJ3=1;DJ4=0;
  18. }
  19. void stop(){          //停止
  20.         DJ1=1;DJ2=1;
  21.         DJ3=1;DJ4=1;
  22. }
  23. void right(){          //右转
  24.         DJ1=1;DJ2=0;
  25.         DJ3=1;DJ4=1;
  26. }
  27. void D_right(){          //大右转
  28.         DJ1=1;DJ2=0;
  29.         DJ3=1;DJ4=0;
  30. }
  31. void left(){          //左转
  32.         DJ1=1;DJ2=1;
  33.         DJ3=0;DJ4=1;
  34. }
  35. void D_left(){          //大左转
  36.         DJ1=0;DJ2=1;
  37.         DJ3=0;DJ4=1;
  38. }

  39. void UartInit(void)                //9600bps@11.0592MHz
  40. {
  41.         PCON &= 0x7F;                //波特率不倍速
  42.         SCON = 0x50;                //8位数据,可变波特率
  43.         AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
  44.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  45.         TMOD &= 0x0F;                //清除定时器1模式位
  46.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  47.         TL1 = 0xFD;                //设定定时初值
  48.         TH1 = 0xFD;                //设定定时器重装值
  49.         ET1 = 0;                //禁止定时器1中断
  50.         TR1 = 1;                //启动定时器1
  51.         ES=1;
  52.         EA=1;
  53. }
  54. void timer0_init()
  55. {
  56.         TMOD=0x05;
  57.         TH0=0;
  58.         TL0=0;
  59.         TR0=1;
  60. }
  61. void Timer2Init(void)                //0微秒@11.0592MHz
  62. {
  63.         AUXR &= 0xFB;                //定时器时钟12T模式
  64.         T2L = 0x00;                //设置定时初值
  65.         T2H = 0x00;                //设置定时初值
  66.         AUXR |= 0x10;                //定时器2开始计时
  67.         IE2 |= 0x04;
  68.         EA=1;
  69. }
  70. unsigned char refresh=0;
  71. unsigned short x;

  72. bit sendflags=1;
  73. void senddata(unsigned short datt,unsigned short  distance)//数据包发送
  74. {
  75.         sendflags=1;
  76.         SBUF=1;
  77.         while(sendflags);
  78.         sendflags=1;
  79.         SBUF=2;
  80.         while(sendflags);
  81.         sendflags=1;
  82.         SBUF=3;
  83.         while(sendflags);
  84.         sendflags=1;
  85.         SBUF=4;
  86.         while(sendflags);
  87.         sendflags=1;
  88.         SBUF=datt;
  89.         while(sendflags);
  90.                 sendflags=1;
  91.         SBUF=datt;
  92.         while(sendflags);
  93.                 sendflags=1;
  94.         SBUF=distance;
  95.         while(sendflags);
  96.                         sendflags=1;
  97.                 SBUF=(distance>>8);
  98.         while(sendflags);
  99. }
  100. //void timer4_3_init()
  101. //{
  102. //        T4T3M=0x8c;//timer4 定时器  timer3 计数器
  103. //        T4H=0;
  104. //        T4L=0;
  105. //        T3H=0;
  106. //        T3L=0;
  107. //}
  108. void Delay250ms()                //@11.0592MHz
  109. {
  110.         unsigned char i, j, k;

  111.         _nop_();
  112.         _nop_();
  113.         i = 11;
  114.         j = 130;
  115.         k = 111;
  116.         do
  117.         {
  118.                 do
  119.                 {
  120.                         while (--k);
  121.                 } while (--j);
  122.         } while (--i);
  123. }
  124. void Delay22us()                //@11.0592MHz
  125. {
  126.         unsigned char i;

  127.         _nop_();
  128.         i = 58;
  129.         while (--i);
  130. }

  131. bit isback=0;//后退标志位

  132. unsigned short motorturnround()//超声波测距函数
  133. {
  134.         unsigned int j=0;
  135.         unsigned short  distance;
  136.         AUXR &= 0x7f;                //定时器2关闭
  137.         T2L = 0x00;                //设置定时初值
  138.         T2H = 0x00;                //设置定时初值
  139.         tirg=1;
  140.         Delay22us();
  141.         tirg=0;
  142.         while(!echo)
  143.         {
  144.                 j++;
  145.                 if(j>32000)
  146.                 {
  147.                         return 0;
  148.                 }
  149.         }
  150.         j=0;
  151.         AUXR |= 0x10;                //定时器2开始计时
  152.         while(echo)
  153.         {
  154.                         j++;
  155.                 if(j>32000)
  156.                 {
  157.                         return 0;
  158.                 }
  159.         }
  160.         distance=(T2H*256.0f+T2L)*17.0f/921.6f;//计算距离
  161.         return distance;
  162. }
  163. void Delay100us()                //@11.0592MHz
  164. {
  165.         unsigned char i, j;

  166.         _nop_();
  167.         _nop_();
  168.         i = 2;
  169.         j = 15;
  170.         do
  171.         {
  172.                 while (--j);
  173.         } while (--i);
  174. }
  175. unsigned char movaue=5;
  176. void turn()//舵机转动
  177. {
  178.          unsigned char i;
  179.         tur=1;
  180.         for(i=0;i<movaue;i++)
  181.         {
  182.                 Delay100us();
  183.         }
  184.         tur=0;
  185. }
  186. void main()
  187. {
  188.         unsigned short datt=0;
  189.         timer0_init();
  190.         Timer2Init();
  191.         UartInit();
  192.         tirg=0;
  193.         tur=0;
  194.         while(1)
  195.         {
  196.                 if(refresh)
  197.                 {                       
  198.                         datt=motorturnround();
  199. //                        Delay250ms();
  200.                         x=x*13;
  201.                                
  202.                         if(isback)
  203.                         {
  204.                                 x=x|0x80;
  205.                         }
  206.                         senddata(x,datt);
  207.                         refresh=0;
  208.                         TH0=0;
  209.                         TL0=0;
  210.                         TR0=1;
  211.                         T2L = 0x00;                //设置定时初值
  212.                         T2H = 0x00;                //设置定时初值
  213.                         AUXR |= 0x10;                //定时器2开始计时
  214.                         turn();
  215.                 }
  216.        

  217.        
  218.         }
  219.        
  220. }

  221. char state=0;
  222. char iscontrolmode=1;//是否是控制模式不循迹可以不管
  223. char headercheck=0;
  224. void uart() interrupt 4
  225. {
  226.         if(RI==1)
  227.         {
  228.                 if(iscontrolmode)
  229.                 {
  230.                         if(!headercheck)
  231.                         {
  232.                         switch(state)//状态解码
  233.                         {
  234.                                 case 0:
  235.                                         if(SBUF==1)
  236.                                         {
  237.                                                 state++;
  238.                                         }
  239.                                        
  240.                                         break;
  241.                                                 case 1:
  242.                                         if(SBUF==2)
  243.                                         {
  244.                                                 state++;
  245.                                         }
  246.                                         else
  247.                                         {
  248.                                                 state=0;
  249.                                         }
  250.                                         break;
  251.                                                 case 2:
  252.                                         if(SBUF==3)
  253.                                         {
  254.                                                 state++;
  255.                                         }
  256.                                         else
  257.                                         {
  258.                                                 state=0;
  259.                                         }
  260.                                         break;
  261.                                                 case 3:
  262.                                         if(SBUF==4)
  263.                                         {
  264.                                                 state=0;
  265.                                                 headercheck=1;
  266.                                         }
  267.                                         else
  268.                                         {
  269.                                                 state=0;
  270.                                         }
  271.                                         break;
  272.                         }
  273.                 }
  274.                 else
  275.                 {
  276.                         switch(SBUF)
  277.                         {
  278.                                 case 66:
  279.                                         forward();
  280.                                 isback=0;
  281.                                         break;
  282.                                         case 62:
  283.                                                 back();
  284.                                         isback=1;
  285.                                         break;
  286.                                 case 44:
  287.                                                 D_left();
  288.                                 isback=0;
  289.                                         break;
  290.                                 case 47:
  291.                                         D_right();
  292.                                 isback=0;
  293.                                         break;
  294.                                 case 18:
  295.                                         stop();
  296.                                 isback=0;
  297.                                         break;
  298.                         }
  299.                         headercheck=0;
  300.                 }
  301.                         if(SBUF==6)//舵机相关
  302.                         {
  303.                                 if(movaue<24)
  304.                                 {
  305.                                         movaue++;
  306.                                 }
  307.                         }
  308.                         else
  309.                         {
  310.                                 if(SBUF==5)//舵机相关
  311.                                 {
  312.                                         if(movaue>5)
  313.                                         {
  314.                                                 movaue--;
  315.                                         }
  316.                                 }
  317.                         }
  318.                 }
  319.                
  320.                 RI=0;
  321.         }
  322.         if(TI==1)
  323.         {
  324.                 TI=0;
  325.                 sendflags=0;
  326.         }
  327. }
  328.         //67.22mm

  329. void t2_isr() interrupt 12 using 1//读取计数值(用于测量速度)
  330. {
  331.         TR0=0;
  332.         x=TH0;
  333.         x=(x<<8)+TL0;
  334.         refresh=1;
  335.        
  336. }
复制代码


蓝牙遥控小车.7z

1.73 MB, 下载次数: 12, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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