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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機課程設計-ATMEL51系列單片機編程器

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年12月23日   【字體:

  用單片設計過很多東西,可以說把AT單片機(包括AVR單片機)的所有外設資源都使用過了,所以在尋思著要設計一個什么樣的東東??
  有次去面試,我對面試官說我設計過一塊開發板,然后那面試官直接問了個核心問題:這個編程器的固件是你自己寫的嗎?一下子就問到了痛處。是的,編程器固件不是自己寫的,那為什么不自己設計一個呢? 我說的自己設計是包括硬件電路、單片機程序以及電腦端界面等等所有東西全部自己DIY。當一個真正的DIYer。所以我動手了,用了幾天幾夜時間弄了一個可以支持兩種芯片(AT89S51 AT89S52)
的基于ISP下載的編程器
  首先要說的是,要設計個編程器, 這方面的資料在網上基本是找不到的,估計是大家不想開源(open source code)...所以必須自己按照某一芯片的官方數據手冊慢慢搞懂它的下載協議,然后寫成固件。


  STEP 1. 研究數據手冊
  首先找了一份S52芯片的中文數據手冊,一看傻了眼,翻譯得很垃圾,垃圾還不要緊,最重要是里面把關于FLASH編程的章節直接忽略掉了。。想看都沒得看。沒辦法,那就直接研究英文數據手冊算了,用了一天多時間認真把數據手冊看懂。。這里本人一直有個誤區,從大一的時候開始就以為S52會有256B的用戶RAM,比S51高級,其實不是,S52也只有128B內存,FLASH容量比S51多4KB也就是8KB。。謹記謹記。。或者你可以選擇接入外部RAM,不過這會浪費掉你至少16個IO口用來做數據及地址總線,而且還要加外一個地址鎖存器用來復用本來就不夠用的IO口,而匯編指令中的MOVX就是用來操作外部RAM的。OK數據手冊研究完畢(還算幸運的,因為S52的數據手冊只有30多頁)。


 

 

 

  STEP 2. HEX文件的本來面目以及怎樣將HEX文件轉換成機器碼

  之前我一直以為HEX文件就像鏡像文件一樣對應著單片機FLASH的每一個數據,然后燒錄軟件LOAD程序的時候是直接將HEX文件里面的數據一個一個輸入到單片機的FLASH中,又來了個誤區,事實情況卻不是這樣的。正解是:HEX文件是一種用ASCII編碼的文件,就是說里面的數據都是字符來的,比如說里面記錄了一個地址為0X00EF的話,如果按照二進制格式應該是:0000 0000 1110 1111 這樣記錄的,但HEX采用了ASCII字符編碼,直接在里面寫成:‘0’ ‘0’ ‘E’ ‘F’ (這是ASCII字符!!!)。基于這個原理,要想正確下載程序就必須寫一個HEX->機器碼轉換算法,將HEX文件轉換成機器碼。用了幾個小時就把算法搞定。具體實現過程就不說了,想了解的可以直接找我聊啦,總之最后結果就是我實現了一個 HEX_Translate(char *Input,char *Output)函數搞定


  STEP 3. 實現硬件電路

    其實硬件電路很簡單,打算用串口跟電腦端進行通信,然后使用一片S52做為主控芯片,通過ISP接口給另一片單片機下載程序。用了一個晚上時間用萬用板把電路搭建起來,里面用了一片MAX232作電平轉換,轉換后的電平輸給S52,S52接出幾只IO口給對應的被下載芯片的ISP引腳,包括MISO MOSI SCK 以及復位端RST。硬件就是這么簡單這么傻,下圖:



 

 


  STEP 4. 編寫固件

  可以說這個設計的90%的工作就是在寫代碼,包括單片機代碼以及電腦燒錄軟件代碼,其中單片機用C語言編寫,電腦界面用C++編寫(所以必須有一點WINDOWS應用程序編程基礎)。

  燒寫單片機的工作流程其實就是->把復位腳接高,然后送入四個字節碼,讓它進入編程模式,然后根據協議要求一個一個把數據送進去。我在KEIL上實現了幾個最基本的操作函數,比如要擦除芯片就調用:unsigned char Pro_51_Erase(void),如果芯片擦除成功就會返回OK(宏定義,值為1),當然了,在開始工作之前都必須檢查芯片是否能使用,所以每次燒寫之前都要使用unsigned char Pro_51_CheckChip(void)檢查被燒芯片是否工作正常的話就返回OK。等等等等,不再贅述。

  實現了基本的操作函數,接下來就要考慮主控單片機要怎樣跟電腦進行通信了,使用串口通信,我的做法是自己制定一個簡單的傳送協議,該協議的第一個字節是指令,接下來的字節可以是地址,數據等等,做成一個數據幀,幀的大小隨指令作用不同而異。然后單片機使用串口中斷接收,因為主控單片機在給另一個單片機燒寫的時候會費時間,為了防止電腦端送過來的數據得不到及時處理而發生錯誤,我在串口中斷服務程序里面實現了一個簡單的先進先出循環隊列,隊列長度設為8B,一接收到數據的時候,中斷服務程序就將數據向隊列添加,而前臺程序要取數據就直接調用GetByte()函數,該函數自動向隊列取得一個數據,如果隊列為空,則會進入阻塞,直到有數據才會返回。發送隊列也是根據此種原理。總之,關于串口,最終實現了兩個函數,一個發送,一個接收,給全局使用,不必理會實現細節。

 


  STEP 5. 編寫電腦端界面

  電腦端界面是使用串口進行通信的,所以電腦必須有串口,或者使用USB轉串口。

  開發環境使用了本人最喜歡的C++ Builder 6.0 。因為開發速度很快,很適合我這種非專業WINDOWS程序員使用。最終開發出來的應用程序可以打開HEX文件,并自動轉換成機器碼,然后通信串口一個一個按照地址發給單片機。如圖:


 


  STEP 6. 測試

  雖然原理簡單,但是編寫過程卻很費時,BUG不斷出現,暈死,其實讓我選擇去當苦力搬磚或者選擇寫代碼,還是選擇挺搬磚比較好,因為磚總可以搬完嘛,代碼卻不一定能寫得出。所幸經過幾天調試,所有功能完成了。

 測試: 寫了一個單片機的8*8點陣顯示程序,然后連接設備,打開文件。擦除芯片。。點擊“編程”。。。經過兩秒鐘,界面進度條顯示下載完成。小心地將下載好的芯片拔出來,插到單片機開發板上,接電。。查看效果。一接電,點陣上顯示出期待已久的圖案了,說明測試成功。下圖:


 

 

  STEP 7. 拓展功能

  完成后想進一步拓展編程器的功能,在想著要弄點什么好,于是想到了手工匯編,就是不用開發環境,自己把指令一條一條寫出來然后下載,SO,要怎么下載???,沒問題,我在單片機里面實現了一個類似命令行的對話窗口,只要在電腦上打開超級終端或者串口助手,就可以通過字符指信與單片機進行對話,可要設置好地址,就可以查看或者修改單片機FLASH存儲器中的任意一個值,想怎么改就怎么改,如圖:


 

 到此,開發過程開部結束,  ,有興趣想要看源代碼的同學發郵件找我要

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲一区日韩 | 亚洲在线久久 | 日本一道本视频 | 婷婷免费在线 | 99视频在线免费观看 | 日韩精品一区二区三区视频播放 | 久久精品亚洲精品国产欧美kt∨ | 国产xxxx在线 | 国产日韩欧美在线播放 | 久久精品 | 国产精品永久在线观看 | 日韩在线免费视频 | 久久男人| 亚洲男女视频在线观看 | 美国十次成人欧美色导视频 | 97精品国产97久久久久久免费 | 日韩中文字幕一区 | 91中文字幕在线 | 日韩中文在线视频 | www.亚洲精品 | 在线视频中文字幕 | 琪琪午夜伦伦电影福利片 | 91精品国产综合久久香蕉922 | www.夜夜骑 | 一二三四在线视频观看社区 | 性国产丰满麻豆videosex | 91一区二区 | 欧美在线一区二区三区 | 国产在线拍偷自揄拍视频 | 国产精品成人国产乱一区 | 天天爱爱网 | 免费精品久久久久久中文字幕 | 日本又色又爽又黄又高潮 | 九九亚洲 | 精品中文字幕一区 | 91久久久久久久久久久久久 | 国产成人精品视频在线观看 | 麻豆a级片| 日韩精品一区二区三区视频播放 | 日韩美女在线看免费观看 | 久久av一区二区三区 |