第一篇:單片機實驗五 按鍵及七段數(shù)碼管實驗
實驗五 按鍵及七段數(shù)碼管實驗
一、實驗?zāi)康?、熟悉keil軟件;
2、掌握矩陣式按鍵的原理;
3、掌握七段數(shù)碼管顯示的原理;
4、掌握STC單片機的按鍵及數(shù)碼管程序編寫及下載;
二、實驗要求
1、編寫矩陣式按鍵的讀取程序、七段數(shù)碼管的動態(tài)顯示程序,并將程序結(jié)合在一起,產(chǎn)生某一按鍵按下,顯示對應(yīng)鍵值的程序。
2、編寫串行通信的發(fā)送及接收程序,實現(xiàn)串行口跟PC及的通信,并在PC機上用串口調(diào)試工具觀察實驗結(jié)果;
3、利用keil軟件調(diào)試程序,并產(chǎn)生.hex文件;
4、將.hex文件利用STC單片機下載工具下載到單片機最小系統(tǒng)中,并觀察LED燈的顯示狀態(tài);
5、提交實驗報告,報告包含程序及LED的顯示結(jié)果。
三、實驗內(nèi)容
1、打開keil軟件,熟悉軟件的菜單、工作界面及工具。然后按照keil的編程步驟編寫程序(創(chuàng)建工程----選擇單片機AT89C51----新建源文件----保存為C程序----編寫完整的C51程序----將文件添加到工程----編譯并修改錯誤----連接產(chǎn)生.hex文件)。
2、打開STC下載軟件,將keil生成的.hex文件打開,下載到最小系統(tǒng)板,測試程序并觀察實驗結(jié)果。
3、按鍵及七段LED的程序,實現(xiàn)更多的LED與按鍵結(jié)合的效果。
四、實驗說明
1、程序中使用的按鍵及LED燈的IO端口要與自己的單片機最小系統(tǒng)板對應(yīng);
2、按鍵程序注意抗消抖;
3、思考計算器程序如何實現(xiàn);
第二篇:單片機數(shù)碼管顯示實驗
實驗一
數(shù)碼管實驗
一、實驗?zāi)康?/p>
1.了解數(shù)碼管的顯示原理;2.掌握J(rèn)XARM9-2440 中數(shù)碼管顯示編程方法
二、實驗儀器
JXARM9-2440教學(xué)實驗箱、ADT1000仿真器和ADT IDE集成開發(fā)環(huán)境、串口連接線、PC機。
三、實驗原理
7段LED由7個發(fā)光二極管按“日”字形排列,所有發(fā)光二極管的陽極連在一起稱共陽極接法,陰極連在一起稱為共陰極接法。
LED顯示器的接口一般有靜態(tài)顯示與動態(tài)顯示接口兩種方式。
本實驗中采用的是動態(tài)顯示接口,其中數(shù)碼管掃描控制地址為0x20007000,位0-位5每位分別對應(yīng)一個數(shù)碼管,將其中某位清0 來選擇相應(yīng)的數(shù)碼管,地址0x20006000 為數(shù)碼管的數(shù)據(jù)寄存器。數(shù)碼管采用共陽方式,向該地址寫一個數(shù)據(jù)就可以控制LED 的顯示,數(shù)據(jù)中的1對應(yīng)的不亮,0對應(yīng)的亮,數(shù)碼管各位從高到低排列為dp-g-f-e-d-c-b-a,例如當(dāng)數(shù)據(jù)寄存器是11111111時則不亮,當(dāng)是01111111時則顯示8,其原理圖如圖所示。
四、實驗內(nèi)容
1、編程實現(xiàn):六個數(shù)碼管同時正向顯示0-F,然后反向顯示F-0。
2、編程實現(xiàn):在六個數(shù)碼管上依次顯示與自己姓名有關(guān)的內(nèi)容,可分辨出輪流顯示。
3、編程實現(xiàn):在六個數(shù)碼管上依次顯示與自己姓名有關(guān)的內(nèi)容,分辨不出輪流顯示。
4*、編程實現(xiàn):在每個數(shù)碼管上遞增顯示0—9。5*、自行開發(fā)。
五、實驗程序
1, /****************************************************************************/ /*文件名稱: LEDSEG7.C
*/ /*實驗現(xiàn)象: 數(shù)碼管依次顯示出0、1,2、??
9、a、b、C、d、E、F
*/ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = {
/* 0
7*/
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8
A
B
C
D
E
F*/
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函數(shù)說明: JXARM9-2410 7段構(gòu)共陽數(shù)碼管測試
*/ /* 功能描述: 依次在7段數(shù)碼管上顯示0123456789ABCDEF
*/ /* 返回代碼: 無
*/ /* 參數(shù)說明: 無
*/ /****************************************************************************/ void Test_Seg7(void){
int i;
*((U8*)0x20007000)=0x00;/*6個數(shù)碼管都亮*/ for(;;){
/*數(shù)碼管從0到F依次將字符顯示出來*/
for(i=0;i<0x10;i++)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
}
/*數(shù)碼管從F到0依次將字符顯示出來*/
for(i=0x0f;i>0x00;i--)
{
*((U8*)0x20006000)=seg7table[i];
Delay(10000);
} }
// TODO } /****************************************************************************/
/* Function name : 循環(huán)延時子程序
*/ /* Description : 循環(huán) 'time' 次
*/ /* Return type :void
*/ /* Argument
: 循環(huán)延時計數(shù)器
*/ /****************************************************************************/ void Delay(int time){
int i;int delayLoopCount=10000;
for(;time>0;time--);
for(i=0;i 2, /****************************************************************************/ /*文件名稱: LEDSEG7.C */ /*實驗現(xiàn)象: 數(shù)碼管依次顯示ZHAngg,并能看出輪流顯示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函數(shù)說明: JXARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */ /* 功能描述: 在六個數(shù)碼管上分別顯示字母,與姓名有關(guān) */ /* 返回代碼: 無 */ /* 參數(shù)說明: 無 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(10000);} // TODO } /***************************************************************************/ /* Function name : 循環(huán)延時子程序 */ /* Description : 循環(huán) 'time' 次 */ /* Return type :void */ /* Argument : 循環(huán)延時計數(shù)器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 3, /****************************************************************************/ /*文件名稱: LEDSEG7.C */ /*實驗現(xiàn)象: 數(shù)碼管依次顯示出ZHAngg,并看不出輪流顯示 */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* Z H A n g g 7*/ 0xa4,0x89,0x88,0xc8,0x90,0x90,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,/* H I N*/ 0x89,0xcf,0x48 };void Delay(int time);/****************************************************************************/ /* 函數(shù)說明: JXARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */ /* 功能描述: 在六個數(shù)碼管上分別顯示字母,與姓名有關(guān) */ /* 返回代碼: 無 */ /* 參數(shù)說明: 無 */ /****************************************************************************/ void Test_Seg7(void){ int i; *((U8*)0x20007000)=0x00; for(;;) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[0]; Delay(10000); *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[1]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3e; *((U8*)0x20006000)=seg7table[5]; Delay(1);} // TODO } /***************************************************************************/ /* Function name : 循環(huán)延時子程序 */ /* Description : 循環(huán) 'time' 次 */ /* Return type :void */ /* Argument : 循環(huán)延時計數(shù)器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 4, /****************************************************************************/ /*文件名稱: LEDSEG7.C */ /*實驗現(xiàn)象: 數(shù)碼管依次顯示出0、1,2、?? 9、a、b、C、d、E、F */ /****************************************************************************/ #define U8 unsigned char unsigned char seg7table[16] = { /* 0 7*/ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/* 8 A B C D E F*/ 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e, };void Delay(int time);/****************************************************************************/ /* 函數(shù)說明: JXARM9-2410 7段構(gòu)共陽數(shù)碼管測試 */ /* 功能描述: 依次在7段數(shù)碼管各自遞增顯示0—9 */ /* 返回代碼: 無 */ /* 參數(shù)說明: 無 */ /****************************************************************************/ void Test_Seg7(void){ int i;for(;;){ for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x2f; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3b; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0;i<=0x09;i++) { *((U8*)0x20007000)=0x3d; *((U8*)0x20006000)=seg7table[i]; Delay(10000); } } // TODO } /****************************************************************************/ /* Function name : 循環(huán)延時子程序 */ /* Description : 循環(huán) 'time' 次 */ /* Return type :void */ /* Argument : 循環(huán)延時計數(shù)器 */ /****************************************************************************/ void Delay(int time){ int i;int delayLoopCount=10000; for(;time>0;time--); for(i=0;i 六、實驗結(jié)果與分析 實驗一結(jié)果:六個數(shù)碼管同時顯示相同的符號,從0-F再由F-0之間的循環(huán)變換。 分析:在數(shù)碼管掃描控制地址處選中六個數(shù)碼管,使其同時亮,在給其數(shù)碼管的數(shù)據(jù)寄存器存入不同符號對應(yīng)的數(shù)值,加上相應(yīng)的延遲,就 可以是輪流變換的循環(huán)的符號變換。 實驗二結(jié)果:第一個數(shù)碼管顯示Z后,第二個顯示H,接著第三個顯示A,接著第四個顯示n,接著第五個顯示g,接著第六個顯示g,接著第一個再顯示Z…..如此循環(huán)。 分析:設(shè)置控制地址使其單獨并且循環(huán)顯示,每個數(shù)碼管的數(shù)據(jù)寄存器送入不同的符號的數(shù)值,并設(shè)置較大的延遲時間即可產(chǎn)生該現(xiàn)象。 實驗三結(jié)果:六個數(shù)碼管一起顯示“ZHAngg”。 分析:原理同實驗二,只是將延遲時間改小到人眼無法分辨的地步即使一起顯示。 實驗四結(jié)果:第一個數(shù)碼管顯示0—9之后,第二個接著顯示0—9,接著第三個,第四個….分析:設(shè)置循環(huán)使六個數(shù)碼管循環(huán)單獨顯示,在每個數(shù)碼管顯示中再加入循環(huán),使其遞增顯示0—9,設(shè)置較大的延遲,是我們可以看清實驗現(xiàn)象。 七、實驗總結(jié)與心得體會 本次試驗需要了解數(shù)碼管的基本工作原理,基于C語言設(shè)計編程完成實驗,實驗的關(guān)鍵在于把握實現(xiàn)各種現(xiàn)象的本質(zhì)上的差異,在程序上作出修改。通過本次試驗對于實驗的嚴(yán)謹(jǐn)性有了進一步的體驗,稍有不小心實驗結(jié)果就適得其反,以后要更加用心,更加認(rèn)真的做實驗。 實驗五 七段數(shù)碼管動態(tài)顯示實驗 一、實驗?zāi)康?/p> 掌握數(shù)碼管動態(tài)顯示數(shù)字的原理 二、實驗內(nèi)容 動態(tài)顯示:按圖5-2連接好電路,七段數(shù)碼管段碼連接不變,位碼驅(qū)動輸入端S1,S0接8255 C口的PC1,PC0。編程在十位和個位兩個數(shù)碼管上顯示“56”。 三、編程提示 實驗臺上的七段數(shù)碼管為共陰型,段碼采用同相驅(qū)動,輸入端加高電平,選中的數(shù)碼管亮,位碼加反相驅(qū)動器,位碼輸入端高電平選中。 . 看清實驗?zāi)康暮鸵?2. 注意實驗步驟 3. 連接實驗線路時請注意開關(guān)的位置 4. 根據(jù)原理框圖編寫程序,保存為學(xué)號名+SY2 例:1928101sy5 5. 記錄下實驗中遇到的問題,實驗的實際意義 6. 準(zhǔn)備實驗報告的數(shù)據(jù) 如何解決的,搞懂 實驗六 競賽搶答器 一、實驗?zāi)康?/p> 1、了解微機化競賽搶答器的基本原理。 2、進一步學(xué)習(xí)使用并行接口。 二、實驗內(nèi)容 圖7-1為競賽搶答器(模擬)的原理圖,邏輯開關(guān)K0~K7代表競賽搶答按鈕0~7號,當(dāng)某個邏輯電平開關(guān)置“1”時,相當(dāng)某組搶答按鈕按下。在七段數(shù)碼管上將其組號(0~7)顯示出來,并使微機揚聲器響一下。 三、編程提示 設(shè)置8255為C口輸入、A口輸出,讀取C口數(shù)據(jù),若為0表示無人搶答,若不為0則有人搶答。根據(jù)讀取數(shù)據(jù)可判斷其組號。從鍵盤上按空格鍵開始下一輪搶答,按其它鍵程序退出。 附加試驗: 可編程定時器/計數(shù)器(8253) 一、實驗?zāi)康模?掌握8253的基本工作原理和編程方法。 二、實驗內(nèi)容 按圖3-2連接電路,將計數(shù)器0、計數(shù)器1分別設(shè)置為方式3,計數(shù)初值設(shè)為1000,用邏輯筆觀察OUT1輸出電平的變化(頻率1HZ)。用示波器觀察OUT0,OUT1輸出電平的變化和波形。同時用七段數(shù)碼管段碼顯示出來 三、編程提示 8253控制寄存器地址283H 計數(shù)器0地址280H 計數(shù)器1地址281H CLK0連接時鐘 1MHZ 請各位同學(xué)在上機實驗前編好程序,要檢查! 實驗時間 周四 計科83班:8:00-9:30 網(wǎng)工 82:9:40-11:10 網(wǎng)工 81:12:30-14:00 計科81班:14:00-15:30 計科82班:15:30-17:00 實驗地點:教學(xué)樓B610 1.到5樓計算中心值班室請值班老師開門 2.這周日上午為自由實驗時間,愿意去的同學(xué)請先向各班長或課代表報名 仲愷農(nóng)業(yè)工程學(xué)院實驗報告紙 信息學(xué)院(院、系)專業(yè)班組單片機原理及接口技術(shù)課實驗四單片機鍵盤輸入以及數(shù)碼管顯示編程 一、實驗?zāi)康?、掌握單片機鍵盤以及數(shù)碼管顯示的工作原理; 2、掌握單片機鍵盤以及數(shù)碼管顯示的編程方法。 二、實驗內(nèi)容 1、學(xué)習(xí)單片機鍵盤檢測、消抖以及譯碼等; 2、學(xué)習(xí)單片機數(shù)碼管靜態(tài)以及動態(tài)的顯示方式; 3、利用單片機鍵盤以及數(shù)碼管編寫程序驅(qū)動開發(fā)板上的蜂鳴器以及數(shù)碼管按一定規(guī)律工作。 三、實驗設(shè)備 1、STC單片機開發(fā)板; 2、PC機以及串口線。 四、實驗步驟 參考實驗指導(dǎo)書。 五、實驗總結(jié) 實驗 一、MCS51單片機基本開發(fā)環(huán)境 1. 實驗?zāi)康模?/p> 1)熟悉軟件的集成開發(fā)環(huán)境 2)掌握單片機軟件設(shè)計流程 3)掌握單片機存貯器結(jié)構(gòu)及各窗口之間的聯(lián)系 2. 實驗內(nèi)容: 1)用三種方法實現(xiàn)將累加器A內(nèi)容改為20H 方法1--MOV A,#20H 方法2—MOV R0,#20H MOV A,R0 方法3—MOV R0,#20H XCH A,R0 心得:越往下做實驗時就越感覺這題根本不能說是題目,但不得不說在沒接觸過編程軟件,剛開始學(xué)的匯編,第一次做的實驗就光這道題都覺得不知道做什么.所以凡是總有開始,不了解情況的多簡單的都會覺得難.2)將58H位單元置為1,觀察內(nèi)部RAM中2BH內(nèi)容的變化 代碼: SETB 2BH.0 JMP $ END 心得:這是關(guān)于內(nèi)部存儲中對單元和字節(jié)了解,不理解很容易做錯.比如開始寫的指令為 MOV R0,#58H;MOV @R0,#1 這是錯誤的指令。這就需要認(rèn)真去了解單片機中的字節(jié)地址與位地址的關(guān)系。80C51中有位尋址區(qū)和字節(jié)尋址區(qū)。題目中58H為位地址,2BH為字節(jié)地址,且58H為2B字節(jié)的最低位。由于58H屬于位尋址區(qū),可用位操作指令 SETB 進行置位,SETB 2BH.0 執(zhí)行后,2BH中內(nèi)容變?yōu)椋埃?/p> 3)如果當(dāng)前狀態(tài)為有進位、工作寄存器使用區(qū)2,請用3種方法設(shè)置這種狀態(tài) 代碼: ANL PSW,#01H MOV A,PSW CJNE A,#01,LAB2 LAB1:JMP LAB1 LAB2: SETB PSW.4 MOV P0,#01H MOV R0,#18H CLR PSW.3 MOV C,P0.0 MOV PSW,R0 MOV PSW.4,C CPL C MOV PSW.3,C END 心得:以上LAB2寫了三段代碼,可分別完成題目要求。不過實驗時只是對代碼進行了錯誤調(diào)試,沒有對結(jié)果進行檢驗。其中值得注意的是對于布爾(位)操作指令的用法,比如傳送指令必須經(jīng)累加器C,如第二段中MOV P0,#01H;MOV C,P0.0,以及對于位尋址的方式(如需用到“.”隔開)的應(yīng)用。4)編一個小程序?qū)?nèi)部RAM中的20H單元的內(nèi)容送到21H單元并調(diào)試 代碼: MOV R0,#20H MOV @R0,#10H MOV R1,#21H MOV @R1,20H JMP $ END 5)用程序?qū)⒍褩V羔樦赶?0H,然后在堆棧中依次壓入01,02,03,04,05五個數(shù),觀察哪些單元內(nèi)容發(fā)生了變化,各變?yōu)槎嗌伲繌哪男┐翱诳梢园l(fā)現(xiàn)這些變化?順序?qū)⒍褩V械奈鍌€數(shù)放入30H~34H五個單元中,編程實現(xiàn)之。 代碼: MOV R1,#60H MOV SP,R1 MOV DPL,#1H LAB1:PUSH DPL INC DPL MOV A,DPL CJNE A,#6,LAB1 POP 34H POP 33H POP 32H POP 31H POP 30H JMP $ END 6)將外部數(shù)據(jù)存貯器1000H~100FH 16個單元中存放00H~0FH 代碼: MOV DPTR,#1000H MOV R1,#10H LOOP:MOVX @DPTR,#1234H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END 心得:此處需要訪問片外存儲空間,需要借助寄存器DPTR,需注意其為16位的寄存器,在使用時若與八位寄存器進行數(shù)據(jù)交換時需分為高八位DPH與低八位DPL來用。7)若要求程序從0010H單元開始運行,可用兩種方法實現(xiàn)? 方法一 ORG 0010H 方法二 AJMP 0010H 3. 選做實驗內(nèi)容:數(shù)據(jù)傳送 目的: 1)掌握8051單片機內(nèi)部數(shù)據(jù)存貯器、外部數(shù)據(jù)存貯器的數(shù)據(jù)傳送特點和應(yīng)用 2)掌握MOV,MOVX和MOVC類指令的用法及區(qū)別 內(nèi)容: 1)將片內(nèi)RAM數(shù)據(jù)區(qū)20H為首地址的十六個字節(jié)傳送到30H為首地址的數(shù)據(jù)區(qū),即:20H~2FH送30H~3FH 代碼: ORG 0000H JMP MAIN ORG 0030H MAIN:MOV R0,#20H MOV R1,#30H LOOP:MOV @R0,#1234H MOVA,@R0 MOV @R1,A INC R0 INC R1 CJNE R1,#30H,LOOP JMP $ END 2)將外部數(shù)據(jù)存儲器2000H~200FH單元的十六個數(shù)傳送至內(nèi)部數(shù)據(jù)存儲器的30H~3FH 代碼: ORG 0000H JMP MAIN ORG 0030H MAIN: MOV DPTR,#2000H MOV R1,#30H LOOP:MOVX @DPTR,#12H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END 總體心得體會: 第一次做實驗主要是熟悉了解了下單片機編程軟件的使用,開始接觸時在對其軟件不是太了解的情況下實驗編程做的確實很亂,不清楚該怎樣進行,比如不知如何進行對指令的調(diào)試,也不清楚該如何觀察結(jié)果,沒有一個整體的概念,所以在了解其開發(fā)環(huán)境上花了不少時間。經(jīng)過一段時間的摸索后也終于了解了其具體的使用,也能夠順利的對指令的編程運用。運行指令時遇到的一些問題需要注意的也在上面各題中做了說明。還有需要注意的是:進入軟件仿真時需要對存儲空間進行查看的方法是在Address窗口中輸入:d:00h 顯示內(nèi)部數(shù)據(jù)存儲器從00h開始的單元; x:1000h 顯示外部數(shù)據(jù)存儲器從1000h開始的單元; c:0000H 顯示程序存儲器內(nèi)容。還有由于偽指令 END 定義的原因,在程序末需加一條死循環(huán)調(diào)轉(zhuǎn)指令(如 JMP $)使程序不會進入其他未知空間執(zhí)行其他指令。實驗 二、加、減法實驗 1. 實驗?zāi)康?/p> 1)正確使用單片機的加減運算指令 2)掌握不同指令對于程序狀態(tài)字的影響及程序狀態(tài)字的意義、用處 3)掌握ADD,ADDC,SUBB和DA A等指令的用法 4)學(xué)習(xí)模塊化程序設(shè)計方法 2. 實驗內(nèi)容 1)編寫3字節(jié)二進制加法子程序,并用主程序調(diào)用不同的加數(shù)和被加數(shù)來檢測該子程序的正確性。需考慮有進位和無進位情況。程序入口為: 加數(shù):22H,21H,20H三字節(jié),22H為最高位 被加數(shù):32H,31H,30H三字節(jié),32H為最高位 程序出口為: 23H,22H,21H,20H四字節(jié),23H為最高位 例如:地址:23 22 21 20 32 31 30 執(zhí)行前數(shù)據(jù): 01 23 45 FF 01 01 執(zhí)行后數(shù)據(jù):01 00 24 46 代碼: ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 22H,#01H MOV 21H,#23H MOV 20H,#45H MOV 32H,#0FFH MOV 1H,#01H MOV 30H,#01H ACALL ADDI HERE:JMP HERE ORG 100H ADDI: PUSH PSW MOV R0, #20H;加數(shù)1地址、和的地址 MOV R1, #30H;加數(shù)2地址 CLR C MOV R2, #3;循環(huán)3次 LOOP: MOV A, @R0;取 ADDC A, @R1;加 MOV @R0, A;存 INC R0 INC R1 DJNZ R2, LOOP CLR A ADDC A, #0;得到進位 MOV 23H, A;保存 POP PSW RET END 2)編寫三字節(jié)二進制減法子程序 入口:被減數(shù): 52H,51H,50H, 50H為最低位 減數(shù): 42H,41H,40H, 40H為最低位 出口:差:外部數(shù)據(jù)存貯器2003H~2000H(2000H為最低位)用主程序調(diào)用多組數(shù)據(jù)來調(diào)試,需考慮無借位和有借位兩種情況。例如: 執(zhí)行前:地址: 52 51 50 42 41 40 數(shù)據(jù): 90 80 70 10 10 10 執(zhí)行后:地址: 2003 2002 2001 2000 數(shù)據(jù): 00 80 70 60 代碼: ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 52H,#90H MOV 51H,#80H MOV 50H,#70H MOV 42H,#10H MOV 41H,#10H MOV 40H,#10H ACALL SUB1 HERE:JMP HERE SUB1: PUSH PSW MOV R0, #50H;被減數(shù)地址 MOV R1, #40H;減數(shù)地址 MOV DPTR, #2000H;差的地址 CLR C MOV R2, #3;循環(huán)3次 LOOP: MOV A, @R0;取 SUBB A, @R1;減 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP CLR A SUBB A, #0;得到借位 MOVX @DPTR, A;存 POP PSW RET END 3)編寫10位十進制加法子程序(十進制數(shù)采用壓縮BCD碼存放)入口: 加數(shù):24H—20H,低地址放低字節(jié) 被加數(shù):29H—25H,低地址放低字節(jié) 出口 和:4005H—4000H,低地址放低字節(jié) 要求調(diào)用多組數(shù)據(jù)調(diào)試,注意觀察PSW的變化,理解DA A指令的含義。例如: 執(zhí)行前地址:24 23 22 21 20 29 28 27 26 25 數(shù)據(jù):12 34 56 78 90 88 99 33 12 74 執(zhí)行后地址:4005 4004 4003 4002 4001 4000 數(shù)據(jù): 01 01 33 89 91 64 代碼: ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 24H,#12H MOV 23H,#34H MOV 22H,#56H MOV 21H,#78H MOV 20H,#90H MOV 29H,#88H MOV 28H,#99H MOV 27H,#33H MOV 26H,#12H MOV 5H,#74H ACALL ADD2 HERE:JMP HERE ADD2: PUSH PSW MOV R0, #20H;加數(shù)1地址 MOV R1, #25H;加數(shù)2地址 MOV DPTR,#4000H CLR C MOV R2, #5;循環(huán)5次 LOOP: MOV A, @R0;取 ADDC A, @R1;加 DA A;調(diào)整為BCD碼 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP POP PSW RET END第三篇:實驗五___七段數(shù)碼管動態(tài)顯示實驗_xs
第四篇:實驗四 單片機鍵盤輸入以及數(shù)碼管顯示編程
第五篇:單片機實驗