前面一課設計了51單片機最小系統電路,使用51單片機的I/O口控制發光二極管的狀態,并裝載運行了使用keil編寫的嵌入式程序。本次實驗應用proteus結合keil對嵌入式C程序進行源代碼級調試。
關于上次實驗遺留的問題
在上次實驗中,我們遺留了一個問題沒有解決。觀察上次實驗結果,單片機P0口的所有位顏色為灰色方塊,表示該端口的電壓為不確定狀態。
為什么P0口所有位的電壓為不確定狀態呢?因為P0同P1、P2、P3的I/O口電路不同,P1、P2、P3屬于帶上拉電阻(將I/O不確定的電位鉗位在高電平,同時起限流作用)型的I/O口,當單片機加電后I/O被鉗位在高電平,P0不帶上拉電阻,因此I/O的電位不確定。
若需要把P0口鉗位在高電平,只需要將P0口外接一個上拉電阻即可,上拉電阻的阻值一般設置為4.7K,也可以根據負載大小選擇合適的阻值。
實驗目的
在開發嵌入式程序過程中,源代碼級的仿真調試可以幫助開發者快速定位問題代碼,糾正程序錯誤,極大提高開發效率。本次實驗在前面實驗成果的基礎上,將proteus和keil結合在一起,在proteus仿真調試嵌入式程序的過程中,能夠將執行點定位到程序源代碼行,在源代碼級別跟蹤執行程序。
實驗步驟
實驗步驟如下:①輸出可以進行源代碼調試的OMF文件;②配置基于源代碼仿真調試環境;③執行調試,單步跟蹤代碼,查看和驗證程序執行結果。
輸出可以進行源代碼調試的OMF文件
啟動keil開發工具,打開前面課程建立的項目文件,修改項目內的C源文件代碼。
#include
sbit led1 = P1^0;
void main()
{
led1 = 0;
led1 = 1;
led1 = 0;
led1 = 1;
}
main()函數修改為四條語句,對P1端口的第0位led1進行賦0或賦1操作。第1條語句將led1端口賦值為低電平,此時發光二極管被點亮,第2條語句將led1端口賦值為高電平,此時發光二極管不再處于被點亮狀態。第3條和第4條語句分別重復了第1條和第2條語句。
代碼跟蹤調試時,從第1條語句開始跟蹤,單步執行到第4條語句,觀察發光二極管的狀態和led1端口的狀態。
proteus源代碼仿真調試需要Keil編譯后輸出omf文件,在Keil工作窗口,展開【Project】菜單,選擇“Options for Targets”命令,在彈出的對話框中,選擇“Output”標簽頁,確定在“Name of Executable”輸入域輸入了omf文件名稱。
完成配置后重新編譯,keil會把omf文件輸出到項目的Objects目錄下。
配置基于源代碼仿真調試環境
要進行源代碼級仿真調試,還需要配置調試環境,不然proteus會找不到程序的源代碼。配置方法是將C源代碼文件、OMF文件、電路模型文件放置在同一個目錄。可以將擴展名為“DSN”電路模型文件復制到OMF文件所在的目錄,同時將C源代碼文件也復制到OMF文件所在目錄。也可以將C源代碼文件、OMF文件、電路模型文件放置到一個專門用于調試的目錄。
調試環境配置完成后,使用proteus打開電路模型文件,設置單片機的裝載程序為omf文件。
執行調試
啟動proteus,打開待調試的電路模型文件,展開【Debug】菜單,選擇“Start/Restart Debugging”命令或按下Ctrl+F12快捷鍵啟動調試。
proteus會初始化單片機,并執行單片機內的嵌入式程序,程序在main()函數的第1條語句之前停止執行,等待開發者的下一步調試操作。默認情況下,proteus會同時打開源代碼窗口,顯示嵌入式程序的源代碼和執行狀態。
“8051 CPU Source Code-U1”為源代碼調試窗口,在源代碼調試窗口可以執行“Step Over Source line(單步跳過)”、“Step Into Source line(單步執行)”、“Step Out From Source line(單步跳出)”,其調試過程和Keil單步調試完全相同。
若源代碼調試窗口沒有彈出,可展開【Debug】菜單,在【Debug】菜單下面選擇彈出源代碼調試窗口的命令。
從圖中列出的菜單命令可以看出,proteus還提供了查看單片機寄存器狀態、SFR內存數據等窗口,開發者通過這些窗口可以隨時查看單片機的內部狀態。
例如選擇“8051 CPU Registers-U1”命令,proteus會彈出單片機寄存器狀態窗口(見下圖)。
通過寄存器窗口可以查看單片機內每個寄存器當前存儲的值。其中“PC”寄存器為程序計數器,該寄存器存儲了當前準備要執行的指令地址,指令地址為十六進制000F,指令內容為“CLR P1.0”(對P1口的第0位清零)。再仔細觀察窗口內容,名稱為“P0”、“P1”、“P2”、“P3”寄存器實際上分別對應了單片機P0、P1、P2、P3四個I/O口每位的狀態,當程序修改I/O口的狀態后,這些寄存器的值也會發生相應變化。
調試步驟:
單步跳過第1條語句,P1口第0位被賦值為低電平,發光二級管點亮。觀察寄存器窗口,PC寄存器指向了下一條指令的地址,指令為“SETB P1.0”(對P1口的第0位設置為1),P1寄存器的值由原來的FF變換為FE。
單步跳過第2條語句,P1口第0位被賦值為高電平,發光二級管熄滅。觀察寄存器窗口,PC寄存器指向了下一條指令的地址,指令為“CLR P1.0”(對P1口的第0位清零),P1寄存器的值由原來的FE變換為FF。
請同學們自行完成第3、4條語句的調試,并觀察發光二極管和寄存器的狀態。
實驗小結
通過這次實驗,掌握了嵌入式程序源代碼級的調試過程,由keil編寫嵌入式程序,使用proteus執行嵌入式程序的源代碼級調試。
-
51單片機
+關注
關注
274文章
5705瀏覽量
124287 -
程序
+關注
關注
117文章
3795瀏覽量
81402 -
源代碼
+關注
關注
96文章
2946瀏覽量
66951 -
最小系統
+關注
關注
9文章
252瀏覽量
29160 -
仿真調試
+關注
關注
0文章
9瀏覽量
7545
發布評論請先 登錄
相關推薦
評論