找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
单片机源程序如下:
  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, 下载次数: 60)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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