找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6327|回复: 5
收起左侧

STC8单片机智能小车制作 附源程序

  [复制链接]
ID:535176 发表于 2020-3-9 19:10 | 显示全部楼层 |阅读模式
寒假做的一个智能小车,有自动模式(超声波避障)(红外避障)手动模式(红外遥控)(无线NRF24l01遥控)(WIFI ESP8266遥控)(蓝牙遥控)小车可前进,后退,左转,右转,停止,1-7挡(可调),OLED用来显示主界面和超声波检测的距离,JQ8900播报小车运行的状态。
小车视频地址:B站https://www.bilibili.com/video/av94674438/
小车和程序
TIM图片20200308162610.png                             TIM图片20200309190103.png
部分代码:
  1. #include<All.h>

  2. /*********************************
  3. * @函数名:main
  4. * @描述:main 函数,程序入口
  5. * @参数:无
  6. * @返回值:无
  7. *********************************/
  8. void main()
  9. {
  10.     static uchar Voice_Flag=0;
  11.     Timer0_INT0_Init();//红外解码
  12.     Timer3_Init();//直流电机调速
  13.         Time1_INT1_Init();//超声波初始化
  14.         OLED_Init();//OLED显示初始化
  15.         Uart4_Init();//串口4初始化 定时器4 蓝牙
  16.         Uart3_Init();//串口3初始化 定时器2 WIFI
  17.         ESP8266_Init();//ESP8266初始化
  18.         NRF24L01_Init();//NRF24L01无线模块初始化
  19.         SetRX_Mode();//设置为接收模式
  20.         Oled_Display_Chinese();//OLED显示固定汉字
  21.    while(1)
  22.    {
  23.            if(Voice_Flag==0)
  24.            {
  25.               JQ8900_Select_TwoCmd_Song(0x02,0x04);//发动机已启动,准备发车
  26.                   Voice_Flag=1;
  27.            }
  28.             Oled_Display_Variable();//OLED屏幕显示变量数据//执行时间大概200ms
  29.             Auto_Hand_Mode();//自动手动切换模式
  30.    }
  31. }
复制代码
  1. #include<All.h>

  2. uchar Auto_Hand_Mode_Flag=1;//自动手动模式切换标志(默认手动)
  3. uchar Hand_Mode_Flag=0;//手动模式切换标志(默认红外)
  4. uchar Auto_Mode_Flag = 1;//自动模式切换标志
  5. /*********************************
  6. * @函数名:Mode_Key_Scan
  7. * @描  述:按一下是手动控制,再按一下是自动控制
  8. * @参  数:无
  9. * @返回值:无
  10. *********************************/
  11. void Mode_Key_Scan()//模式按键扫描
  12. {
  13.     uchar i;
  14.         if(Key1==0)//Key1自动手动模式切换
  15.         {
  16.             i=20;
  17.                 while(i--); //延迟消抖
  18.                 if(Key1==0)
  19.                 {
  20.                    if(Auto_Hand_Mode_Flag)   //一共两种模式
  21.                       Auto_Hand_Mode_Flag=0;  //不是0就是1
  22.                else
  23.                        Auto_Hand_Mode_Flag=1;//没按一下就换一种模式
  24.                 }
  25.                 while(!Key1);
  26.         }
  27. }
  28. /*********************************
  29. * @函数名:Control_Method_Key_Scan
  30. * @描  述:手动模式控制方式按键
  31. * @参  数:无
  32. * @返回值:无
  33. *********************************/
  34. void Control_Method_Key_Scan()//控制方式
  35. {
  36.         uchar i;
  37.    if(Key2==0)//控制方式切换
  38.         {
  39.             i=20;
  40.                 while(i--);  //延迟消抖
  41.                 if(Key2==0)
  42.                 {
  43.                         if(Hand_Mode_Flag==3) //一共三种控制方式0123
  44.                          Hand_Mode_Flag=0; //循环
  45.                         else   
  46.                                 Hand_Mode_Flag++; //每次换一种
  47.                 }
  48.                 while(!Key2);
  49.         }
  50. }
  51. /*********************************
  52. * @函数名:Auto_Mode
  53. * @描  述:自动模式 (超声波避障)
  54. * @参  数:无
  55. * @返回值:无
  56. *********************************/
  57. void Auto_Mode()
  58. {
  59. //        static uchar
  60.         switch(Auto_Mode_Flag)
  61.         {
  62.                 case 0:
  63.                               Judge_distance(); //超声波避障
  64.                               break;
  65.                 case 1:
  66.                               Ray_Avoid(); //红外避障
  67.                               break;
  68.         }
  69.    
  70.         //Ray_jiance();
  71. }
  72. /*********************************
  73. * @函数名:Hand_Mode
  74. * @描  述:手动模式工具切换函数,Hand_Mode_Flag选用不同的工具控制
  75. * @参  数:无
  76. * @返回值:无
  77. *********************************/
  78. void Hand_Mode()
  79. {
  80.         static uchar Voice_Flag[4]={0};//语音标志
  81.         static uchar One_Flag=0;//消除第一次语音播报标志
  82.         Control_Method_Key_Scan();//控制方式按键扫描
  83.         switch(Hand_Mode_Flag)
  84.         {
  85.                 case 0:  
  86.                                  Ray_Hand_Key();    //红外手动按键
  87.                                  Ray_Decode_Ser(); //红外解码函数
  88.                         
  89.                           if(One_Flag)  //程序执行第一次的时候不执行
  90.                                    {
  91.                                           if(Voice_Flag[0]==0)
  92.                                           {
  93.                                                   //ES=0;//关闭蓝牙串口中断
  94.                                                  JQ8900_Select_TwoCmd_Song(0x01,0x04);//红外遥控
  95.                                                 // EX0=1;//打开外部中断0
  96.                                                  Voice_Flag[0]=1;
  97.                                                  Voice_Flag[1]=0;
  98.                                                  Voice_Flag[2]=0;        
  99.                                                   Voice_Flag[3]=0;        
  100.                                           }
  101.                                 }
  102.                                   break;
  103.                 case 1:
  104.                               Blue_Hand_Key();      //蓝牙手动模式
  105.                                   if(Voice_Flag[1]==0)
  106.                                   {
  107.                                           One_Flag=1;  //再执行红外的时候播报
  108.                                         JQ8900_Select_TwoCmd_Song(0x01,0x05);//蓝牙遥控
  109.                                          Voice_Flag[0]=0;
  110.                      Voice_Flag[1]=1;
  111.                      Voice_Flag[2]=0;        
  112.                      Voice_Flag[3]=0;                                                  
  113.                                   }
  114.                                   break;
  115.                 case 2:  
  116.                               NRF24L01_Hand_Key(); //无线手动按键
  117.                                     NRF24L01_Receive();//接收数据的函数
  118.                                   if(Voice_Flag[2]==0)
  119.                                   {
  120.                                           One_Flag=1; //再执行红外的时候播报
  121.                                         //  ES=0;//关闭蓝牙串口中断
  122.                                           //EX0=0;//关闭外部中断0
  123.                                         JQ8900_Select_TwoCmd_Song(0x01,0x06);//无线遥控
  124.                                          Voice_Flag[0]=0;
  125.                      Voice_Flag[1]=0;
  126.                      Voice_Flag[2]=1;        
  127.                                            Voice_Flag[3]=0;        
  128.                                   }
  129.                               break;
  130.                 case 3:
  131.                        if(Voice_Flag[3]==0)
  132.                                   {
  133.                                           One_Flag=1;  //再执行红外的时候播报
  134.                                          // EX0=0;//关闭外部中断0
  135.                                         JQ8900_Select_TwoCmd_Song(0x01,0x07);//WIFI遥控
  136.                                         //  ES=1;//打开蓝牙串口中断
  137.                                          Voice_Flag[0]=0;
  138.                      Voice_Flag[1]=0;
  139.                      Voice_Flag[2]=0;         
  140.                                           Voice_Flag[3]=1;        
  141.                                   }
  142.                          ESP8266_Hand_Key();//WIFI手动按键
  143.                         break;
  144.         }
  145. }
  146. /*********************************
  147. * @函数名:Auto_Hand_Mode
  148. * @描  述:自动手动模式切换函数Auto_Hand_Mode_Flag为0自动,为1手动
  149. * @参  数:无
  150. * @返回值:无
  151. *********************************/
  152. void Auto_Hand_Mode()//自动手动模式切换
  153. {
  154.         static uchar Voice_Flag[2]={0};//语音标志
  155.         static uchar One_Flag=0;//消除第一次不语音播报标志
  156.         Mode_Key_Scan();//按键扫描切换自动手动
  157.     switch(Auto_Hand_Mode_Flag)
  158.      {
  159.               case 0:   
  160.                       if(Voice_Flag[0]==0) //语音只执行一次
  161.                                   {
  162.                                            EX1 = 1; //打开超声波
  163.                                          One_Flag=1;//第二次,可以播报
  164.                                         JQ8900_Select_TwoCmd_Song(0x01,0x02);//自动模式
  165.                         Voice_Flag[0]=1;
  166.                         Voice_Flag[1]=0;
  167.                                   }
  168.                                   Auto_Mode();//自动
  169.                         break;
  170.               case 1:   
  171.                   /*一上电程序进入这里,由于要播放发送机已启动,所以不播放下面的*/
  172.                                   if(One_Flag)//如果等于1播报,否则不播报
  173.                                   {
  174.                                           if(Voice_Flag[1]==0)
  175.                                           {
  176.                                                   EX1 = 0; //关闭超声波
  177.                                                  Car_Stop();// //由自动模式切换到手动模式,小车需停止
  178. //                                                TR1=0;//关闭定时器1
  179.                                                 JQ8900_Select_TwoCmd_Song(0x01,0x03);//手动模式
  180.                                                 Voice_Flag[0]=0;
  181.                                                 Voice_Flag[1]=1;
  182.                                           }
  183.                               }
  184.                                    Hand_Mode();//手动
  185.                       break;
  186.        }
  187. }
复制代码

全部资料51hei下载地址:
Stc8A8K小车简化.zip (246.23 KB, 下载次数: 111)

评分

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

查看全部评分

回复

使用道具 举报

ID:535176 发表于 2020-3-10 07:32 | 显示全部楼层
感谢管理员的整理
回复

使用道具 举报

ID:752280 发表于 2020-8-6 09:48 | 显示全部楼层
程序写的很规范啊
回复

使用道具 举报

ID:562211 发表于 2020-12-1 21:47 | 显示全部楼层
楼主有电路图吗
回复

使用道具 举报

ID:843544 发表于 2020-12-22 20:15 | 显示全部楼层
有电路图吗?
回复

使用道具 举报

ID:843544 发表于 2020-12-23 20:52 | 显示全部楼层
是否能够提供原理图
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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