亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
STC12C5410AD單片機智能小車代碼與原理圖資料
[打印本頁]
作者:
zbjllq
時間:
2021-9-23 09:15
標(biāo)題:
STC12C5410AD單片機智能小車代碼與原理圖資料
單片機源程序如下:
// 注:以下文檔的 TAB 為 2 個字符!
/*------------------------------------------------------------------------
此項目為“尋跡小車”的升級,在結(jié)構(gòu)上作了改進,碼盤從10(20)個/圈提高到 50(100)個圈;
同時,改進了電機的驅(qū)動防護邏輯,既能實現(xiàn)電機的四個狀態(tài),保證不短路,還可以使PWM控制的
軟件耗費大大減少,而且一個電機只需使用3個I/O口(原來為 4個)。
其余沒做大的改動,所以程序只要要修改的是電機驅(qū)動部分。
為了能使用PCA硬件實現(xiàn)PWM,以便于使用RTOS,暫時取消PWM的頻率修改功能,日后有更好的方案再考慮。
因為程序要支持尋跡的所有功能,所以將程序分成模塊化,便于閱讀和調(diào)試。
程序分為:
1) 主控程序 —— 調(diào)度所有消息,初始化系統(tǒng)
2) 電機驅(qū)動模塊 —— 包含所有與電機驅(qū)動有關(guān)的函數(shù),接受不同的控制命令,并付諸實施;
3) 軌跡采樣模塊 —— 包含所有與軌跡采樣有關(guān)的處理,結(jié)果為與處理后的軌跡狀態(tài);
4) 走軌跡控制模塊 —— 讀取軌跡采樣所獲取的信息,根據(jù)需求和策略輸出相應(yīng)的電機控制命令;將調(diào)試的相關(guān)功能也納入此模塊。
資源分配:
Timer 0 —— 系統(tǒng)時基, 1ms
Timer 1 —— 串口波特率
------------------------------------------------------------------------*/
#pragma PR
#pragma OT(5,size)
#pragma Listinclude
#pragma code
#include <E:\dingqi\keilc51\inc\math.h>
#include <STC12C5410AD.h> /* STC12C5410AD 的頭文件*/
#include <Port_Def.H>
#include <ComConst.H>
#include <CM_Const.H>
#include <CM_Var.H>
void init_hardware(void); // 硬件初始化函數(shù)
void init_var(void); // 初始化變量
void feed_watchdog(void); // 清看門狗計數(shù)器
extern void init_LineCtrl_Hardware(void); // 初始化軌跡控制模塊用硬件
extern void init_LineCtrl_Var(void); // 初始化軌跡控制模塊用變量
extern void lineCtrl_proc(unsigned char ucMessage); // 軌跡控制部分處理入口函數(shù)
extern void init_MotorDrv_Hardware(void); // 初始化電機驅(qū)動模塊用硬件
extern void init_MotorDrv_Var(void); // 初始化電機驅(qū)動模塊用變量
extern void calOutValue(unsigned char No); // 計算電機控制輸出值
extern void calSpeed(void); // 計算轉(zhuǎn)速
extern void proc_Stop(unsigned char No); // 處理行走脈沖計數(shù)
extern void proc_PID_Ctrl(unsigned char No); // 處理PID控制
extern void init_LineSamp_Hardware(void); // 初始化軌跡采樣模塊用硬件
extern void init_LineSamp_Var(void); // 初始化軌跡采樣模塊用變量
extern void lineSamp_proc(void); // 軌跡采樣處理
/******** 主程序 *************/
void main(void)
{
init_hardware();
init_var();
EA = TRUE; // 啟動中斷,開始正常工作
while(1)
{
if(gb_CheckM1StopCnt)
{
gb_CheckM1StopCnt = FALSE;
proc_Stop(MOTOR1); // 處理行走脈沖計數(shù)
}
if(gb_M1CalOutValue == TRUE)
{
gb_M1CalOutValue = FALSE;
calOutValue(MOTOR1); // 根據(jù)變化后的參數(shù)計算電機輸出控制數(shù)據(jù)
}
if(gb_CheckM2StopCnt)
{
gb_CheckM2StopCnt = FALSE;
proc_Stop(MOTOR2); // 處理行走脈沖計數(shù)
}
if(gb_M2CalOutValue == TRUE)
{
gb_M2CalOutValue = FALSE;
calOutValue(MOTOR2); // 根據(jù)變化后的參數(shù)計算電機輸出控制數(shù)據(jù)
}
if(gb_calSpeed)
{
gb_calSpeed = FALSE;
calSpeed(); // 計算速度
}
if(gb_SpeedOk)
{
gb_SpeedOk = FALSE;
if(gb_EnablePID)
{
proc_PID_Ctrl(MOTOR1); // 根據(jù)速度值計算PID控制值
proc_PID_Ctrl(MOTOR2); // 根據(jù)速度值計算PID控制值
}
}
if(gb_NewData)
{
gb_NewData = FALSE;
lineCtrl_proc(NEW_RCV_DATA); // 處理數(shù)據(jù)接收
}
if(gb_SampleStart)
{
union
{
unsigned int all;
unsigned char b[2];
}uiTemp;
uiTemp.b[0] = TH0;
uiTemp.b[1] = TL0;
if(uiTemp.all > (TIME1ms_C + SAMP_LED_ONTIME))
{
gb_SampleStart = FALSE;
lineSamp_proc(); // 處理軌跡采樣
}
}
if(gb_NewSampData)
{
gb_NewSampData = FALSE;
lineCtrl_proc(NEW_SAMP_DATA); // 處理軌跡采樣數(shù)據(jù)
}
if (gb_1msFlag==TRUE)
{
gb_1msFlag=FALSE;
gc_LED_Time_Cnt--;
if(gc_LED_Time_Cnt ==0)
{
gc_LED_Time_Cnt = LED_ON_OFF_TIME;
gb_WorkDisp = ~gb_WorkDisp;
}
gc_ui1msCnt--;
if(gc_ui1msCnt==0)
{
gc_ui1msCnt=WDTTIME_C;
feed_watchdog();
}
gc_ucMeaSpeedTimeCnt--;
if(gc_ucMeaSpeedTimeCnt ==0)
{
gc_ucMeaSpeedTimeCnt = MEA_SPEED_PERIOD;
gb_calSpeed = TRUE;
}
}
}
}
/********** 模塊自用函數(shù) **************/
// 以下函數(shù)只由模塊自身使用,別的模塊不用聲明。
/********************************************/
/*名稱: init_hardware */
/*用途: 硬件初始化函數(shù) */
/*說明: 初始化所有相關(guān)的硬件狀態(tài) */
/********************************************/
void init_hardware(void)
{
/* 初始化系統(tǒng)時鐘 */
CLK_DIV = CLKDIV1_C;
/* 初始化I/O口*/
P1M0 = P1M0_C;
P1M1 = P1M1_C;
P2M0 = P2M0_C;
P2M1 = P2M1_C;
P3M0 = P3M0_C;
P3M1 = P3M1_C;
/* 初始化定時器 */
TMOD = T0MODE1|T1MODE2; // Timer0工作在模式1 ,16位定時,Timer1 工作在模式 2 ,8位重加載,作為波特率發(fā)生器;
AUXR = AUXR&CLR_T0X12_C; // Timer0 工作在12分頻
TCON = 0; /* 未使用外部中斷,所以不用定義中斷的觸發(fā)方式 */
TH0 = TIME1msH_C;
TL0 = TIME1msH_C;
TR0 = TRUE;
/* 初始化中斷 */
IE = EnT0_C; // 此處只允許 Timer0 中斷,其它由各模塊自身決定
IPH = NOIP_C; // 此處不設(shè)優(yōu)先級,有各功能模塊自身設(shè)定
IP = NOIP_C;
/* 初始化軌跡采樣模塊所需硬件 */
init_LineSamp_Hardware();
/* 初始化軌跡控制所需硬件 */
init_LineCtrl_Hardware();
/* 初始化電機驅(qū)動所需硬件 */
init_MotorDrv_Hardware();
/* 看門狗初始化程序 */
WDT_CONTR = Watchdog_C; // 設(shè)置 WDT 分頻
}
/********************************************/
/*名稱: init_var */
/*用途: 變量初始化 */
/*說明: 初始化全局變量 */
/********************************************/
void init_var(void)
{
// WDT參數(shù)初始化
gb_1msFlag=FALSE;
gc_ui1msCnt=WDTTIME_C;
gc_LED_Time_Cnt = LED_ON_OFF_TIME;
/* 初始化軌跡采樣模塊用變量 */
init_LineSamp_Var();
/* 初始化軌跡控制所用變量 */
init_LineCtrl_Var();
/* 初始化電機驅(qū)動所用變量 */
init_MotorDrv_Var();
}
/********************************************/
/*名稱: feed_watchdog */
/*用途: 喂狗程序 */
/*說明: 請參照STC12C5410的喂狗方法說明 */
/********************************************/
void feed_watchdog(void)
{
WDT_CONTR = CLRWDT_C;
}
// ------------- 中斷處理程序 ---------------------
/********************************************/
/* 定時器 0 中斷服務(wù) */
/* 說明: 1ms 中斷一次, */
/********************************************/
void Timer0_Int(void) interrupt 1 using 1
{
TH0 = TIME1msH_C;
TL0 = TIME1msL_C;
gb_1msFlag = TRUE;
gb_EnSample = ~gb_EnSample;
if(gb_EnSample)
{
gb_Sample = EN_Sample; // 打開采樣LED
gb_SampleStart = TRUE;
}
}
\032
復(fù)制代碼
51hei.png
(12.68 KB, 下載次數(shù): 91)
下載附件
2021-9-23 21:58 上傳
代碼和原理圖資料51hei附件下載:
智能小車詳細(xì)資料.rar
(238.93 KB, 下載次數(shù): 68)
2021-9-23 09:15 上傳
點擊文件名下載附件
智能小車詳細(xì)資料
下載積分: 黑幣 -5
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1