找回密码
 立即注册

QQ登录

只需一步,快速开始

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

C51单片机的智能小车程序设计 含遥控端与小车端 注释很详细

[复制链接]
paredes 发表于 2020-11-24 14:14 | 显示全部楼层 |阅读模式
电赛用的程序设计,包含了转弯、无线控制、循迹和人体温度检测

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "nRF24L01.h"
  3. #include "control.h"
  4. #include "MLX90614.h"
  5. #include "Ultrasonic.h"
  6. #include "Ultrasonic2.h"


  7. #define uint unsigned int
  8. #define uchar unsigned char

  9. sbit KEY8=P1^6;                                         //发送按键
  10. sbit beep=P0^2;                                        //喇叭
  11. sbit LED=P1^7;                        //发送数据时显示灯
  12. extern Tem;

  13. void delay_ms(uint z)                        //延时函数
  14. {
  15.         uint y;
  16.         while(z--)
  17.                 for(y=110;y>0;y--);
  18. }

  19. void main()
  20. {
  21.          uchar Rx_Buf[32];          //接收到的数据暂存器,最多32字节数据
  22.    uchar Tx_Buf[]={1};        //发送的信息1  
  23.          init_NRF24L01();
  24.          LED=1;                                //初始灯6熄灭   

  25.         while(NRF24L01_Check())                                        //检查不到24l01则报警
  26.         {
  27.                 beep=1;
  28.                 delay_ms(200);
  29.                 beep=0;
  30.                 delay_ms(200);
  31.         }
  32.         while(1)
  33.         {        
  34.                 RX_Mode();                                                        //接收模式  
  35.                 while(!nRF24L01_RxPacket(Rx_Buf))         //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式  
  36.             {
  37.                         if(KEY8==0)                                                 //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式
  38.                         {        
  39.                                 delay_ms(5);//消抖动
  40.                                 if(KEY8==0)
  41.                                 {
  42.                                          while(!KEY8);
  43.                                         TX_Mode();         //发送模式
  44.                                     nRF24L01_TxPacket(Tx_Buf);                //发送命令数据
  45.                                         LED=0;
  46.                                     delay_ms(300);
  47.                                         LED=1;
  48.                                     delay_ms(300);                                        //发送后LED6闪一下
  49.                                         break;                                                        //退出最近的循环,从而变回接收模式,这句关键
  50.                                  }        
  51.                          }
  52.                  }
  53. if(Rx_Buf[0]==1)                                                           //若接收到对应的数据则实现对应功能
  54. {
  55. Rx_Buf[0]=0;                                //清空数据
  56.    LED=1;
  57.          delay_ms(300);
  58.          LED=0;
  59. delay_ms(300);                                //接收到数据 后闪烁         
  60. }
  61.                 switch(Rx_Buf[0])                                //对数据进行分析来控制灯亮
  62.                 {
  63.                         case 0:
  64.                                 break;
  65.                         case 1:
  66.                                 Rx_Buf[0]=0;                                //清空数据
  67.                                 m1 = 0;
  68.                                 m2 = 0;
  69.                                 m3 = 0;
  70.                                 m4 = 0;
  71.                                 break;
  72.                         case 2:
  73.                                 Rx_Buf[0]=0;                                //清空数据
  74.                                 M_up();                                                        //前进
  75.                                 break;
  76.                         case 3:
  77.                                 Rx_Buf[0]=0;                //清空数据
  78.                                 M_back();                                //后退
  79.                                 break;
  80.                         case 4:
  81.                                 Rx_Buf[0]=0;                                //清空数据
  82.                                 M_left();                                                //向左行驶
  83.                                 break;
  84.                         case 5:
  85.                                 Rx_Buf[0]=0;     //清空数据
  86.                                 M_right();                        //向右行驶
  87.                                 break;
  88.                         case 6:
  89.                                 Rx_Buf[0]=0;          //清空数据
  90.                                 M_stop();                                //停止
  91.                                 break;
  92.                         case 7:
  93.                                 Rx_Buf[0]=0;          //停止
  94.                                 delay(20);              //延时程序        1
  95.                                 LCD_show(16,2);
  96.                                 LcdBusy();
  97.                                 LCD_init ();
  98.                                 display(Tem);           // 显示子程序
  99.                                 SMB_ack();        
  100.                                 break;
  101.                         case 8:
  102.                                 Rx_Buf[0]=0;          //停止
  103.                                 Ultrasonic();  //小车端超声波检测
  104.                                 Ultrasonic2(); //人体端超声波检测
  105.                                 break;
  106.                 }                 
  107.         }
  108. }

复制代码


  1. #include "reg52.h"
  2. #include "nRF24L01.h"

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit KEY1 = P2^0;
  6. sbit KEY2 = P2^1;
  7. sbit KEY3 = P2^2;
  8. sbit KEY4 = P2^3;
  9. sbit KEY5 = P2^4;
  10. sbit KEY6 = P2^5;
  11. sbit KEY7 = P2^6;
  12. sbit KEY8 = P2^7;

  13. sbit beep = P1^6;                                        //喇叭
  14. sbit LED = P1^7 ;                                         //发送数据时显示灯+接收到数据后的功能实现灯


  15. void delay_ms(uint z)                        //延时函数
  16. {
  17.         uint y;
  18.         while(z--)
  19.                 for(y=110;y>0;y--);
  20. }

  21. void main()
  22. {
  23.    uchar Tx_Buf1[]={1,2,3,4,5,6,7,8};        //发送的信息1
  24.    uchar Rx_Buf[32];          //接收到的数据暂存器,最多32字节数据
  25.    init_NRF24L01();
  26.    LED=0;                                //初始灯6熄灭  
  27.         beep = 0;
  28.         while(NRF24L01_Check())                                //检查不到24l01则报警
  29. {
  30.     beep=0;
  31.                 delay_ms(200);
  32.                 beep=1;
  33.                 delay_ms(200);
  34. }

  35.         while(1)
  36.         {        
  37.                 RX_Mode();                                                        //接收模式  
  38.                 while(!nRF24L01_RxPacket(Rx_Buf))         //等待接收数据,返回1则接收到数据,在等待接收数据期间,可以随时变成发送模式  
  39.             {

  40.                         if(KEY1==0)                                                 //按了按键1,则变成发送模式,发送对应数据,发送完后变成接收模式
  41.                         {        
  42.                                 delay_ms(5);//消抖动
  43.                                 if(KEY1==0)
  44.                                 {
  45.                                          while(!KEY1);
  46.                                         TX_Mode();                                                 //发送模式
  47.                                         Tx_Buf1[0]=1;                                        //将1发送过去
  48.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  49.                                         LED=0;
  50.                                     delay_ms(50);
  51.                                         LED=1;
  52.                                     delay_ms(50);                                        //发送后LED1闪一下
  53.                                         break;                                                        //退出最近的循环,从而变回接收模式,这句关键
  54.                                  }        
  55.                          }


  56.                          else if(KEY2==0)                                         
  57.                          {        
  58.                                 delay_ms(5);//消抖动
  59.                                 if(KEY2==0)
  60.                                 {
  61.                                         TX_Mode();                                                 //发送模式
  62.                                         Tx_Buf1[0]=2;                                        //将2发送过去
  63.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  64.                                         LED=0;
  65.                             delay_ms(50);
  66.                                         LED=1;
  67.                                         delay_ms(50);
  68.                                         if(KEY2==1)
  69.                                         {
  70.                                                 TX_Mode();                                                 //发送模式
  71.                                         Tx_Buf1[0]=6;                                        //将2发送过去
  72.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  73.                                         }
  74.                                         break;                                        //退出最近的循环,从而变回接收模式,这句关键
  75.                                  }        
  76.                           }


  77.                           else if(KEY3==0)                                                
  78.                           {        
  79.                                 delay_ms(5);//消抖动
  80.                                 if(KEY3==0)
  81.                                 {
  82.                                         TX_Mode();                                                 //发送模式
  83.                                         Tx_Buf1[0]=3;                                        //将3发送过去
  84.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  85.                                         LED=0;
  86.                                     delay_ms(50);
  87.                                         LED=1;
  88.                                     delay_ms(50);
  89.                                         if(KEY3==1)
  90.                                         {
  91.                                                 TX_Mode();                                                 //发送模式
  92.                                         Tx_Buf1[0]=6;                                        //将6发送过去
  93.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  94.                                         }
  95.                                         break;                                                        //退出最近的循环,从而变回接收模式,这句关键
  96.                                  }        
  97.                           }


  98.                           else if(KEY4==0)                                                 //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式
  99.                           {        
  100.                                 delay_ms(5);//消抖动
  101.                                 if(KEY4==0)
  102.                                 {
  103.                                         TX_Mode();                                                 //发送模式
  104.                                         Tx_Buf1[0]=4;                                        //将4发送过去
  105.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  106.                                         LED=0;
  107.                                     delay_ms(50);
  108.                                         LED=1;
  109.                                     delay_ms(50);
  110.                                         if(KEY4==1)
  111.                                         {
  112.                                                 TX_Mode();                                                 //发送模式
  113.                                         Tx_Buf1[0]=6;                                        //将6发送过去
  114.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  115.                                         }
  116.                                         break;                                                        //退出最近的循环,从而变回接收模式,这句关键
  117.                                  }        
  118.                           }


  119.                                 else if(KEY5==0)                                                
  120.                           {        
  121.                                 delay_ms(5);//消抖动
  122.                                 if(KEY5==0)
  123.                                 {
  124.                                         TX_Mode();                                                 //发送模式
  125.                                         Tx_Buf1[0]=5;                                        //将5发送过去
  126.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  127.                                         LED=0;
  128.                                     delay_ms(50);
  129.                                         LED=1;
  130.                                     delay_ms(50);
  131.                                         if(KEY5==1)
  132.                                         {
  133.                                                 TX_Mode();                                                 //发送模式
  134.                                         Tx_Buf1[0]=6;                                        //将6发送过去
  135.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  136.                                         }
  137.                                         break;                                                        //退出最近的循环,从而变回接收模式,这句关键
  138.                                  }        
  139.                           }


  140.                                 else if(KEY6==0)                                                 //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式
  141.                           {        
  142.                                 delay_ms(5);//消抖动
  143.                                 if(KEY6==0)
  144.                                 {
  145.                                          while(!KEY6);
  146.                                         TX_Mode();                                                 //发送模式
  147.                                         Tx_Buf1[0]=6;                                        //将6发送过去
  148.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  149.                                         LED=0;
  150.                                     delay_ms(50);
  151.                                         LED=1;
  152.                                     delay_ms(50);                                       
  153.                                         break;                                                        //退出最近的循环,从而变回接收模式,这句关键
  154.                                  }        
  155.                           }


  156.                                 else if(KEY7==0)                                                 //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式
  157.                           {        
  158.                                 delay_ms(5);//消抖动
  159.                                 if(KEY7==0)
  160.                                 {
  161.                                          while(!KEY7);
  162.                                         TX_Mode();                                                 //发送模式
  163.                                         Tx_Buf1[0]=7;                                        //将7发送过去
  164.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  165.                                         LED=0;
  166.                                     delay_ms(50);
  167.                                         LED=1;
  168.                                     delay_ms(50);                                       
  169.                                         break;                                                        //退出最近的循环,从而变回接收模式,这句关键
  170.                                  }        
  171.                           }


  172.                                 else if(KEY8==0)                                                 //按了按键8,则变成发送模式,发送对应数据,发送完后变成接收模式
  173.                           {        
  174.                                 delay_ms(5);//消抖动
  175.                                 if(KEY8==0)
  176.                                 {
  177.                                          while(!KEY8);
  178.                                         TX_Mode();                                                 //发送模式
  179.                                         Tx_Buf1[0]=8;                                        //将7发送过去
  180.                                     nRF24L01_TxPacket(Tx_Buf1);                //发送命令数据
  181.                                         LED=0;
  182.                                     delay_ms(50);
  183.                                         LED=1;
  184.                                     delay_ms(50);                                       
  185.                                         break;                                                        //退出最近的循环,从而变回接收模式,这句关键
  186.                                  }        
  187.                           }

  188.                  }
  189.                  if(Rx_Buf[0]==1)                                                           //若接收到对应的数据则实现对应功能
  190.                  {
  191.                      Rx_Buf[0]=0;                                //清空数据
  192.                      LED=0;
  193.                           delay_ms(300);
  194.                           LED=1;
  195.                           delay_ms(300);                        //接收到数据 后闪烁         
  196.                  }
  197.         }
  198. }
复制代码
51hei.png
所有程序51hei提供下载:
智能小车.zip (137.92 KB, 下载次数: 12)
回复

使用道具 举报

51hei团团 发表于 2020-11-24 16:48 | 显示全部楼层
程序很好,可惜没有原理图啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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