久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2330|回復: 0
打印 上一主題 下一主題
收起左側(cè)

STC12C5410AD單片機智能小車代碼與原理圖資料

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1531 發(fā)表于 2021-9-23 09:15 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. // 注:以下文檔的 TAB 為 2 個字符!

  2. /*------------------------------------------------------------------------
  3.         此項目為“尋跡小車”的升級,在結(jié)構(gòu)上作了改進,碼盤從10(20)個/圈提高到 50(100)個圈;
  4. 同時,改進了電機的驅(qū)動防護邏輯,既能實現(xiàn)電機的四個狀態(tài),保證不短路,還可以使PWM控制的
  5. 軟件耗費大大減少,而且一個電機只需使用3個I/O口(原來為 4個)。

  6.         其余沒做大的改動,所以程序只要要修改的是電機驅(qū)動部分。
  7.        
  8.         為了能使用PCA硬件實現(xiàn)PWM,以便于使用RTOS,暫時取消PWM的頻率修改功能,日后有更好的方案再考慮。

  9. 因為程序要支持尋跡的所有功能,所以將程序分成模塊化,便于閱讀和調(diào)試。
  10. 程序分為:
  11.         1) 主控程序 —— 調(diào)度所有消息,初始化系統(tǒng)
  12.         2) 電機驅(qū)動模塊 —— 包含所有與電機驅(qū)動有關(guān)的函數(shù),接受不同的控制命令,并付諸實施;
  13.         3) 軌跡采樣模塊 —— 包含所有與軌跡采樣有關(guān)的處理,結(jié)果為與處理后的軌跡狀態(tài);
  14.         4) 走軌跡控制模塊 —— 讀取軌跡采樣所獲取的信息,根據(jù)需求和策略輸出相應的電機控制命令;將調(diào)試的相關(guān)功能也納入此模塊。
  15.        

  16. 資源分配:
  17.         Timer 0 ——  系統(tǒng)時基, 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);                                                                                        // 硬件初始化函數(shù)
  31. void init_var(void);                                                                                                        // 初始化變量
  32. void feed_watchdog(void);                                                                                        // 清看門狗計數(shù)器

  33. extern void init_LineCtrl_Hardware(void);                                                                                        // 初始化軌跡控制模塊用硬件
  34. extern void init_LineCtrl_Var(void);                                                                                                        // 初始化軌跡控制模塊用變量
  35. extern void lineCtrl_proc(unsigned char ucMessage);                                                // 軌跡控制部分處理入口函數(shù)

  36. extern void init_MotorDrv_Hardware(void);                                                                                        // 初始化電機驅(qū)動模塊用硬件
  37. extern void init_MotorDrv_Var(void);                                                                                                        // 初始化電機驅(qū)動模塊用變量
  38. extern void calOutValue(unsigned char No);                                                                                // 計算電機控制輸出值
  39. extern void calSpeed(void);                                                                                                                                                // 計算轉(zhuǎn)速
  40. extern void proc_Stop(unsigned char No);                                                                                        // 處理行走脈沖計數(shù)
  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);                                                                                // 處理行走脈沖計數(shù)
  60.                 }

  61.                 if(gb_M1CalOutValue == TRUE)
  62.                 {
  63.                         gb_M1CalOutValue = FALSE;
  64.                         calOutValue(MOTOR1);                                                                        // 根據(jù)變化后的參數(shù)計算電機輸出控制數(shù)據(jù)
  65.                 }

  66.                 if(gb_CheckM2StopCnt)
  67.                 {
  68.                         gb_CheckM2StopCnt = FALSE;       
  69.                         proc_Stop(MOTOR2);                                                                                // 處理行走脈沖計數(shù)
  70.                 }

  71.                 if(gb_M2CalOutValue == TRUE)
  72.                 {                       
  73.                         gb_M2CalOutValue = FALSE;
  74.                         calOutValue(MOTOR2);                                                                        // 根據(jù)變化后的參數(shù)計算電機輸出控制數(shù)據(jù)
  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);                                                        // 根據(jù)速度值計算PID控制值
  88.                                 proc_PID_Ctrl(MOTOR2);                                                        // 根據(jù)速度值計算PID控制值
  89.                         }
  90.                 }
  91.                                                

  92.                 if(gb_NewData)
  93.                 {
  94.                         gb_NewData = FALSE;
  95.                         lineCtrl_proc(NEW_RCV_DATA);                // 處理數(shù)據(jù)接收
  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);                                                        // 處理軌跡采樣數(shù)據(jù)
  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. /********** 模塊自用函數(shù) **************/

  148. // 以下函數(shù)只由模塊自身使用,別的模塊不用聲明。

  149. /********************************************/
  150. /*名稱:         init_hardware                                                                                        */
  151. /*用途:  硬件初始化函數(shù)                                                                      */
  152. /*說明:         初始化所有相關(guān)的硬件狀態(tài)                                                */
  153. /********************************************/

  154. void init_hardware(void)
  155. {
  156.        
  157.         /* 初始化系統(tǒng)時鐘 */
  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位重加載,作為波特率發(fā)生器;
  173.         AUXR = AUXR&CLR_T0X12_C;        // Timer0 工作在12分頻
  174.        
  175.         TCON = 0;                                                                        /* 未使用外部中斷,所以不用定義中斷的觸發(fā)方式 */
  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;                                                                                                        // 此處不設優(yōu)先級,有各功能模塊自身設定
  186.         IP = NOIP_C;                                       
  187.        
  188.         /* 初始化軌跡采樣模塊所需硬件 */       
  189.        
  190.         init_LineSamp_Hardware();
  191.        
  192.         /* 初始化軌跡控制所需硬件 */
  193.        
  194.         init_LineCtrl_Hardware();
  195.        
  196.         /* 初始化電機驅(qū)動所需硬件 */
  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參數(shù)初始化
  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.         /* 初始化電機驅(qū)動所用變量 */
  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, 下載次數(shù): 68)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩网站在线观看 | 日本一区二区不卡 | 成人不卡视频 | 欧美一区不卡 | 国产精品成av人在线视午夜片 | 国产精品免费一区二区三区四区 | 6080亚洲精品一区二区 | 久久久久久国产精品久久 | 日韩在线视频网址 | h视频亚洲 | 日本不卡一区二区三区在线观看 | 色狠狠一区| 亚洲综合大片69999 | 日韩影院在线观看 | 精品国模一区二区三区欧美 | av播播 | 亚洲一区二区三区四区五区午夜 | 国产亚洲黄色片 | 色狠狠一区 | 国产三级 | 91亚洲国产精品 | 一道本在线 | 麻豆视频在线免费观看 | 午夜伦理影院 | 亚洲免费网 | 欧美精品一区二区三区四区 在线 | 婷婷精品| 精品视频一区二区三区 | 亚洲精品视频在线播放 | 中文字幕不卡视频在线观看 | 久久久免费电影 | 中文字幕在线观看一区 | www.4hu影院| 91精品国产色综合久久不卡98 | 毛片区 | 欧美一区二区三区免费电影 | 国产精品区一区二 | 日韩精品一区二区三区中文在线 | 久久久久国产一区二区三区四区 | 国产成人av在线播放 | 欧美一级欧美一级在线播放 |