一、 實驗題目:試編寫一段程式,其功能為將21h單元的內容8位分別依次存放到從22h開始的8單元中。
二、 keil**:
*** 0000h
jmp start
*** 0100h
start:
mov 21h,#8;
mov a ,21h;取出21中的數
mov r0,#22h ;初始化
mov r1,#7h ;迴圈次數為7
loop:
rrc a;把a之中的最低位移到c
jc real;判斷c裡面是數是否為1,如果是1.則跳轉到real
mov @r0,#0h
jmpkk;
real:
mov @r0,#1h;如果是1,則將1賦到r0單元裡
kk: inc r0;依次判斷a中的每一位
djnz r1,loop;
jmp $;死迴圈
end三、 實驗截圖:
四、 實驗小結:
這是我們微控制器的第乙個實驗,因為剛接觸,所以會感覺很陌生,內心有一種畏懼感,看到題目的時候也是沒有頭緒,可以說完全是不知道到底題目是乙個什麼意思,更是不知道我們應該如何編寫程式。不過後面通過老師的講解,自己也去檢視了一些有關的書籍,慢慢也理解了該如何去實現這種實驗題目。
在認真琢磨之後,我開始學會像以前剛開始學習c語言一樣慢慢繪製乙個程式的流程圖,理清思緒,然後根據流程圖編寫相應的**。
下面是本題的實驗流程圖:
通過完成這個實驗,我對微控制器的程式有了很大的認識。實驗中,也是深刻的理解到了乙個微控制器程式每一步的實現與執行。當然,也掌握了在keil中除錯的方法。
一、 實驗題目:若0-5號鍵的鍵值分別是:eeh、deh、beh、7eh、edh、ddh。
設鍵值存放在內部ram 20h單元中,程式設計實現根據2oh中的鍵值分別使程式轉移到pr0-pr4程式段。要求當以上程式段的功能完成後,都採用ret指令,指定返回到程式的初始入口start標號處。
要求:pr0 :教材75頁習題。
pr1 :同上習題9題
pr2:同上習題10
其餘入口,只需完成空操作就返回。
二、 keil**:
*** 0000
ljmp start
*** 0100
tab: db 0eeh,0deh,0beh,7eh,0edh,0ddh
start:
movdptr ,#start
pushdpl
pushdph
mov a,#0eeh
mov 20h,a
mov dptr ,#tab ;置鍵碼表首址
mov a,#0表的起始位置的偏移量為零
next:
push acc;先儲存a暫存器中的值
movc a,@a+dptra是鍵碼表的編碼
cjne a,20h,next1將20h值和鍵碼表的值比較
pop acc
rl a如相等,序號乘以2,得到分支表內偏移量2n (8位變16位)
mov dptr,#apj置分支表首址
jmp @a+dptr執行表jpt+2h中的ajmp prn指令
next1:
pop acc不相等,則比較下乙個
inc a
cjne a,#6,next;表示如果==6了,說明編碼查完了也沒有相等的,程式直接結束
sjmp
apj:
ajmp pr0
ajmp pr1
ajmp pr2
ajmp pr3
ajmp pr4
pr0:
mov r7,#5h
mov 3dh,#00h
mov 3eh,#20h
mov 4eh,#88h
mov 5eh,#98h
mov a,#0
mov r4,a正數個數
mov r5,a負數個數
mov r6,a零的個數
mov r0,#40h
mov r1,#50h
mov sp,#3fh
loop:
pop acc
jz zero
jb acc.7,fs
inc r4
mov @r0,a
inc r0
ajmp dj
fs:inc r5
mov @r1,a
inc r1
ajmp dj
zero:
inc r6
dj:djnz r7,loop
retdata1:db 0efh,3fh,3eh,07h
pr1:
mov r7,#03h;進行3次迴圈
mov r0,#data1
mov a,@r0
cpl a ;取反
add a,#01 ;加1
mov @r0,a
ab1:
inc r0
mov a,@r0
cpl a
addc a,#0 ;帶進製
djnz r7,ab1
;sjmp $
retbuf1:db 1111b,0101b,0010b,0100b,0101b,0010b,0001b,0000b,1001b,0000b,1010b,1011b,0000b,0011b,0010b,0001b
buf2:db 0
buf:db 0
pr2:
;30h放平均值 40h放餘數
mov r0,#buf1
mov r7,#16 ;迴圈16次數
mov b,#0
mov a,@r0
mov r2,a
loop1:
mov a,r2
inc r0
add a,@r0
mov r2,a
mov a,b
addc a,#0
mov b,a
djnz r7,loop1
mov r6,#04h
mov 30h,#buf2
mov 30h,a
mov 40h,#buf
mov 40h,#0
nex:
clr c
mov a,b
rrc a
mov b,a
mov a,30h
rrc a
mov 30h,a
mov a,40h
rrc a
mov 40h,a
djnz r6,nex
sjmp $
retpr5:
retpr3:
retpr4:
retend三、 實驗截圖:
初始化:
結果:四、 實驗小結:
本實驗中,將鍵碼排成表,將鍵碼表中的值和20h單元中的內容進行比較;另外編制一張轉移表,存放ajmp指令,利用jmp @a+dptr執行表內的ajmp指令,從而實現分支轉移。
「rl a」:因為每個ajmp指令佔兩個位元組,將剛記下來的鍵碼中的值(即:鍵碼的序號)乘以2即為轉移表的偏移位址,在利用jmp @a+dptr執行表內的ajmp指令,從而實現分支轉移。
「movdptr ,#start
pushdpl
push dph」:指定每次主程式返回到start。在微控制器中,每乙個子程式的返回用ret指令,而ret指令的功能正好可以使得子程式從棧頂彈出斷點到pc,從而返回到主程式
一、 實驗題目:使用c語言完成,實驗一,實驗二。
二、 keil**:
實驗一:
#include
#include
void main()
}實驗二:
#include
void pr0();
void pr1();
void pr2();
void pr3();
void pr4();
void pr5();
int main()
; char *p0=0x20; //指標變數*p0指向20h這個單元
*p0=0xde給20h單元賦初值(20h單元裡存放鍵碼表中任一值)
for(i=0;i
}key=i;
switch(key)
return 0;
}void pr0()
; char data *p30 = 0x30;
char data *p40 = 0x40;
char data *p50 = 0x50;
int i;
int countr4=0; //分別將正數、負數和零的個數存入r4,r5,r6中
int countr5=0;
int countr6=0;
for(i=0;i
for(i=0;i
else if(*p30<0)
else
}++p30;
}}void pr1()
;int i;
int j;
char cy=psw^7;
data1[0]=(~data1[0])+0x1;
//while(j<4)
for(j=0;j
}void pr2()
;char buf2=0;
charbuf=0;
int sum=0;
int i=1;
while(i<=16)
buf2=sum/0x10;
buf=sum%0x10;
}三、 實驗截圖:
實驗一:
實驗二:
四、 實驗小結:
在本實驗中,我們用c語言編寫**的時候,特別注意指標的使用。另外,在微控制器中使用c語言,與我們之前寫c語言的時候還是有一些不同的地方,尤其是在指標使用上面的不同。c語言是一種通用的程式語言,**率高,資料型別豐富,且具有良好的程式結構;微控制器的c語言採用c51編譯器,由c51產生的目標**短,執行速度快,所需記憶體空間小。
微控制器實驗報告
1福建農林大學計算機與資訊學院 資訊工程類 實驗報告 2013 年 10 月 28 日 實驗專案列表 福建農林大學計算機與資訊學院資訊工程類實驗報告 系 電子資訊工程專業 電子資訊工程年級 2011級 姓名 詹緩輝學號 3116004094實驗課程 微控制器技術 實驗室號 田c513實驗時間 10....
微控制器實驗報告
學校 合肥工業大學 班級 電腦科學與技術 學號 姓名 實驗1 系統認識實驗 1 實驗目的 1 了解zy15mcu12bc2微控制器實驗開發裝置的接線與安排。掌握實驗箱內撥位開關kf,kc的使用方法。2 通過例項程式的編輯 編譯 鏈結及除錯,熟悉keilc51軟體的使用方法和基本操作。3 教育學生愛撫...
微控制器實驗報告
姓名王文龍 學院機電工程院 班級機械 1102 班 學號0806110402 日期2014.10.30 實驗一定時器實驗 一 實驗目的 1.學習89c51內部計數器的使用和程式設計方法 2.進一步掌握中斷處理程式的編寫方法 二 實驗說明 關於內部計數器的程式設計主要是定時常數的設定和有關控制暫存器的...