单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:2068|回复:0
打印上一主题下一主题

STC12C5410AD单片机智能小车代码与原理图资料

[复制链接]
跳转到指定楼层
楼主
ID:1531发表于 2021-9-23 09:15|只看该作者|只看大图回帖奖励
单片机源程序如下:
  1. // 注:以下文档的 TAB 为 2 个字符!

  2. /*------------------------------------------------------------------------
  3.      此项目为“寻迹小车”的升级,在结构上作了改进,码盘从10(20)个/圈提高到 50(100)个圈;
  4. 同时,改进了电机的驱动防护逻辑,既能实现电机的四个状态,保证不短路,还可以使PWM控制的
  5. 软件耗费大大减少,而且一个电机只需使用3个I/O口(原来为 4个)。

  6.      其余没做大的改动,所以程序只要要修改的是电机驱动部分。
  7.     
  8.      为了能使用PCA硬件实现PWM,以便于使用RTOS,暂时取消PWM的频率修改功能,日后有更好的方案再考虑。

  9. 因为程序要支持寻迹的所有功能,所以将程序分成模块化,便于阅读和调试。
  10. 程序分为:
  11.      1) 主控程序 —— 调度所有消息,初始化系统
  12.      2) 电机驱动模块 —— 包含所有与电机驱动有关的函数,接受不同的控制命令,并付诸实施;
  13.      3) 轨迹采样模块 —— 包含所有与轨迹采样有关的处理,结果为与处理后的轨迹状态;
  14.      4) 走轨迹控制模块 —— 读取轨迹采样所获取的信息,根据需求和策略输出相应的电机控制命令;将调试的相关功能也纳入此模块。
  15.     

  16. 资源分配:
  17.      Timer 0 ——  系统时基, 1ms
  18.      Timer 1 ——  串口波特率

  19. ------------------------------------------------------------------------*/

  20. #pragma PR
  21. #pragma OT(5,size)

  22. #pragma Listinclude
  23. #pragma code

  24. #include< E:\dingqi\keilc51\inc\math.h>

  25. #include< STC12C5410AD.h>                 /* STC12C5410AD 的头文件*/

  26. #include< Port_Def.H>

  27. #include< ComConst.H>

  28. #include< CM_Const.H>

  29. #include< CM_Var.H>

  30. void init_hardware(void);                                             // 硬件初始化函数
  31. void init_var(void);                                                     // 初始化变量
  32. void feed_watchdog(void);                                             // 清看门狗计数器

  33. extern void init_LineCtrl_Hardware(void);                                             // 初始化轨迹控制模块用硬件
  34. extern void init_LineCtrl_Var(void);                                                     // 初始化轨迹控制模块用变量
  35. extern void lineCtrl_proc(unsigned char ucMessage);                         // 轨迹控制部分处理入口函数

  36. extern void init_MotorDrv_Hardware(void);                                             // 初始化电机驱动模块用硬件
  37. extern void init_MotorDrv_Var(void);                                                     // 初始化电机驱动模块用变量
  38. extern void calOutValue(unsigned char No);                                         // 计算电机控制输出值
  39. extern void calSpeed(void);                                                                         // 计算转速
  40. extern void proc_Stop(unsigned char No);                                             // 处理行走脉冲计数
  41. extern void proc_PID_Ctrl(unsigned char No);                                     // 处理PID控制

  42. extern void init_LineSamp_Hardware(void);                                             // 初始化轨迹采样模块用硬件
  43. extern void init_LineSamp_Var(void);                                                     // 初始化轨迹采样模块用变量
  44. extern void lineSamp_proc(void);                                                             // 轨迹采样处理

  45. /******** 主程序 *************/

  46. void main(void)
  47. {
  48.      init_hardware();
  49.     
  50.      init_var();
  51.     
  52.      EA = TRUE;         // 启动中断,开始正常工作
  53.     
  54.      while(1)
  55.      {
  56.          if(gb_CheckM1StopCnt)
  57.          {
  58.              gb_CheckM1StopCnt = FALSE;    
  59.              proc_Stop(MOTOR1);                                         // 处理行走脉冲计数
  60.          }

  61.          if(gb_M1CalOutValue == TRUE)
  62.          {
  63.              gb_M1CalOutValue = FALSE;
  64.              calOutValue(MOTOR1);                                     // 根据变化后的参数计算电机输出控制数据
  65.          }

  66.          if(gb_CheckM2StopCnt)
  67.          {
  68.              gb_CheckM2StopCnt = FALSE;    
  69.              proc_Stop(MOTOR2);                                         // 处理行走脉冲计数
  70.          }

  71.          if(gb_M2CalOutValue == TRUE)
  72.          {            
  73.              gb_M2CalOutValue = FALSE;
  74.              calOutValue(MOTOR2);                                     // 根据变化后的参数计算电机输出控制数据
  75.          }
  76.         
  77.          if(gb_calSpeed)
  78.          {
  79.              gb_calSpeed = FALSE;                        
  80.              calSpeed();                                                         // 计算速度
  81.          }

  82.          if(gb_SpeedOk)
  83.          {
  84.              gb_SpeedOk = FALSE;
  85.              if(gb_EnablePID)
  86.              {
  87.                  proc_PID_Ctrl(MOTOR1);                             // 根据速度值计算PID控制值
  88.                  proc_PID_Ctrl(MOTOR2);                             // 根据速度值计算PID控制值
  89.              }
  90.          }
  91.                         

  92.          if(gb_NewData)
  93.          {
  94.              gb_NewData = FALSE;
  95.              lineCtrl_proc(NEW_RCV_DATA);         // 处理数据接收
  96.          }

  97.          if(gb_SampleStart)
  98.          {
  99.              union
  100.              {
  101.                  unsigned int all;
  102.                  unsigned char b[2];
  103.              }uiTemp;
  104.             
  105.              uiTemp.b[0] = TH0;
  106.              uiTemp.b[1] = TL0;
  107.              if(uiTemp.all > (TIME1ms_C + SAMP_LED_ONTIME))
  108.              {
  109.                  gb_SampleStart = FALSE;
  110.                  lineSamp_proc();                             // 处理轨迹采样
  111.              }
  112.          }
  113.             
  114.          if(gb_NewSampData)
  115.          {
  116.              gb_NewSampData = FALSE;
  117.              lineCtrl_proc(NEW_SAMP_DATA);                             // 处理轨迹采样数据
  118.          }
  119.                         
  120.          if (gb_1msFlag==TRUE)
  121.          {
  122.              gb_1msFlag=FALSE;
  123.         
  124.              gc_LED_Time_Cnt--;
  125.              if(gc_LED_Time_Cnt ==0)
  126.              {
  127.                  gc_LED_Time_Cnt = LED_ON_OFF_TIME;
  128.                  gb_WorkDisp = ~gb_WorkDisp;
  129.              }
  130.             
  131.              gc_ui1msCnt--;
  132.              if(gc_ui1msCnt==0)
  133.              {
  134.                  gc_ui1msCnt=WDTTIME_C;
  135.                  feed_watchdog();
  136.              }
  137.             
  138.              gc_ucMeaSpeedTimeCnt--;
  139.              if(gc_ucMeaSpeedTimeCnt ==0)
  140.              {
  141.                  gc_ucMeaSpeedTimeCnt = MEA_SPEED_PERIOD;
  142.                  gb_calSpeed = TRUE;
  143.              }
  144.          }
  145.      }
  146. }


  147. /********** 模块自用函数 **************/

  148. // 以下函数只由模块自身使用,别的模块不用声明。

  149. /********************************************/
  150. /*名称:       init_hardware                                             */
  151. /*用途:  硬件初始化函数                                     */
  152. /*说明:       初始化所有相关的硬件状态                         */
  153. /********************************************/

  154. void init_hardware(void)
  155. {
  156.     
  157.      /* 初始化系统时钟 */
  158.      CLK_DIV = CLKDIV1_C;
  159.     
  160.      /* 初始化I/O口*/
  161.      P1M0 = P1M0_C;
  162.      P1M1 = P1M1_C;
  163.     
  164.      P2M0 = P2M0_C;
  165.      P2M1 = P2M1_C;
  166.     
  167.      P3M0 = P3M0_C;
  168.      P3M1 = P3M1_C;
  169.     
  170.      /* 初始化定时器 */
  171.     
  172.      TMOD = T0MODE1|T1MODE2;         // Timer0工作在模式1 ,16位定时,Timer1 工作在模式 2 ,8位重加载,作为波特率发生器;
  173.      AUXR = AUXR&CLR_T0X12_C;     // Timer0 工作在12分频
  174.     
  175.      TCON = 0;                                     /* 未使用外部中断,所以不用定义中断的触发方式 */
  176.         
  177.      TH0 = TIME1msH_C;
  178.      TL0 = TIME1msH_C;
  179.      TR0 = TRUE;
  180.     
  181.      /* 初始化中断 */
  182.     
  183.      IE = EnT0_C;                                                     // 此处只允许 Timer0 中断,其它由各模块自身决定
  184.     
  185.      IPH = NOIP_C;                                                     // 此处不设优先级,有各功能模块自身设定
  186.      IP = NOIP_C;                    
  187.     
  188.      /* 初始化轨迹采样模块所需硬件 */    
  189.     
  190.      init_LineSamp_Hardware();
  191.     
  192.      /* 初始化轨迹控制所需硬件 */
  193.     
  194.      init_LineCtrl_Hardware();
  195.     
  196.      /* 初始化电机驱动所需硬件 */
  197.     
  198.      init_MotorDrv_Hardware();
  199.     
  200.      /* 看门狗初始化程序 */
  201.     
  202.      WDT_CONTR = Watchdog_C;                                 // 设置 WDT 分频
  203. }

  204. /********************************************/
  205. /*名称:     init_var                                                         */
  206. /*用途: 变量初始化                                             */
  207. /*说明:     初始化全局变量                                             */
  208. /********************************************/

  209. void init_var(void)
  210. {
  211.      // WDT参数初始化
  212.      gb_1msFlag=FALSE;
  213.      gc_ui1msCnt=WDTTIME_C;
  214.      gc_LED_Time_Cnt = LED_ON_OFF_TIME;    
  215.     
  216.      /* 初始化轨迹采样模块用变量 */
  217.      init_LineSamp_Var();
  218.     
  219.      /* 初始化轨迹控制所用变量 */
  220.      init_LineCtrl_Var();
  221.     
  222.      /* 初始化电机驱动所用变量 */
  223.      init_MotorDrv_Var();
  224. }


  225. /********************************************/
  226. /*名称:     feed_watchdog                                                 */
  227. /*用途: 喂狗程序                                                 */
  228. /*说明:     请参照STC12C5410的喂狗方法说明             */
  229. /********************************************/

  230. void feed_watchdog(void)
  231. {
  232.      WDT_CONTR = CLRWDT_C;
  233. }

  234. // ------------- 中断处理程序 ---------------------

  235. /********************************************/
  236. /*       定时器 0 中断服务           */
  237. /* 说明:  1ms 中断一次,                                     */
  238. /********************************************/

  239. void  Timer0_Int(void) interrupt 1 using 1
  240. {
  241.     
  242.      TH0 = TIME1msH_C;
  243.      TL0 = TIME1msL_C;
  244.             
  245.      gb_1msFlag = TRUE;
  246.     
  247.      gb_EnSample = ~gb_EnSample;
  248.      if(gb_EnSample)
  249.      {
  250.          gb_Sample = EN_Sample;                                             // 打开采样LED
  251.          gb_SampleStart = TRUE;
  252.      }
  253. }
  254. \032
复制代码

代码和原理图资料51hei附件下载:
智能小车详细资料.rar(238.93 KB, 下载次数: 67)

评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

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

Powered by 单片机教程网