前面一課設(shè)計(jì)了51單片機(jī)最小系統(tǒng)電路,使用51單片機(jī)的I/O口控制發(fā)光二極管的狀態(tài),并裝載運(yùn)行了使用keil編寫的嵌入式程序。本次實(shí)驗(yàn)應(yīng)用proteus結(jié)合keil對(duì)嵌入式C程序進(jìn)行源代碼級(jí)調(diào)試。
關(guān)于上次實(shí)驗(yàn)遺留的問題
在上次實(shí)驗(yàn)中,我們遺留了一個(gè)問題沒有解決。觀察上次實(shí)驗(yàn)結(jié)果,單片機(jī)P0口的所有位顏色為灰色方塊,表示該端口的電壓為不確定狀態(tài)。
為什么P0口所有位的電壓為不確定狀態(tài)呢?因?yàn)镻0同P1、P2、P3的I/O口電路不同,P1、P2、P3屬于帶上拉電阻(將I/O不確定的電位鉗位在高電平,同時(shí)起限流作用)型的I/O口,當(dāng)單片機(jī)加電后I/O被鉗位在高電平,P0不帶上拉電阻,因此I/O的電位不確定。
若需要把P0口鉗位在高電平,只需要將P0口外接一個(gè)上拉電阻即可,上拉電阻的阻值一般設(shè)置為4.7K,也可以根據(jù)負(fù)載大小選擇合適的阻值。
實(shí)驗(yàn)?zāi)康?/strong>
在開發(fā)嵌入式程序過程中,源代碼級(jí)的仿真調(diào)試可以幫助開發(fā)者快速定位問題代碼,糾正程序錯(cuò)誤,極大提高開發(fā)效率。本次實(shí)驗(yàn)在前面實(shí)驗(yàn)成果的基礎(chǔ)上,將proteus和keil結(jié)合在一起,在proteus仿真調(diào)試嵌入式程序的過程中,能夠?qū)?zhí)行點(diǎn)定位到程序源代碼行,在源代碼級(jí)別跟蹤執(zhí)行程序。
實(shí)驗(yàn)步驟
實(shí)驗(yàn)步驟如下:①輸出可以進(jìn)行源代碼調(diào)試的OMF文件;②配置基于源代碼仿真調(diào)試環(huán)境;③執(zhí)行調(diào)試,單步跟蹤代碼,查看和驗(yàn)證程序執(zhí)行結(jié)果。
輸出可以進(jìn)行源代碼調(diào)試的OMF文件
啟動(dòng)keil開發(fā)工具,打開前面課程建立的項(xiàng)目文件,修改項(xiàng)目?jī)?nèi)的C源文件代碼。
#include
sbit led1 = P1^0;
void main()
{
led1 = 0;
led1 = 1;
led1 = 0;
led1 = 1;
}
main()函數(shù)修改為四條語(yǔ)句,對(duì)P1端口的第0位led1進(jìn)行賦0或賦1操作。第1條語(yǔ)句將led1端口賦值為低電平,此時(shí)發(fā)光二極管被點(diǎn)亮,第2條語(yǔ)句將led1端口賦值為高電平,此時(shí)發(fā)光二極管不再處于被點(diǎn)亮狀態(tài)。第3條和第4條語(yǔ)句分別重復(fù)了第1條和第2條語(yǔ)句。
代碼跟蹤調(diào)試時(shí),從第1條語(yǔ)句開始跟蹤,單步執(zhí)行到第4條語(yǔ)句,觀察發(fā)光二極管的狀態(tài)和led1端口的狀態(tài)。
proteus源代碼仿真調(diào)試需要Keil編譯后輸出omf文件,在Keil工作窗口,展開【Project】菜單,選擇“Options for Targets”命令,在彈出的對(duì)話框中,選擇“Output”標(biāo)簽頁(yè),確定在“Name of Executable”輸入域輸入了omf文件名稱。
完成配置后重新編譯,keil會(huì)把omf文件輸出到項(xiàng)目的Objects目錄下。
配置基于源代碼仿真調(diào)試環(huán)境
要進(jìn)行源代碼級(jí)仿真調(diào)試,還需要配置調(diào)試環(huán)境,不然proteus會(huì)找不到程序的源代碼。配置方法是將C源代碼文件、OMF文件、電路模型文件放置在同一個(gè)目錄。可以將擴(kuò)展名為“DSN”電路模型文件復(fù)制到OMF文件所在的目錄,同時(shí)將C源代碼文件也復(fù)制到OMF文件所在目錄。也可以將C源代碼文件、OMF文件、電路模型文件放置到一個(gè)專門用于調(diào)試的目錄。
調(diào)試環(huán)境配置完成后,使用proteus打開電路模型文件,設(shè)置單片機(jī)的裝載程序?yàn)閛mf文件。
執(zhí)行調(diào)試
啟動(dòng)proteus,打開待調(diào)試的電路模型文件,展開【Debug】菜單,選擇“Start/Restart Debugging”命令或按下Ctrl+F12快捷鍵啟動(dòng)調(diào)試。
proteus會(huì)初始化單片機(jī),并執(zhí)行單片機(jī)內(nèi)的嵌入式程序,程序在main()函數(shù)的第1條語(yǔ)句之前停止執(zhí)行,等待開發(fā)者的下一步調(diào)試操作。默認(rèn)情況下,proteus會(huì)同時(shí)打開源代碼窗口,顯示嵌入式程序的源代碼和執(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還提供了查看單片機(jī)寄存器狀態(tài)、SFR內(nèi)存數(shù)據(jù)等窗口,開發(fā)者通過這些窗口可以隨時(shí)查看單片機(jī)的內(nèi)部狀態(tài)。
例如選擇“8051 CPU Registers-U1”命令,proteus會(huì)彈出單片機(jī)寄存器狀態(tài)窗口(見下圖)。
通過寄存器窗口可以查看單片機(jī)內(nèi)每個(gè)寄存器當(dāng)前存儲(chǔ)的值。其中“PC”寄存器為程序計(jì)數(shù)器,該寄存器存儲(chǔ)了當(dāng)前準(zhǔn)備要執(zhí)行的指令地址,指令地址為十六進(jìn)制000F,指令內(nèi)容為“CLR P1.0”(對(duì)P1口的第0位清零)。再仔細(xì)觀察窗口內(nèi)容,名稱為“P0”、“P1”、“P2”、“P3”寄存器實(shí)際上分別對(duì)應(yīng)了單片機(jī)P0、P1、P2、P3四個(gè)I/O口每位的狀態(tài),當(dāng)程序修改I/O口的狀態(tài)后,這些寄存器的值也會(huì)發(fā)生相應(yīng)變化。
調(diào)試步驟:
單步跳過第1條語(yǔ)句,P1口第0位被賦值為低電平,發(fā)光二級(jí)管點(diǎn)亮。觀察寄存器窗口,PC寄存器指向了下一條指令的地址,指令為“SETB P1.0”(對(duì)P1口的第0位設(shè)置為1),P1寄存器的值由原來(lái)的FF變換為FE。
單步跳過第2條語(yǔ)句,P1口第0位被賦值為高電平,發(fā)光二級(jí)管熄滅。觀察寄存器窗口,PC寄存器指向了下一條指令的地址,指令為“CLR P1.0”(對(duì)P1口的第0位清零),P1寄存器的值由原來(lái)的FE變換為FF。
請(qǐng)同學(xué)們自行完成第3、4條語(yǔ)句的調(diào)試,并觀察發(fā)光二極管和寄存器的狀態(tài)。
實(shí)驗(yàn)小結(jié)
通過這次實(shí)驗(yàn),掌握了嵌入式程序源代碼級(jí)的調(diào)試過程,由keil編寫嵌入式程序,使用proteus執(zhí)行嵌入式程序的源代碼級(jí)調(diào)試。
-
51單片機(jī)
+關(guān)注
關(guān)注
274文章
5705瀏覽量
124392 -
程序
+關(guān)注
關(guān)注
117文章
3798瀏覽量
81456 -
源代碼
+關(guān)注
關(guān)注
96文章
2946瀏覽量
66989 -
最小系統(tǒng)
+關(guān)注
關(guān)注
9文章
252瀏覽量
29166 -
仿真調(diào)試
+關(guān)注
關(guān)注
0文章
9瀏覽量
7548
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
嵌入式硬件調(diào)試和軟件調(diào)試
如何調(diào)試嵌入式代碼?
嵌入式Linux開發(fā)基礎(chǔ)知識(shí)
![<b class='flag-5'>嵌入式</b>Linux開發(fā)基礎(chǔ)知識(shí)](https://file.elecfans.com/web2/M00/48/7E/pYYBAGKhtAmAeufJAAAjrd2y7fk493.jpg)
實(shí)時(shí)仿真與嵌入式系統(tǒng)
基于Valgrind的嵌入式應(yīng)用程序調(diào)試技術(shù)
基于Proteus的嵌入式應(yīng)用系統(tǒng)仿真中的源碼調(diào)試
![基于Proteus的<b class='flag-5'>嵌入式</b>應(yīng)用系統(tǒng)<b class='flag-5'>仿真</b>中的源碼<b class='flag-5'>調(diào)試</b>](https://file1.elecfans.com//web2/M00/A5/68/wKgZomUMOEyAX800AACww2quEkg679.jpg)
Monitor C語(yǔ)言源代碼調(diào)試器設(shè)計(jì)
![Monitor C語(yǔ)言<b class='flag-5'>源代碼</b><b class='flag-5'>調(diào)試</b>器設(shè)計(jì)](https://file.elecfans.com/web2/M00/49/37/pYYBAGKhtD-AYijpAAANbmfzxYE397.jpg)
嵌入式開發(fā)板的USB驅(qū)動(dòng)程序源代碼資料免費(fèi)下載
![<b class='flag-5'>嵌入式</b>開發(fā)板的USB驅(qū)動(dòng)<b class='flag-5'>程序</b><b class='flag-5'>源代碼</b>資料免費(fèi)下載](https://file.elecfans.com/web1/M00/8B/6B/o4YBAFyYUAmACkmvAAIC_kssbpI509.png)
嵌入式Linux應(yīng)用程序開發(fā)詳解的源代碼合集免費(fèi)下載
![<b class='flag-5'>嵌入式</b>Linux應(yīng)用<b class='flag-5'>程序</b>開發(fā)詳解的<b class='flag-5'>源代碼</b>合集免費(fèi)下載](https://file.elecfans.com/web1/M00/B8/B6/pIYBAF51dziARV61AAV8TsFOALc796.png)
關(guān)于嵌入式代碼的致命漏洞
嵌入式代碼的致命安全漏洞
嵌入式系統(tǒng)設(shè)計(jì)師學(xué)習(xí)筆記二十六:嵌入式軟件程序設(shè)計(jì)①——嵌入式應(yīng)用開發(fā)的過程
![<b class='flag-5'>嵌入式</b>系統(tǒng)設(shè)計(jì)師學(xué)習(xí)筆記二十六:<b class='flag-5'>嵌入式</b>軟件<b class='flag-5'>程序</b>設(shè)計(jì)①——<b class='flag-5'>嵌入式</b>應(yīng)用開發(fā)的過程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
用于調(diào)試嵌入式系統(tǒng)軟件的硬件仿真
企業(yè)針對(duì)嵌入式開發(fā)源代碼及電路圖紙如何防泄密?
![企業(yè)針對(duì)<b class='flag-5'>嵌入式開發(fā)源代碼</b>及電路圖紙如何防泄密?](https://file.elecfans.com/web2/M00/58/25/pYYBAGLiek2APkeUAAC89rpHiYg162.png)
評(píng)論