單片機課程設計-ATMEL51系列單片機編程器
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()函數,該函數自動向隊列取得一個數據,如果隊列為空,則會進入阻塞,直到有數據才會返回。發送隊列也是根據此種原理??傊?,關于串口,最終實現了兩個函數,一個發送,一個接收,給全局使用,不必理會實現細節。
評論