<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 8051單片機(jī)開(kāi)發(fā)工具DIY

          8051單片機(jī)開(kāi)發(fā)工具DIY

          作者: 時(shí)間:2013-01-23 來(lái)源:網(wǎng)絡(luò) 收藏

          4 硬件設(shè)計(jì)

          ① 通過(guò)計(jì)算機(jī)并口與SPI口連接;

          ② 為了保護(hù)計(jì)算機(jī)并口,需要增加1片74HC244作為隔離。

          實(shí)用的原理圖如圖2所示。(已經(jīng)過(guò)實(shí)踐檢驗(yàn),可放心使用。)

          5 用VB編程進(jìn)行并口控制

          打印端口的基地址一般為0x278、0x378或0x3BC,可以從控制面板中查到。為了方便讀者,表2列出了常用打印端口引腳及寄存器位元的說(shuō)明。

          在Windows環(huán)境下最簡(jiǎn)單易學(xué)的語(yǔ)言恐怕非VB莫屬,所以我們的也選用VB作為編程語(yǔ)言。但由于Windows的保護(hù),VB無(wú)法直接讀寫(xiě)打印端口,因此我們需要另外的程序模塊來(lái)實(shí)現(xiàn)打印端口的直接讀寫(xiě)。在Internet網(wǎng)上可以找到許多此類(lèi)模塊,并且相當(dāng)多的模塊可以免費(fèi)使用。經(jīng)過(guò)試用,筆者推薦使用Winio v2.0。該模塊支持Win9X/NT/2000/XP(http://www.internals.com Yariv Kaplan ),并且?guī)в性敿?xì)的幫助、例子程序及源碼。使用時(shí),將Winio.sys、Winio.dll、Winio.vxd及Winio.bas四個(gè)文件拷貝到工作目錄下,在VB中直接添加Winio.bas模塊即可。本例中用到的函數(shù)有四個(gè),分別說(shuō)明如下。 ① Initialize():允許端口控制函數(shù)。在使用端口輸入輸出函數(shù)之前調(diào)用一次,成功返回“1”,失敗返回“0”。

          ② Shutdown():關(guān)閉端口控制函數(shù)。在退出程序時(shí)執(zhí)行一次,成功返回“1”,失敗返回“0”。

          ③ GetPortVal(ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean:讀取端口函數(shù),PortAddr 為端口地址, Portval為端口值,bSize為要讀取的字節(jié)數(shù)。讀取成功時(shí)返回“1”,失敗時(shí)返回“0”。

          ④ SetPortVal(ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean:寫(xiě)端口函數(shù)。PortAddr 為端口地址, Portval為要寫(xiě)的值,bSize為要寫(xiě)入的字節(jié)數(shù)。寫(xiě)入成功返回“1”,失敗返回“0”。

          四個(gè)函數(shù)在Winio.bas模塊中的聲明如下:

          Declare Function InitializeWinIo Lib WinIo.dll” () As Boolean

          Declare Function ShutdownWinIo Lib WinIo.dll” () As Boolean

          Declare Function GetPortVal Lib WinIo.dll” (ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte) As Boolean

          Declare Function SetPortVal Lib WinIo.dll” (ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte) As Boolean

          6 Intel HEX 格式文件

          由于一般編譯軟件產(chǎn)生的用于寫(xiě)入芯片的文件都是Intel HEX格式的文件。Intel HEX文件屬于文本文件,可以用記事本查看。一個(gè)Intel HEX文件的一行稱(chēng)為一個(gè)記錄,每個(gè)記錄都是由十六進(jìn)制字符組成的,兩個(gè)字符表示一個(gè)字節(jié)的值。Intel HEX文件通常由若干條記錄組成,每個(gè)記錄都具有如下的形式:

          :LLAAAATTDD...DDCC

          “:”——記錄的起始標(biāo)志;

          LL——記錄長(zhǎng)度,表示該記錄中的數(shù)據(jù)字節(jié)數(shù);

          AAAA——數(shù)據(jù)裝入的首地址(16位);

          TT——記錄類(lèi)型,00表示數(shù)據(jù)記錄,01表示文件結(jié)束;(注意:有的編譯軟件會(huì)產(chǎn)生大于01的記錄類(lèi)型,本應(yīng)用中對(duì)大于01記錄類(lèi)型的記錄忽略掉即可。)

          DD——數(shù)據(jù)值(字節(jié));

          CC——校驗(yàn)和。(將其本身與記錄中除起始標(biāo)志外的所有字節(jié)相加應(yīng)為0,不為0則有錯(cuò)。)

          VB編程詳細(xì)說(shuō)明見(jiàn)本刊網(wǎng)絡(luò)補(bǔ)充版(http://www.dpj.com.cn)。(由于各子程序的流程都較簡(jiǎn)單,所以直接給出源碼,而未畫(huà)出流程圖。程序采用由底至頂?shù)脑O(shè)計(jì)方法。)

          結(jié) 語(yǔ)

          雖然上述程序能實(shí)現(xiàn)各種基本的功能,但并不完善,并未考慮各種異常情況,讀者可根據(jù)實(shí)際情況進(jìn)行完善。編程功力較差的朋友可直接到筆者的網(wǎng)站(http: //www.mcudiy.com)下載相對(duì)較完善的應(yīng)用程序 。如果充分理解了上述程序,那么一個(gè)AVR或PIC也非難事。在筆者的網(wǎng)站也有制作完成的“MCS51/AVR/PIC三合一下載器資料”供愛(ài)好者下載。

          由于AT89S8252的價(jià)格還是較貴,所以現(xiàn)在市場(chǎng)上較難買(mǎi),不過(guò)Atmel公司推出的替代AT89C51/52的AT89S51/52也有在系統(tǒng)編程功能,且價(jià)格便宜。其在系統(tǒng)編程的實(shí)現(xiàn)方法與AT89S8252類(lèi)似,對(duì)本例部分程序稍作修改即可支持該器件。筆者制作的“MCS51/AVR/PIC三合一下載器”增加了對(duì)AT89S51/52的支持。

          DIY機(jī)械鍵盤(pán)相關(guān)社區(qū):機(jī)械鍵盤(pán)DIY


          單片機(jī)相關(guān)文章:單片機(jī)教程


          單片機(jī)相關(guān)文章:單片機(jī)視頻教程


          單片機(jī)相關(guān)文章:單片機(jī)工作原理


          晶振相關(guān)文章:晶振原理

          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();