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