新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > P89C51RD2的Boot ROM與ISP功能的實現

        P89C51RD2的Boot ROM與ISP功能的實現

        作者: 時間:2012-04-09 來源:網絡 收藏

        3.1.4 波特率的校驗

        在波特率確定以后,首先設定TR2=1以啟動波特率,并對串口控制字進行設定。然后,程序對其進行校驗。方法是接收上位機的數據并以設定波特率回送該值,一方面通知上位機送出和接收的數據是否相同,如果相同,則上位機認為下位機的波特率設置正確,通信成功;另一方面程序也將接收的數據?quot;U 的ASCII碼相對照,如果相等,則往下執行,如果不等,則繼續重復上述過程,直到成功為止,否則進入死循環,只有程序復位才能退出。下面是其源程序與反匯編程序(FC37H至FC40H):

        源代碼 反匯編程序
        FC37 D2 CA SETB TR2
        FC39 75 98 52 MOV SCON,#52H ;方式1,TI=1
        FC3C 91 A0 RREV0: ACALL REV_SEND0
        FC3E B4 55 FB CJNE A,#55H,RREV0 ;判斷A=U?

        其中,REV_SEND0子程序的是接收一個數據并回傳給上位機。由上述程序可以看出,實際上要通信成功,上位機至少要向下位機發送兩個U:第一個用于確定波特率,另一個用于校驗波特率,并且這兩個字符之間必須隔一段時間,以便于波特率計算完畢并有效。所以,有關手冊中關于第一步要發送一個U來確定波特率的說法本身沒有錯,但如果在編制上位機程序時,僅僅發送一個U是不能夠通信成功的,特提醒讀者注意。

        3.2 命令字的接收

        在通信成功后,就可以接收的命令字了。

        3.2.1 命令格式說明

        ISP編程由 中的一系列引導子程序完成。這些子程序采用Intel-Hex記錄格式接收PC主機的命令和數據。Intel-Hex記錄格式上面已經有所介紹,其命令格式為
        :NNAAAARRDD…DDCCcrlf>

        其中,:NNAAAA以及DDCC的含義皆與上面論述的相同,只需對RR作以下說明:
        RR表示記錄類型,其中
        00--數據記錄,即傳編程數據并完成編程;
        01--文件結束標志;
        02--指定振蕩器頻率;
        03--雜項編程,和后面的數據相配合完成擦除、加密等;
        04--顯示指定地址端FLASH的數據或做空白檢查;
        05--各種讀功能。

        3.2.2 命令字的處理

        為了更容易看懂,將使用的通用寄存器和部分地址進行代換如下:
        DATA_ADDRL EQU 30H
        DATA_ADDRH EQU 31H
        DATA_SUM EQU 32H
        DATA_LEN EQU 33H
        DATA_FOSC EQU 34H
        DATA_MODE EQU 35H
        DATA_BUFFER EQU 36H
        REV_DAT_ADDR EQU 80H

          下面來看一下 中的源代碼與反匯編程序。

        源程序 反匯編程序

        FC41 75 32 00 MAIN: MOV DATA_SUM,#00H;校驗和
        FC44 91 A0 ACALL REV_SEND0
        FC46 B4 3A F8 CJNE A,#3AH,MAIN;判斷A=:?
        FC49 91 79 ACALL REV_DAT1_SUM
        FC4B 85 36 33 MOV DATA_LEN,DATA_BUFFER ;33H字節數
        FC4E 91 79 ACALL REV_DAT1_SUM
        FC50 85 36 31 MOV DATA_ADDRH,DATA_ BUFFER ;31H數據首地址高8位
        FC53 91 79 ACALL REV_DAT1_SUM
        FC55 85 36 30 MOV DATA_ADDRL,DATA_ BUFFER ;30H數據首地址低8位
        FC58 91 79 ACALL REV_DAT1_SUM
        FC5A 85 36 35 MOV DATA_MODE,DATA_ BUFFER ;35H數據操作類型
        FC5D E5 33 MOV A,DATA_LEN
        FC5F FA MOV R2,A ;循環接收數據指針
        FC60 60 09 JZ RREV3 ;字節數=0 轉RREV3
        FC62 79 80 MOV R1,#REV_DAT_ADDR
        FC64 91 79 RREV2: ACALL REV_DAT1_SUM
        FC66 A7 36 MOV @R1,DATA_MODE
        FC68 09 INC R1
        FC69 DA F9 DJNZ R2,RREV2
        FC6B AC 32 RREV3: MOV R4,DATA_SUM ;校驗和
        FC6D 91 79 ACALL REV_DAT1_SUM
        FC6F EC MOV A,R4
        FC70 B5 36 02 CJNE A,DATA_BUFFER,RREV4
        ;校驗和不等轉
        FC73 81 BF AJMP RUN_MODE
        FC75 74 58 RREV4:MOV A,#58H ; A=X
        FC77 81 FA AJMP SEND_DT

          首先,對程序中用到的子程序作如下的說明。
        REV_SEND0子程序:接收1個數據并回傳給上位機;
        REV_DAT1_SUM子程序:接收2個ASCII字符并回傳,將2個ASCII碼合成1字節二進制數并計算校驗和;
        SEND_DT:該地址執行送字符X給上位機;
        RUN_MODE:該地址解釋并執行命令字。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 交口县| 石屏县| 石狮市| 汉寿县| 浦江县| 梅河口市| 车险| 和龙市| 仁化县| 清河县| 古蔺县| 荥经县| 定安县| 天峻县| 米脂县| 蒲城县| 镇康县| 曲靖市| 增城市| 海门市| 外汇| 河北省| 电白县| 青州市| 淳安县| 山东| 绵竹市| 宁晋县| 巴南区| 明光市| 九龙县| 寿宁县| 宜川县| 奈曼旗| 淮阳县| 贡嘎县| 阿勒泰市| 盐池县| 恭城| 平罗县| 昭觉县|