找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1875|回复: 10
收起左侧

在51hei论坛学习了一些时间,准备用51单片机改玩具车做智能小车,发帖开工

[复制链接]
ID:871292 发表于 2021-1-30 12:34 | 显示全部楼层 |阅读模式

学习板

学习板

零件

零件


零件没买全,准备用学习板写hex文件,欢迎大家指导,谢谢!



回复

使用道具 举报

ID:143767 发表于 2021-1-30 13:17 | 显示全部楼层
看样子还缺好多电子零件和模块
回复

使用道具 举报

ID:871292 发表于 2021-1-30 13:22 | 显示全部楼层
是的啊,哈,没所谓,先让它跑起来再说,最怕一直在计划,一直在采购,但就是不试验
回复

使用道具 举报

ID:190577 发表于 2021-1-30 16:28 | 显示全部楼层
准备怎么个改法?
回复

使用道具 举报

ID:390416 发表于 2021-1-30 16:55 | 显示全部楼层
你应该先搞清楚需要什么配件 然后设计电路图 然后买材料 再看看 单片机的视频教程 然后学习框架式编程。做个遥控啥的 最后调试 测试
回复

使用道具 举报

ID:390416 发表于 2021-1-30 17:02 | 显示全部楼层
其实 我们开发板 本来就是为了设计智能车遥控器用的 无奈时间精力有限 过段时间设计一款遥控车玩玩
回复

使用道具 举报

ID:871292 发表于 2021-1-30 17:08 | 显示全部楼层
谢谢大家哈!刚入门,先试验一下,再增加其它功能,这样压力没这么大
回复

使用道具 举报

ID:155507 发表于 2021-1-30 22:15 | 显示全部楼层
我给你来个 超声波避障 程序试试


  1.         #include <AT89x51.H>
  2.         #include <intrins.h>

  3.         #define Sevro_moto_pwm     P2_7           //接舵机信号端输入PWM信号调节速度

  4.         #define  ECHO  P2_4                                   //超声波接口定义
  5.         #define  TRIG  P2_5                                   //超声波接口定义

  6.         #define Left_moto_go      {P1_0=1,P1_1=0,P1_2=1,P1_3=0;}    //左边两个电机向前走
  7.         #define Left_moto_back    {P1_0=0,P1_1=1,P1_2=0,P1_3=1;}         //左边两个电机向后转
  8.         #define Left_moto_Stop    {P1_0=0,P1_1=0,P1_2=0,P1_3=0;}    //左边两个电机停转                     
  9.         #define Right_moto_go     {P1_4=1,P1_5=0,P1_6=1,P1_7=0;}        //右边两个电机向前走
  10.         #define Right_moto_back   {P1_4=0,P1_5=1,P1_6=0,P1_7=1;}        //右边两个电机向前走
  11.         #define Right_moto_Stop   {P1_4=0,P1_5=0,P1_6=0,P1_7=0;}        //右边两个电机停转  


  12.         unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
  13.         unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
  14.         unsigned char disbuff[4]          ={ 0,0,0,0,};
  15.     unsigned char posit=0;

  16.            unsigned char pwm_val_left  = 0;//变量定义
  17.         unsigned char push_val_left =14;//舵机归中,产生约,1.5MS 信号
  18.     unsigned long S=0;
  19.         unsigned long S1=0;
  20.         unsigned long S2=0;
  21.         unsigned long S3=0;
  22.         unsigned long S4=0;
  23.         unsigned int  time=0;                    //时间变量
  24.         unsigned int  timer=0;                        //延时基准变量
  25.         unsigned char timer1=0;                        //扫描时间变量                                       

  26.                 void delay(unsigned int k)          //延时函数
  27. {   
  28.      unsigned int x,y;
  29.            for(x=0;x<k;x++)
  30.              for(y=0;y<2000;y++);
  31. }

  32.     void Display(void)                                  //扫描数码管
  33.         {
  34.          if(posit==0)
  35.          {P0=(discode[disbuff[posit]])&0x7f;}//产生点
  36.          else
  37.          {P0=discode[disbuff[posit]];}

  38.           if(posit==0)
  39.          { P2_1=0;P2_2=1;P2_3=1;}
  40.           if(posit==1)
  41.           {P2_1=1;P2_2=0;P2_3=1;}
  42.           if(posit==2)
  43.           {P2_1=1;P2_2=1;P2_3=0;}
  44.           if(++posit>=3)
  45.           posit=0;
  46.         }

  47.      void  StartModule()                       //启动测距信号
  48.    {
  49.           TRIG=1;                                        
  50.           _nop_();
  51.           _nop_();
  52.           _nop_();
  53.           _nop_();
  54.           _nop_();
  55.           _nop_();
  56.           _nop_();
  57.           _nop_();
  58.           _nop_();
  59.           _nop_();
  60.           _nop_();
  61.           _nop_();
  62.           _nop_();
  63.           _nop_();
  64.           _nop_();
  65.           _nop_();
  66.           _nop_();
  67.           _nop_();
  68.           _nop_();
  69.           _nop_();
  70.           _nop_();
  71.           TRIG=0;
  72.    }

  73.           void Conut(void)                   //计算距离
  74.         {
  75.           while(!ECHO);                       //当RX为零时等待
  76.           TR0=1;                               //开启计数
  77.           while(ECHO);                           //当RX为1计数并等待
  78.           TR0=0;                                   //关闭计数
  79.           time=TH0*256+TL0;                   //读取脉宽长度
  80.           TH0=0;
  81.           TL0=0;
  82.           S=(time*1.7)/100;        //算出来是CM
  83.           disbuff[0]=S%1000/100;   //更新显示
  84.           disbuff[1]=S%1000%100/10;
  85.           disbuff[2]=S%1000%10 %10;
  86.         }

  87. //前速前进
  88.      void  run(void)
  89. {        Left_moto_back ;                           
  90.          //Left_moto_go ;     //左电机往前走
  91.          Right_moto_go ;    //右电机往前走
  92. }

  93. //前速后退
  94.      void  backrun(void)
  95. {         Left_moto_go ;
  96.          //Left_moto_back ;   //左电机往前走
  97.          Right_moto_back ;  //右电机往前走
  98. }

  99. //左转
  100.      void  leftrun(void)
  101. {         Left_moto_go ;
  102.          //Left_moto_back ;   //左电机往前走
  103.          Right_moto_go ;   //右电机往前走
  104. }

  105. //右转
  106.      void  rightrun(void)
  107. {         Left_moto_back ;
  108.          //Left_moto_go ;     //左电机往前走
  109.          Right_moto_back ;  //右电机往前走
  110. }
  111. /************************************************************************/
  112. //STOP
  113.      void  stoprun(void)
  114. {
  115.          Left_moto_Stop ;   //左电机停走
  116.          Right_moto_Stop ;  //右电机停走
  117. }
  118. /************************************************************************/
  119. void  COMM( void )                      
  120.   {
  121.                
  122.                  
  123.                   push_val_left=5;          //舵机向左转90度
  124.                   timer=0;
  125.                   while(timer<=4000); //延时400MS让舵机转到其位置
  126.                   StartModule();          //启动超声波测距
  127.           Conut();                           //计算距离
  128.                   S2=S;  
  129.   
  130.                   push_val_left=23;          //舵机向右转90度
  131.                   timer=0;
  132.                   while(timer<=4000); //延时400MS让舵机转到其位置
  133.                   StartModule();          //启动超声波测距
  134.           Conut();                          //计算距离
  135.                   S4=S;        
  136.        

  137.                   push_val_left=14;          //舵机归中
  138.                   timer=0;
  139.                   while(timer<=4000); //延时400MS让舵机转到其位置

  140.                   StartModule();          //启动超声波测距
  141.           Conut();                          //计算距离
  142.                   S1=S;        

  143.           if((S2<20)||(S4<20)) //只要左右各有距离小于,20CM小车后退
  144.                   {
  145.                   backrun();                   //后退
  146.                   timer=0;
  147.                   while(timer<=4000);
  148.                   }
  149.                   
  150.                   if(S2>S4)                 
  151.                      {
  152.                                 rightrun();          //车的左边比车的右边距离小        右转       
  153.                         timer=0;
  154.                         while(timer<=4000);
  155.                      }                                     
  156.                        else
  157.                      {
  158.                        leftrun();                //车的左边比车的右边距离大        左转
  159.                        timer=0;
  160.                        while(timer<=4000);
  161.                      }
  162.                                             

  163. }


  164.                 void pwm_Servomoto(void)
  165. {  

  166.     if(pwm_val_left<=push_val_left)
  167.                Sevro_moto_pwm=1;
  168.         else
  169.                Sevro_moto_pwm=0;
  170.         if(pwm_val_left>=200)
  171.         pwm_val_left=0;

  172. }

  173. ///*TIMER1中断服务子函数产生PWM信号*/
  174.         void time1()interrupt 3   using 2
  175. {       
  176.      TH1=(65536-100)/256;          //100US定时
  177.          TL1=(65536-100)%256;
  178.          timer++;                                  //定时器100US为准。在这个基础上延时
  179.          pwm_val_left++;
  180.          pwm_Servomoto();

  181.          timer1++;                                 //2MS扫一次数码管
  182.          if(timer1>=20)
  183.          {
  184.          timer1=0;
  185.          Display();       
  186.          }
  187. }

  188. ///*TIMER0中断服务子函数产生PWM信号*/
  189.         void timer0()interrupt 1   using 0
  190. {       
  191.           
  192. }



  193.         void main(void)
  194. {

  195.         TMOD=0X11;
  196.         TH1=(65536-100)/256;          //100US定时
  197.         TL1=(65536-100)%256;
  198.         TH0=0;
  199.         TL0=0;  
  200.         TR1= 1;
  201.         ET1= 1;
  202.         ET0= 1;
  203.         EA = 1;

  204.         delay(100);
  205.     push_val_left=14;          //舵机归中


  206.         while(1)                       /*无限循环*/
  207.         {

  208.          if(timer>=1000)          //100MS检测启动检测一次
  209.            {
  210.                timer=0;
  211.                    StartModule(); //启动检测
  212.            Conut();                  //计算距离
  213.            if(S<30)                  //距离小于20CM
  214.                    {
  215.                    stoprun();          //小车停止
  216.                    COMM();                   //方向函数
  217.                    }
  218.                    else
  219.                    if(S>35)                  //距离大于,30CM往前走
  220.                    run();
  221.            }

  222.         }

  223. }
  224.        
复制代码
回复

使用道具 举报

ID:871292 发表于 2021-2-20 11:25 | 显示全部楼层
本帖最后由 katv0718 于 2021-2-27 15:42 编辑

非常感谢前辈指点
回复

使用道具 举报

ID:517951 发表于 2021-2-20 15:59 | 显示全部楼层
先搞个H桥用单片机驱动电机正反转,小车就能前进后退了
回复

使用道具 举报

ID:871292 发表于 2021-2-20 16:49 | 显示全部楼层
rayin 发表于 2021-2-20 15:59
先搞个H桥用单片机驱动电机正反转,小车就能前进后退了

好的,谢谢!
还在学单片机学习板,基础不好,不好开展
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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