91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一種單片機(jī)數(shù)據(jù)解析方法

GReq_mcu168 ? 來(lái)源:CSDN ? 作者:CSDN ? 2022-04-01 10:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前陣子一朋友使用單片機(jī)與某外設(shè)進(jìn)行通信時(shí),外設(shè)返回的是一堆格式如下的數(shù)據(jù):

AA AA 04 80 02 00 02 7B AA AA 04 80 02 00 08 75 AA AA 04 80 02 00 9B E2 AA AA 04 80 02 00 F6 87 AA AA 04 80 02 00 EC 91

其中 AA AA 04 80 02 是數(shù)據(jù)校驗(yàn)頭,后面三位是有效數(shù)據(jù),問(wèn)我怎么從外設(shè)不斷返回的數(shù)據(jù)中取出有效的數(shù)據(jù)。

對(duì)于這種問(wèn)題最容易想到的就是使用一個(gè)標(biāo)志位用于標(biāo)志當(dāng)前正解析到一幀數(shù)據(jù)的第幾位,然后判斷當(dāng)前接收的數(shù)據(jù)是否與校驗(yàn)數(shù)據(jù)一致,如果一致則將標(biāo)志位加一,否則將標(biāo)志位置0重新判斷,使用這種方法解析數(shù)據(jù)的代碼如下:

if(flag==0)
{
if(tempData==0xAA)
flag++;
else
flag=0;
}
elseif(flag==1)
{
if(tempData==0xAA)
flag++;
else
flag=0;
}
elseif(flag==2)
{
if(tempData==0x04)
flag++;
else
flag=0;
}
elseif(flag==3)
{
if(tempData==0x80)
flag++;
else
flag=0;
}
elseif(flag==4)
{
if(tempData==0x02)
flag++;
else
flag=0;
}
elseif(flag==5||flag==6||flag==7)
{
data[flag-5]=tempData;
flag=(flag==7)?0:flag+1;
}

使用上述方法是最容易想到的也是最簡(jiǎn)單的方法了,百度了一下基本上也都是使用類(lèi)似的方法進(jìn)行數(shù)據(jù)解析,但是使用這種方法有如下幾個(gè)缺點(diǎn):

1、 大量使用了判斷,容易導(dǎo)致出現(xiàn)邏輯混亂。

2、 代碼重復(fù)率高,抽象程度低。從上述代碼可以看到一大堆代碼僅僅是判斷的數(shù)據(jù)不同,其他代碼都完全一致。

3、 代碼可復(fù)用性差。寫(xiě)好的代碼無(wú)法用在其他類(lèi)似的外設(shè)上,如果有多個(gè)外設(shè)就需要編寫(xiě)多份類(lèi)似的代碼。

4、 可擴(kuò)展性低。如果外設(shè)還有一個(gè)數(shù)據(jù)校驗(yàn)尾需要校驗(yàn)或者數(shù)據(jù)校驗(yàn)頭發(fā)生改變,就需要再次寫(xiě)多個(gè)判斷重新用于校驗(yàn),無(wú)法在原有的代碼上進(jìn)行擴(kuò)展。

5、 容易出現(xiàn)誤判 。

對(duì)此,這里提出了一種新的解決方案,可以通用與所有類(lèi)似的數(shù)據(jù)解析,原理如下:

使用一個(gè)固定容量的隊(duì)列用來(lái)緩存接收到的數(shù)據(jù),隊(duì)列容量等于一幀數(shù)據(jù)的大小,每來(lái)一個(gè)數(shù)據(jù)就將數(shù)據(jù)往隊(duì)列里面加,當(dāng)完整接收到一幀數(shù)據(jù)時(shí)此時(shí)隊(duì)列中的全部數(shù)據(jù)也就是一幀完整的數(shù)據(jù),因此只需要判斷隊(duì)列是否是數(shù)據(jù)校驗(yàn)頭,隊(duì)列尾是否是數(shù)據(jù)校驗(yàn)尾就可以得知當(dāng)前是否已經(jīng)接收到了一幀完整的數(shù)據(jù),然后在將數(shù)據(jù)從隊(duì)列中取出即可。原理圖如下:

每來(lái)一個(gè)數(shù)據(jù)就往隊(duì)列里面加:

3b5c029a-b145-11ec-aa7f-dac502259ad0.png

當(dāng)接收到一幀完整數(shù)據(jù)時(shí)隊(duì)列頭和數(shù)據(jù)校驗(yàn)頭重合:

3b6e2ed4-b145-11ec-aa7f-dac502259ad0.png

此時(shí)只需要從隊(duì)列中取出有效數(shù)據(jù)即可。

如果有數(shù)據(jù)尾校驗(yàn),僅僅只需要添加一個(gè)校驗(yàn)尾即可,如下圖所示:

3b93d3dc-b145-11ec-aa7f-dac502259ad0.png

好,分析結(jié)束,開(kāi)始編碼。

首先需要一個(gè)隊(duì)列,為了保證通用性,隊(duì)列底層使用類(lèi)似于雙向鏈表的實(shí)現(xiàn)(當(dāng)然也可以使用數(shù)組實(shí)現(xiàn)),需要封裝的結(jié)構(gòu)有隊(duì)列容量、隊(duì)列大小、隊(duì)頭節(jié)點(diǎn)和隊(duì)尾節(jié)點(diǎn),需要實(shí)現(xiàn)的操作有隊(duì)列初始化、數(shù)據(jù)入隊(duì)、數(shù)據(jù)出隊(duì)、清空隊(duì)列和釋放隊(duì)列,具體代碼如下:

/*queue.h*/

#ifndef_QUEUE_H_
#define_QUEUE_H_

#ifndefNULL
#defineNULL((void*)0)
#endif

typedefunsignedcharuint8;

/*隊(duì)列節(jié)點(diǎn)*/
typedefstructNode
{
uint8data;
structNode*pre_node;
structNode*next_node;
}Node;

/*隊(duì)列結(jié)構(gòu)*/
typedefstructQueue
{
uint8capacity;//隊(duì)列總?cè)萘?/span>
uint8size;//當(dāng)前隊(duì)列大小
Node*front;//隊(duì)列頭節(jié)點(diǎn)
Node*back;//隊(duì)列尾節(jié)點(diǎn)
}Queue;

/*初始化一個(gè)隊(duì)列*/
Queue*init_queue(uint8_capacity);
/*數(shù)據(jù)入隊(duì)*/
uint8en_queue(Queue*_queue,uint8_data);
/*數(shù)據(jù)出隊(duì)*/
uint8de_queue(Queue*_queue);
/*清空隊(duì)列*/
voidclear_queue(Queue*_queue);
/*釋放隊(duì)列*/
voidrelease_queue(Queue*_queue);

#endif
/*queue.c*/

#include
#include"parser.h"

/**
*初始化一個(gè)隊(duì)列
*
*@_capacity:隊(duì)列總?cè)萘?*/
Queue*init_queue(uint8_capacity)
{
Queue*queue=(Queue*)malloc(sizeof(Queue));
queue->capacity=_capacity;
queue->size=0;
returnqueue;
}

/**
*數(shù)據(jù)入隊(duì)
*
*@_queue:隊(duì)列
*@_data:數(shù)據(jù)
**/
uint8en_queue(Queue*_queue,uint8_data)
{
if(_queue->sizecapacity)
{
Node*node=(Node*)malloc(sizeof(Node));
node->data=_data;
node->next_node=NULL;

if(_queue->size==0)
{
node->pre_node=NULL;
_queue->back=node;
_queue->front=_queue->back;
}
else
{
node->pre_node=_queue->back;

_queue->back->next_node=node;
_queue->back=_queue->back->next_node;
}
_queue->size++;
}
else
{
Node*temp_node=_queue->front->next_node;
_queue->front->pre_node=_queue->back;
_queue->back->next_node=_queue->front;
_queue->back=_queue->back->next_node;
_queue->back->data=_data;
_queue->back->next_node=NULL;
_queue->front=temp_node;
}
return_queue->size-1;
}

/**
*數(shù)據(jù)出隊(duì)
*
*@_queue:隊(duì)列
*
*@return:出隊(duì)的數(shù)據(jù)
*/
uint8de_queue(Queue*_queue)
{
uint8old_data=0;

if(_queue->size>0)
{
old_data=_queue->front->data;
if(_queue->size==1)
{
free(_queue->front);
_queue->front=NULL;
_queue->back=NULL;
}
else
{
_queue->front=_queue->front->next_node;
free(_queue->front->pre_node);
_queue->front->pre_node=NULL;
}
_queue->size--;
}
returnold_data;
}

/**
*清空隊(duì)列
*
*@_queue:隊(duì)列
*/
voidclear_queue(Queue*_queue)
{
while(_queue->size>0)
{
de_queue(_queue);
}
}

/**
*釋放隊(duì)列
*
*@_queue:隊(duì)列
*/
voidrelease_queue(Queue*_queue)
{
clear_queue(_queue);
free(_queue);
_queue=NULL;
}

其次是解析器,需要封裝的結(jié)構(gòu)有解析數(shù)據(jù)隊(duì)列、數(shù)據(jù)校驗(yàn)頭、數(shù)據(jù)校驗(yàn)尾、解析結(jié)果以及指向解析結(jié)果的指針,需要實(shí)現(xiàn)的操作有解析器初始化、添加數(shù)據(jù)解析、獲取解析結(jié)果、重置解析器和釋放解析器,具體代碼如下:

/*parser.h*/

#ifndef_PARSER_H_
#define_PARSER_H_

#include"queue.h"

typedefenum
{
RESULT_FALSE,
RESULT_TRUE
}ParserResult;

/*解析器結(jié)構(gòu)*/
typedefstructDataParser
{
Queue*parser_queue;//數(shù)據(jù)解析隊(duì)列
Node*resule_pointer;//解析結(jié)果數(shù)據(jù)指針
uint8*data_header;//數(shù)據(jù)校驗(yàn)頭指針
uint8header_size;//數(shù)據(jù)校驗(yàn)頭大小
uint8*data_footer;//數(shù)據(jù)校驗(yàn)尾指針
uint8footer_size;//數(shù)據(jù)校驗(yàn)尾大小
uint8result_size;//解析數(shù)據(jù)大小
ParserResultparserResult;//解析結(jié)果
}DataParser;

/*初始化一個(gè)解析器*/
DataParser*parser_init(uint8*_data_header,uint8_header_size,uint8*_data_footer,uint8_foot_size,uint8_data_frame_size);
/*將數(shù)據(jù)添加到解析器中進(jìn)行解析*/
ParserResultparser_put_data(DataParser*_parser,uint8_data);
/*解析成功后從解析器中取出解析結(jié)果*/
intparser_get_data(DataParser*_parser,uint8_index);
/*重置解析器*/
voidparser_reset(DataParser*_parser);
/*釋放解析器*/
voidparser_release(DataParser*_parser);

#endif
/*parser.c*/

#include
#include"parser.h"

/**
*初始化一個(gè)解析器
*
*@_data_header:數(shù)據(jù)頭指針
*@_header_size:數(shù)據(jù)頭大小
*@_data_footer:數(shù)據(jù)尾指針
*@_foot_size:數(shù)據(jù)尾大小
*@_data_frame_size:一幀完整數(shù)據(jù)的大小
*
*@return:解析器
*/
DataParser*parser_init(uint8*_data_header,uint8_header_size,uint8*_data_footer,uint8_foot_size,uint8_data_frame_size)
{
if((_header_size+_foot_size)>_data_frame_size||(_header_size+_foot_size)==0)
returnNULL;

DataParser*parser=(DataParser*)malloc(sizeof(DataParser));
parser->parser_queue=init_queue(_data_frame_size);
parser->resule_pointer=NULL;
parser->data_header=_data_header;
parser->header_size=_header_size;
parser->data_footer=_data_footer;
parser->footer_size=_foot_size;
parser->result_size=_data_frame_size-parser->header_size-parser->footer_size;
parser->parserResult=RESULT_FALSE;

while(_data_frame_size-->0)
{
en_queue(parser->parser_queue,0);
}

returnparser;
}

/**
*將數(shù)據(jù)添加到解析器中進(jìn)行解析
*
*@_parser:解析器
*@_data:要解析的數(shù)據(jù)
*
*@return:當(dāng)前解析結(jié)果,返回RESULT_TRUE代表成功解析出一幀數(shù)據(jù)
*/
ParserResultparser_put_data(DataParser*_parser,uint8_data)
{
uint8i;
Node*node;

if(_parser==NULL)
returnRESULT_FALSE;

en_queue(_parser->parser_queue,_data);

/*校驗(yàn)數(shù)據(jù)尾*/
node=_parser->parser_queue->back;
for(i=_parser->footer_size;i>0;i--)
{
if(node->data!=_parser->data_footer[i-1])
gotoDATA_FRAME_FALSE;
node=node->pre_node;
}

/*校驗(yàn)數(shù)據(jù)頭*/
node=_parser->parser_queue->front;
for(i=0;iheader_size;i++)
{
if(node->data!=_parser->data_header[i])
gotoDATA_FRAME_FALSE;
node=node->next_node;
}

if(_parser->resule_pointer==NULL&&_parser->result_size>0)
_parser->resule_pointer=node;
if(_parser->parserResult!=RESULT_TRUE)
_parser->parserResult=RESULT_TRUE;
return_parser->parserResult;

DATA_FRAME_FALSE:
if(_parser->resule_pointer!=NULL)
_parser->resule_pointer=NULL;
if(_parser->parserResult!=RESULT_FALSE)
_parser->parserResult=RESULT_FALSE;
return_parser->parserResult;

}

/**
*解析成功后從解析器中取出解析結(jié)果
*
*@_parser:解析器
*@_index:解析結(jié)果集合中的第_index個(gè)數(shù)據(jù)
*
*@return:獲取解析成功的數(shù)據(jù),返回-1代表數(shù)據(jù)獲取失敗
*/
intparser_get_data(DataParser*_parser,uint8_index)
{
Node*node;
if(_parser==NULL
||_parser->parserResult!=RESULT_TRUE
||_index>=_parser->result_size
||_parser->resule_pointer==NULL)
return-1;
node=_parser->resule_pointer;
while(_index>0)
{
node=node->next_node;
_index--;
}
returnnode->data;
}

/**
*重置解析器
*
*@_parser:解析器
*/
voidparser_reset(DataParser*_parser)
{
uint8_data_frame_size;

if(_parser==NULL)
return;

_data_frame_size=_parser->parser_queue->size;
while(_data_frame_size-->0)
{
en_queue(_parser->parser_queue,0);
}
_parser->resule_pointer=NULL;
_parser->parserResult=RESULT_FALSE;
}

/**
*釋放解析器
*
*@_parser:解析器
*/
voidparser_release(DataParser*_parser)
{
if(_parser==NULL)
return;
release_queue(_parser->parser_queue);
free(_parser);
_parser=NULL;
}

接下來(lái)編寫(xiě)測(cè)試代碼測(cè)試一下:

/*main.c*/

#include
#include"parser.h"

intmain()
{
uint8i;
//數(shù)據(jù)頭
uint8data_header[]={0xAA,0xAA,0x04,0x80,0x02};
//要解析的數(shù)據(jù),測(cè)試用
uint8data[]={
0xAA,0xAA,0x04,0x80,0x02,0x00,0x02,0x7B,0xAA,0xAA,0x04,0x80,
0x02,0x00,0x08,0x75,0xAA,0xAA,0x04,0x80,0x02,0x00,0x9B,0xE2,
0xAA,0xAA,0x04,0x80,0x02,0x00,0xF6,0x87,0xAA,0xAA,0x04,0x80,
0x02,0x00,0xEC,0x91,0xAA,0xAA,0x04,0x80,0x02,0x01,0x15,0x67,
0xAA,0xAA,0x04,0x80,0x02,0x01,0x49,0x33,0xAA,0xAA,0x04,0x80,
0x02,0x00,0xE7,0x96,0xAA,0xAA,0x04,0x80,0x02,0x00,0x68,0x15,
0xAA,0xAA,0x04,0x80,0x02,0x00,0x3C,0x41,0xAA,0xAA,0x04,0x80,
0x02,0x00,0x66,0x17,0xAA,0xAA,0x04,0x80,0x02,0x00,0xA5,0xD8,
0xAA,0xAA,0x04,0x80,0x02,0x01,0x26,0x56,0xAA,0xAA,0x04,0x80,
0x02,0x01,0x73,0x09,0xAA,0xAA,0x04,0x80,0x02,0x01,0x64,0x18,
0xAA,0xAA,0x04,0x80,0x02,0x01,0x8B,0xF1,0xAA,0xAA,0x04,0x80,
0x02,0x01,0xC6,0xB6,0xAA,0xAA,0x04,0x80,0x02,0x01,0x7B,0x01,
0xAA,0xAA,0x04,0x80,0x02,0x00,0xCB,0xB2,0xAA,0xAA,0x04,0x80,
0x02,0x00,0x2C,0x51,0xAA,0xAA,0x04,0x80,0x02,0xFF,0xE5,0x99
};

/**
*初始化一個(gè)解析器
*第一個(gè)參數(shù)是數(shù)據(jù)頭
*第二個(gè)參數(shù)是數(shù)據(jù)頭長(zhǎng)度
*第三個(gè)參數(shù)是數(shù)據(jù)尾指針
*第四個(gè)參數(shù)是數(shù)據(jù)尾大小
*第五個(gè)參數(shù)是一整幀數(shù)據(jù)的大小
*/
DataParser*data_parser=parser_init(data_header,sizeof(data_header),NULL,0,8);

//將要解析的數(shù)據(jù)逐個(gè)取出,添加到解析器中
for(i=0;isizeof(data);i++)
{
//解析數(shù)據(jù),返回RESULT_TRUE代表成功解析出一組數(shù)據(jù)
if(parser_put_data(data_parser,data[i])==RESULT_TRUE)
{
printf("成功解析出一幀數(shù)據(jù)...
");

/*一位一位取出解析后的數(shù)據(jù)*/
printf("第一個(gè)數(shù)據(jù)是:0x%x
",parser_get_data(data_parser,0));
printf("第二個(gè)數(shù)據(jù)是:0x%x
",parser_get_data(data_parser,1));
printf("第三個(gè)數(shù)據(jù)是:0x%x


",parser_get_data(data_parser,2));
}
}

//當(dāng)不再需要解析器時(shí),應(yīng)該把解析器釋放掉,回收內(nèi)存,避免造成內(nèi)存泄漏
parser_release(data_parser);

return0;
}

測(cè)試結(jié)果如下:

3bb3cb9c-b145-11ec-aa7f-dac502259ad0.png

從上面可以看出,解析的結(jié)果與目標(biāo)一致。

github地址:

https://github.com/528787067/DataFrameParser

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6076

    文章

    45495

    瀏覽量

    670313
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7335

    瀏覽量

    94760

原文標(biāo)題:一種單片機(jī)數(shù)據(jù)解析方法

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    深入解析英飛凌XC835/836 8位單片機(jī):特性、參數(shù)與應(yīng)用考量

    富的特性,在眾多單片機(jī)產(chǎn)品中脫穎而出。今天,我們就來(lái)詳細(xì)解析下這款單片機(jī),探討它的特點(diǎn)、參數(shù)以及在實(shí)際設(shè)計(jì)中的應(yīng)用考量。 文件下載: XC836T2FRIABFXUMA1.pdf
    的頭像 發(fā)表于 02-10 11:05 ?412次閱讀

    單片機(jī)mcu模塊,mcu單片機(jī)是什么意思,32位mcu單片機(jī)解析

    在嵌入式系統(tǒng)領(lǐng)域,MCU(Microcontroller,常簡(jiǎn)稱(chēng)單片機(jī))扮演著至關(guān)重要的角色。它并非普通意義上的計(jì)算機(jī),而是一種高度集成的微型芯片,內(nèi)部包含了CPU、存儲(chǔ)器(ROM/RAM)、多種
    的頭像 發(fā)表于 01-19 15:30 ?520次閱讀
    <b class='flag-5'>單片機(jī)</b>mcu模塊,mcu<b class='flag-5'>單片機(jī)</b>是什么意思,32位mcu<b class='flag-5'>單片機(jī)</b><b class='flag-5'>解析</b>

    學(xué)習(xí)單片機(jī)快速方法

    、STCSiemens等公司的產(chǎn)品。之所以要從80C51學(xué)起,是因?yàn)槟壳昂芏喙径际怯?1核心的單片機(jī)。 而且51的資料很多,懂的人也比較多。其實(shí)你學(xué)好了一種單片機(jī),再學(xué)習(xí)其他的單片機(jī)
    發(fā)表于 01-14 07:42

    單片機(jī)系統(tǒng)設(shè)計(jì)方法

    也得到迅猛發(fā)展,因此單片機(jī)數(shù)據(jù)采集技術(shù)也已成為一種廣泛實(shí)用的電子技術(shù)。隨著數(shù)字化技術(shù)的不斷發(fā)展,數(shù)據(jù)采集技術(shù)也呈現(xiàn)出速度更快、通道更多、數(shù)據(jù)
    發(fā)表于 01-06 06:23

    單片機(jī)堆棧解析

    什么是單片機(jī)堆棧? 在片內(nèi)RAM中,常常要指定個(gè)專(zhuān)門(mén)的區(qū)域來(lái)存放某些特別的數(shù)據(jù),它遵循順序存取和后進(jìn)先出(LIFO/FILO)的原則,這個(gè)RAM區(qū)叫堆棧。 它的作用 子程序調(diào)用和中斷服務(wù)時(shí)CPU
    發(fā)表于 12-09 06:52

    單片機(jī)系統(tǒng)硬件的調(diào)試方法

    單片機(jī)的系統(tǒng)硬件調(diào)試,通常有靜態(tài)調(diào)試和動(dòng)態(tài)調(diào)試兩不同,前者是通過(guò)目測(cè)、萬(wàn)能表測(cè)試、加電檢查、聯(lián)機(jī)檢查的方法,在加電于樣機(jī)之前.對(duì)樣機(jī)的型號(hào)規(guī)格,以及安裝要求等進(jìn)行核對(duì),同時(shí)檢查 電源 系統(tǒng).防止
    發(fā)表于 12-03 06:10

    解析單片機(jī)晶振腳的原理

    晶振是重要元器件之,對(duì)于晶振,小編于往期晶振相關(guān)文章中有過(guò)諸多闡述。本文中,小編將對(duì)單片機(jī)晶振腳的原理加以解析,以幫助大家更好理解晶振。晶振電路需要2個(gè)10-30pF級(jí)別的電容作為起振用途
    的頭像 發(fā)表于 11-21 15:37 ?3608次閱讀
    <b class='flag-5'>一</b>文<b class='flag-5'>解析</b><b class='flag-5'>單片機(jī)</b>晶振腳的原理

    第1章 如何學(xué)習(xí)單片機(jī)

    ? 在錯(cuò)誤的道路上日夜兼程,最終也無(wú)法成功,方法和思路絕對(duì)是最重要的。本章節(jié)講到的學(xué)習(xí)單片機(jī)方法,都是作者學(xué)習(xí)單片機(jī)的無(wú)數(shù)經(jīng)驗(yàn)和教訓(xùn)總結(jié)出來(lái)的瑰寶。通過(guò)作者前面的披荊斬棘,開(kāi)辟了道路
    的頭像 發(fā)表于 10-10 10:32 ?513次閱讀

    單片機(jī)個(gè)承載科技與工程思維的核心平臺(tái)

    在現(xiàn)代社會(huì)中,科技的快速發(fā)展推動(dòng)了各個(gè)行業(yè)和技術(shù)的革新。單片機(jī)(Single Chip Computer)作為一種集成化的電子系統(tǒng),正在逐漸成為連接數(shù)字世界與物理世界的橋梁。無(wú)論是智能家居、自動(dòng)駕駛
    的頭像 發(fā)表于 09-29 01:07 ?575次閱讀

    單片機(jī)原理及應(yīng)用詳解

    單片機(jī)(Microcontroller Unit, MCC) ?是一種集成計(jì)算機(jī)核心功能(CPU、存儲(chǔ)器、I/O接口等)的微型芯片,廣泛應(yīng)用于嵌入式系統(tǒng)中。以下是其原理及應(yīng)用的詳細(xì)介紹: 、
    的頭像 發(fā)表于 08-11 13:57 ?2282次閱讀

    單片機(jī)是由什么組成的

    單片機(jī)作為一種集成化的微型計(jì)算機(jī),其核心優(yōu)勢(shì)在于將多個(gè)功能模塊緊湊地集成在塊芯片上,從而實(shí)現(xiàn)數(shù)據(jù)處理、外設(shè)控制等功能。了解單片機(jī)的組成部分
    的頭像 發(fā)表于 07-29 11:03 ?1171次閱讀

    單片機(jī)怎么控制轉(zhuǎn)速

    ? ? ? ?在工業(yè)自動(dòng)化、智能家居、機(jī)器人等領(lǐng)域,單片機(jī)控制電機(jī)轉(zhuǎn)速是實(shí)現(xiàn)精準(zhǔn)運(yùn)動(dòng)控制的核心技術(shù)。通過(guò)結(jié)合硬件電路設(shè)計(jì)與軟件算法優(yōu)化,單片機(jī)可根據(jù)不同應(yīng)用場(chǎng)景靈活調(diào)整電機(jī)轉(zhuǎn)速。以下從控制方法、實(shí)際
    的頭像 發(fā)表于 07-25 13:58 ?953次閱讀

    怎么測(cè)單片機(jī)系統(tǒng)頻率

    單片機(jī)系統(tǒng)頻率是指單片機(jī)工作時(shí)的時(shí)鐘頻率,它直接影響單片機(jī)的運(yùn)行速度和處理能力,準(zhǔn)確測(cè)量系統(tǒng)頻率對(duì)單片機(jī)應(yīng)用開(kāi)發(fā)、程序調(diào)試和性能優(yōu)化具有重要意義。測(cè)量
    的頭像 發(fā)表于 07-25 11:39 ?783次閱讀

    單片機(jī)和伺服有什么區(qū)別

    : 1. 定義與功能 特性 單片機(jī)(Microcontroller) 伺服系統(tǒng)(Servo System) 定義 一種集成CPU、內(nèi)存、I/O接口的微型計(jì)算機(jī)芯片,用于控制設(shè)備。 一種由伺服電機(jī)、編碼器
    的頭像 發(fā)表于 05-26 09:18 ?852次閱讀

    PLC和單片機(jī)到底有什么區(qū)別?

    解它們的特點(diǎn)及適用場(chǎng)景。單片機(jī)的核心是集成的芯片,PLC的核心實(shí)際上就是單片機(jī)單片機(jī)(MicrocontrollerUnit,MCU)是一種高度集成的芯片,集合
    的頭像 發(fā)表于 04-07 11:58 ?6356次閱讀
    PLC和<b class='flag-5'>單片機(jī)</b>到底有什么區(qū)別?