www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]1 引 言在調(diào)試單片機(jī)應(yīng)用系統(tǒng)時,需要反復(fù)地修改用戶程序,為了避免頻繁地使用編程器寫存儲芯片,可以編制單片機(jī)監(jiān)控程序,單片機(jī)的監(jiān)控程序接收來自PC機(jī)的用戶程序,PC機(jī)向單片機(jī)發(fā)送用戶程序。2 用戶程序格式用

1 引 言

在調(diào)試單片機(jī)應(yīng)用系統(tǒng)時,需要反復(fù)地修改用戶程序,為了避免頻繁地使用編程器寫存儲芯片,可以編制單片機(jī)監(jiān)控程序,單片機(jī)的監(jiān)控程序接收來自PC機(jī)的用戶程序,PC機(jī)向單片機(jī)發(fā)送用戶程序。

2 用戶程序格式

用戶將單片機(jī)源程序(.a(chǎn)sm文件)匯編后形成.hex格式的文件,該文件即為發(fā)送至單片機(jī)的十六進(jìn)制可執(zhí)行文件。該文件的結(jié)構(gòu)是:由多行構(gòu)成,行頭為起始符(:),然后是該行有效數(shù)據(jù)字節(jié)數(shù)(滿行時該數(shù)為10,即十進(jìn)數(shù)16),接下來為兩字節(jié)地址及00,接著是有效數(shù)據(jù),行尾是校驗碼及換行符。為了簡化單片機(jī)監(jiān)控程序,僅向單片機(jī)發(fā)送行字節(jié)數(shù)和有效數(shù)據(jù),可用下面的簡單C語句從.hex文件中提取字節(jié)數(shù)和有效數(shù)據(jù):
  fscanf(fp,":%2x%4x00",&TranBytes,&Address);
  fscanf(fp,"%2x",&TranChar);

3 單片機(jī)監(jiān)控程序的實(shí)現(xiàn)

單片機(jī)監(jiān)控程序?qū)崿F(xiàn)的功能為:接收來自PC機(jī)的用戶程序,將用戶程序放置在用戶程序段,當(dāng)用戶程序接收完畢后,跳轉(zhuǎn)至用戶程序段首地址以執(zhí)行用戶程序。接收采用單字節(jié)方式,即每次只接收一個字節(jié)。

為了保證單片機(jī)接收用戶程序的準(zhǔn)確性,在接收用戶程序之前需要進(jìn)行握手。筆者所用的握手協(xié)議為:PC機(jī)發(fā)0x55,單片機(jī)收0x55后發(fā)回0x55給PC 機(jī),上位PC機(jī)收0x55后再發(fā)0xaa,單片機(jī)收0xaa后發(fā)回,PC機(jī)收0xaa后握手成功,轉(zhuǎn)為發(fā)用戶程序,單片機(jī)轉(zhuǎn)為接收用戶程序。

為了防止單片機(jī)監(jiān)控程序被破壞,需將其固化在EPROM里。筆者所用的80C196系統(tǒng),將地址2000H-7FFFFH固化,監(jiān)控程序從2080開始。這樣一來又涉及到如何使用中斷向量的問題。可以這樣解決:在中斷向量地址中放入8000之后的地址,舉例說明,在串行中斷向量地址放入8030H,當(dāng)要使用串行中斷時,在8030中PUSHF和LJMP指令,在8032中放入跳轉(zhuǎn)字節(jié)數(shù)。

利用串行中斷,單片機(jī)接收用戶程序為逐行接收(見前敘.hex文件的結(jié)構(gòu))。先接收本行要接收的字節(jié)個數(shù),然后才將接受的有效數(shù)據(jù)寫入用戶程序段,當(dāng)接受的有效數(shù)據(jù)數(shù)等于該行要接收的字節(jié)個數(shù)時,準(zhǔn)備接收下一行,如此反復(fù),如果某行要接收的字節(jié)數(shù)為0,則表明用戶程序已經(jīng)傳完,將用戶程序段首址壓入堆棧再彈出(改變中斷返回地址技術(shù)),以執(zhí)行用戶程序,如圖1所示。

4 Win98平臺串行通信的實(shí)現(xiàn)

現(xiàn)在PC機(jī)的應(yīng)用程序絕大多數(shù)都是基于Win98,在進(jìn)行串行通信時可以通過調(diào)用API函數(shù)來實(shí)現(xiàn)。API函數(shù)提供了對串口的各種操作。串口通信時通過 CreateFile,GetCommState,SetCommState,WriteFile,ReadFile,CloseHandle以及超時函數(shù)GetCommTimeouts,SetCommTimeouts來實(shí)現(xiàn)。利用CreateFile函數(shù)打開串口,獲取串口句柄, CloseHandle關(guān)閉串口句柄,利用GetComm-State和SetCommState對通信參數(shù)進(jìn)行設(shè)置,WriteFile及 ReadFile可對串口進(jìn)行讀寫。在TC環(huán)境下,對串口的操作方式有兩種:查詢方式和中斷方式。在VC環(huán)境下,對串口的操作方式可有多種:查詢方式,同步I/O方式,異步I/O方式,以及事件驅(qū)動I/O方式。筆者采用的是異步I/O方式,它可以讓串口操作在后臺執(zhí)行。讓讀寫串口操作有足夠的時間在后臺執(zhí)行。使用異步I/O方式時,采用如下方式打開串口:
  HANDLE m_h(yuǎn)Com=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,F(xiàn)ILE_FLAG_OVERLAPPED,NULL);
  FILE_FLAG_OVERLAPPED指明串口為異步方式打開。此時可以分別在WriteFile和ReadFile的最后一個參數(shù)中指定一個OVERLAPPED結(jié)構(gòu),如下所示:
    OVERLAPPED m_OverlappedWrite,     
  m_OverLappedRead;
  m_OverlappedWrite.hEvent=CreateEvent(NULL,TRUE,F(xiàn)ALSE,NULL);
  m_OverlappedRead.hEvent=CreateEvent(NULL,TRUE,F(xiàn)ALSE,NULL);
  CreateEvent函數(shù)創(chuàng)建一個有名或無名的事件對象,第一個參數(shù)為保密屬性,設(shè)為NULL,第二個參數(shù)為TRUE,指明要用ResetEvent函數(shù)將事件設(shè)為無信號,若為FALSE,則在一個等待該事件的線程被釋放后系統(tǒng)自動將其設(shè)置為無信號,第三個參數(shù)設(shè)事件初始為無信號,第四個參數(shù)設(shè)事件名為 NULL。在讀寫操作中使用事件:
  WriteFile(m_h(yuǎn)Com,&WriteBuffer,nByteToWrite,&nByteWritten,&m_OverlappedWrite)
  ReadFile(m_h(yuǎn)Com,&ReadBuffer,nByteToRead,&nByteRead,&m_OverlappedRead)

當(dāng)WriteFile接手控制時m_OverlappedWrite.hEvent為無信號,讀操作完成后,m_OverlappedWrite. hEvent變?yōu)榘l(fā)信號狀態(tài),寫操作完成類似。在使用ReadFile和WriteFile對串口進(jìn)行讀寫時需要注意的是,這兩個函數(shù)均為立即返回型函數(shù),亦即,可能在實(shí)際的讀寫操作還沒有完成時函數(shù)就返回,操作轉(zhuǎn)入后臺,但這并不表明實(shí)際的操作失敗。如果返回錯誤代碼為ERROR_IO_PENDING (通過調(diào)用GetLastError獲?。?,說明讀寫操作仍在進(jìn)行,這時事件仍然為無信號,為了顯式地限定前臺等待操作的時間,可以進(jìn)行延時處理,調(diào)用 GetTickCount,GetTickCount()函數(shù)獲取系統(tǒng)當(dāng)前時間,類似于C中的biostime()函數(shù)。可以通過調(diào)用 GetOverlappedResult獲取后臺的操作情況,該函數(shù)報告最近一次OVERLAPPED操作的結(jié)果,函數(shù)原型如下: 
    BOOLGetOverlappedResult(
    HANDLEhFile,     //文件句柄
    LPOVERLAPPEDlpOverlapped,
                   //OVERLAPPED結(jié)構(gòu)指針
    LPDWORD lpNumberOfBytesTransferred, 
                   //實(shí)際完成的字節(jié)數(shù)
    BOOLbWait
                   //等待標(biāo)志?。?;

在進(jìn)行串口讀寫時,hFile為串口句柄,lpOverlapped是該函數(shù)等待的事件,lpNumberOfBytesTransferrd為實(shí)際讀寫完成的字節(jié)數(shù),當(dāng)bWait為TRUE時,該函數(shù)等待讀寫操作完成后返回,bWait為FALSE時函數(shù)立即返回。關(guān)于以上兩個函數(shù)的使用,參看如下程序代碼:
if(!WriteFile(m_h(yuǎn)Com,&WriteBuffer,nByteToWrite,&nByteWritten,&m_OverlappedWrite)){
if(GetLastError()==ERROR_IO_PENDING) 

    endtime=GetTickCount()+1000; //延時1000 ms  
    while(!GetOverlappedResult(m_h(yuǎn)Com,&m_OverlappedWrite&nByteWritten,F(xiàn)ALSE)) 
{ 
   if(GetTickCount()>endtime) break;
  }
 } 
if(nByteWritten)    
    ?。幚硭x的字節(jié)
 }

函數(shù)ReadFile的調(diào)用可以類似地處理,進(jìn)行延時處理后,就可以等到讀寫操作完成之后再執(zhí)行后續(xù)程序。為了應(yīng)用的方便,可以通過調(diào)用API函數(shù),編寫自己的串口操作類庫來完成實(shí)際的需要。

5 結(jié) 語

本文介紹的單片機(jī)監(jiān)控程序及串行通信方法簡單,易于實(shí)現(xiàn),程序運(yùn)行穩(wěn)定。

參 考 文 獻(xiàn)
 
1 汪建,孫開放,章述漢.MCS-96系列單片機(jī)原理及應(yīng)用技術(shù).武昌:華中理工大學(xué)出版社,1999
2 Peter Norton,Rob McGregor.MFC開發(fā)Windows95/NT4應(yīng)用程序.北京:清華大學(xué)出版社,1998
3 譚浩強(qiáng).C程序設(shè)計.北京:清華大學(xué)出版社,1998
 

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉