單片機實驗報告_第1頁
單片機實驗報告_第2頁
單片機實驗報告_第3頁
單片機實驗報告_第4頁
單片機實驗報告_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、實驗一一、 實驗題目: 試編寫一段程序,其功能為將21H單元的內(nèi)容8位分別依次存放到從22H開始的8單元中。二、 keil代碼:org 0000hjmp startorg 0100hstart: mov 21h,#8; mov A ,21h;取出21中的數(shù) mov R0,#22h ;初始化 mov R1,#7h ;循環(huán)次數(shù)為7loop: RRC A;把A之中的最低位移到C JC real;判斷C里面是數(shù)是否為1,如果是1.則跳轉(zhuǎn)到real mov R0,#0h jmp kk;real:mov R0,#1h;如果是1,則將1賦到R0單元里kk:INC r0;依次判斷A中的每一位DJNZ R1,l

2、oop;jmp $;死循環(huán)end三、 實驗截圖:四、 實驗小結(jié):這是我們單片機的第一個實驗,因為剛接觸,所以會感覺很陌生,內(nèi)心有一種畏懼感,看到題目的時候也是沒有頭緒,可以說完全是不知道到底題目是一個什么意思,更是不知道我們應(yīng)該如何編寫程序。不過后面通過老師的講解,自己也去查看了一些有關(guān)的書籍,慢慢也理解了該如何去實現(xiàn)這種實驗題目。在認(rèn)真琢磨之后,我開始學(xué)會像以前剛開始學(xué)習(xí)C語言一樣慢慢繪制一個程序的流程圖,理清思緒,然后根據(jù)流程圖編寫相應(yīng)的代碼。下面是本題的實驗流程圖:通過完成這個實驗,我對單片機的程序有了很大的認(rèn)識。實驗中,也是深刻的理解到了一個單片機程序每一步的實現(xiàn)與運行。當(dāng)然,也掌握了

3、在keil中調(diào)試的方法。實驗二一、 實驗題目: 若0-5號鍵的鍵值分別是:EEH、DEH、BEH、7EH、EDH、DDH。設(shè)鍵值存放在內(nèi)部RAM 20H單元中,編程實現(xiàn)根據(jù)2OH中的鍵值分別使程序轉(zhuǎn)移到PR0-PR4程序段。要求當(dāng)以上程序段的功能完成后,都采用RET指令,指定返回到程序的初始入口START標(biāo)號處。要求:PR0 :教材75頁習(xí)題。PR1 :同上 習(xí)題9題PR2:同上 習(xí)題10其余入口,只需完成空操作就返回。二、 keil代碼:org 0000 ljmp startorg 0100TAB: DB 0EEH,0DEH,0BEH,7EH,0EDH,0DDHstart:mov dptr

4、,#startpush dplpush dphmov A,#0EEHMOV 20H,AMOV DPTR ,#TAB;置鍵碼表首址MOV A,#0 ;表的起始位置的偏移量為零NEXT:PUSH ACC;先保存A寄存器中的值MOVC A,A+DPTR ;A是鍵碼表的編碼CJNE A,20H,NEXT1 ;將20H值和鍵碼表的值比較POP ACCRL A ;如相等,序號乘以2,得到分支表內(nèi)偏移量2n (8位變16位)MOV DPTR,#APJ ;置分支表首址JMP A+DPTR ;執(zhí)行表JPT+2H中的AJMP PRn指令NEXT1:POP ACC;不相等,則比較下一個INC ACJNE A,#6,

5、NEXT;表示如果=6了,說明編碼查完了也沒有相等的 ,程序直接結(jié)束SJMP $APJ:AJMP PR0AJMP PR1AJMP PR2AJMP PR3AJMP PR4PR0: MOV R7,#5HMOV 3DH,#00HMOV 3EH,#20HMOV 4EH,#88HMOV 5EH,#98HMOV A,#0MOV R4,A ;正數(shù)個數(shù)MOV R5,A ;負(fù)數(shù)個數(shù)MOV R6,A ;零的個數(shù)MOV R0,#40HMOV R1,#50HMOV SP,#3FHLOOP:POP ACCJZ ZEROJB ACC.7,FSINC R4MOV R0,AINC R0AJMP DJFS:INC R5MOV

6、R1,AINC R1AJMP DJZERO:INC R6DJ:DJNZ R7,LOOPRETDATA1:DB 0EFH,3FH,3EH,07HPR1: MOV R7,#03H;進行3次循環(huán)MOV R0,#DATA1MOV A,R0CPL A;取反ADD A,#01 ;加1MOV R0,AAB1:INC R0MOV A,R0CPL AADDC A,#0 ;帶進位DJNZ R7,AB1;SJMP $RETBUF1:DB 1111B,0101B,0010B,0100B,0101B,0010B,0001B,0000B,1001B,0000B,1010B,1011B,0000B,0011B,0010B,

7、0001BBUF2:DB 0BUF:DB 0PR2: ;30h放平均值 40h放余數(shù)MOV R0,#BUF1 MOV R7,#16 ;循環(huán)16次數(shù)MOV B,#0MOV A,R0MOV R2,ALOOP1:MOV A,R2INC R0ADD A,R0MOV R2,AMOV A,BADDC A,#0MOV B,ADJNZ R7,LOOP1MOV R6,#04HMOV 30H,#BUF2MOV 30H,AMOV 40H,#BUFMOV 40H,#0NEX:CLR CMOV A,BRRC AMOV B,AMOV A,30HRRC AMOV 30H,AMOV A,40HRRC A MOV 40H,AD

8、JNZ R6,NEXSJMP $RETPR5: RETPR3: RETPR4: RETEND三、 實驗截圖:初始化: 結(jié)果:四、 實驗小結(jié):本實驗中,將鍵碼排成表,將鍵碼表中的值和20H單元中的內(nèi)容進行比較;另外編制一張轉(zhuǎn)移表,存放AJMP指令,利用JMP A+DPTR執(zhí)行表內(nèi)的AJMP指令,從而實現(xiàn)分支轉(zhuǎn)移?!癛L A”:因為每個AJMP指令占兩個字節(jié),將剛記下來的鍵碼中的值(即:鍵碼的序號)乘以2即為轉(zhuǎn)移表的偏移地址,在利用JMP A+DPTR執(zhí)行表內(nèi)的AJMP指令,從而實現(xiàn)分支轉(zhuǎn)移?!癿ov dptr ,#startPush dplpush dph”:指定每次主程序返回到start。在單

9、片機中,每一個子程序的返回用RET指令,而RET指令的功能正好可以使得子程序從棧頂彈出斷點到PC,從而返回到主程序?qū)嶒炄弧?實驗題目:使用C語言完成,實驗一,實驗二。二、 keil代碼:實驗一:#include#includevoid main() char *p1=0x21; char *p2=0x22; int i=1; *p1=0x8; while(i1; p2+; i+; 實驗二:#includevoid PR0();void PR1();void PR2();void PR3();void PR4();void PR5(); int main()int i;/鍵碼表code的下表i

10、nt key=0;char code1=0xEE,0xDE,0xBE,0x7e,0xED,0xDD;char *p0=0x20; /指針變量*p0指向20H這個單元*p0=0xDE; /給20H單元賦初值(20H單元里存放鍵碼表中任一值 )for(i=0;isizeof(code1);i+)if(*p0=code1i)break;key=i;switch(key)case 0:PR0();break;case 1:PR1();break;case 2:PR2();break;case 3:PR3();break;case 4:break;case 5:break;default:break;r

11、eturn 0;void PR0() char table116=1,2,-6,7,8,9,0,-1,-2,-3,-4,-5,-6,1,4,6;char data *p30 = 0x30;char data *p40 = 0x40;char data *p50 = 0x50;int i;int countR4=0; /分別將正數(shù)、負(fù)數(shù)和零的個數(shù)存入R4,R5,R6中int countR5=0;int countR6=0;for(i=0;isizeof(table1);i+) /依次將table1表里的16個數(shù)據(jù)存入30H單元開始的單元里。p30i=table1i; for(i=0;i0)*p4

12、0=*p30;+p40;+countR4;else if(*p300)*p50=*p30;+p50;+countR5;else+countR6; +p30;void PR1()char data1=0x10,0x11,0x12,0x13;int i;int j;char Cy=PSW7;data10=(data10)+0x1;/while(j4)for(j=0;jsizeof(data1);j+)data1i=(data1i)+Cy;i+;void PR2() char buf1=0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x0A,0x0B,0x0C,0x0D,0

13、x0E,0xF; char buf2=0; char buf=0; int sum=0; int i=1; while(i=16) sum=sum+buf1i; +i; buf2=sum/0x10; buf=sum%0x10;三、 實驗截圖:實驗一:實驗二:四、 實驗小結(jié):在本實驗中,我們用C語言編寫代碼的時候,特別注意指針的使用。另外,在單片機中使用C語言,與我們之前寫C語言的時候還是有一些不同的地方,尤其是在指針使用上面的不同。C語言是一種通用的程序設(shè)計語言,代碼率高,數(shù)據(jù)類型豐富,且具有良好的程序結(jié)構(gòu);單片機的C語言采用C51編譯器,由C51產(chǎn)生的目標(biāo)代碼短,運行速度快,所需內(nèi)存空間小。

14、實驗中,注意:“for(i=0;isizeof(table1);i+) p30i=table1i; ”:表示依次將table1表里的16個數(shù)據(jù)存入30H單元開始的單元里。實際上,在C中指針就相當(dāng)于一個數(shù)組。在本實驗中,我可以根據(jù)之前的匯編程序?qū)嶒?,較為容易的根據(jù)每個子程序編子函數(shù)模塊。由于之前有C語言的基礎(chǔ),所以能夠比較好的完成本實驗。實驗四五、 實驗題目:當(dāng)K1鍵按下后,首先使蜂鳴器響一聲,然后使LED1-LED8完成3種閃亮的花樣(自己定義),每一種花樣循環(huán)3次,然后周而復(fù)始。六、 keil代碼:/*當(dāng)K1鍵按下后,首先使蜂鳴器響一聲,然后使LED1-LED8完成3種閃亮的花樣(自己定義)

15、,每一種花樣循環(huán) 3次,然后周而復(fù)始。*/#includesbit P2_0=P20;/接蜂鳴器sbit P2_7=P27;sbit P1_0=P10;sbit P1_1=P11;sbit P1_2=P12;sbit P1_3=P13;sbit P1_4=P14;sbit P1_5=P15;sbit P1_6=P16;sbit P1_7=P17; void DELAY(int time)/延時 while(time-) void BUZ_ON() if(P2_7=0) P2_0=1; else P2_0=0; void F1(void) int i;char data_group_mide5=

16、0x00,0x18,0x24,0x42,0x81;/向兩邊延伸for(i=0;i5;i+) P1=data_group_midei; DELAY(20000); P1=0x00; void F2(void) int i; char data_group_left8=0xFF,0x7F,0x3F,0x0F,0x07,0x03,0x01,0x00;/向左延伸for(i=0;i8;i+)P1=data_group_lefti;DELAY(20000); P1=0x00; void F3(void) int i;char date_group_right8=0x00,0x01,0x03,0x07,0x

17、0f,0x3f,0x7f,0xff;/向右延伸for(i=0;i8;i+) P1=date_group_righti;DELAY(20000); P1=0x00; void main() unsigned int i; /每種花樣循環(huán)三次 P2_0=0; P2_7=1; BUZ_ON(); P1=0x00; while(P2_7=0) for(i=0;i3;i+)/花樣1 F1(); for(i=0;i3;i+)/花樣2 F2(); for(i=0;i3;i+)/花樣3 F3(); 三、protues電路圖:四、實驗截圖:5、 實驗小結(jié):通過本次實驗,我們熟悉了protues的編譯環(huán)境,對以后

18、的單片機學(xué)習(xí)有很大幫助。實驗五1、 實驗題目:程序啟動后4位LED顯示器滾動顯示“-”,每按下1次K1鍵后,首先使蜂鳴器響一聲。然后,依次使LED滾動顯示CNT的計數(shù)值(0-9)。2、 Keil代碼:/*程序啟動后4位LED顯示器滾動顯示“-”,每按下才1次K1鍵后,首先使蜂鳴器響一聲。然后,依次使LED滾動顯示CNT的計數(shù)值(0-9)。1、按鍵K1采用中斷來管理。(INT0采用邊沿觸發(fā))2、中斷服務(wù)程序完成四個功能: 1)消除按鍵K1抖動。 2)CNT計數(shù)。 3)查表將計數(shù)值轉(zhuǎn)換成LED顯示器的段代碼。 4)將段代碼分別放入4個顯示緩沖單元。*/#include#define uchar u

19、nsigned char#define uint unsigned intsbit P2_7=P27;sbit P3_3=P33;uchar CORDING=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xf9,0xa4,; /0,1,2,3,4.9,0,1,2的段碼int delayms(uint t) uint n;while(-t)n=200;while(-n);return 0;int main() uint CNT=0; P2_7=0; P3_3=1; P1=0xF7; while(1) if(P3_3=0) uint

20、 i; CNT+; P2_7=1; delayms(100); for(i=1;i10) CNT=CNT-10; P2_7=0; return 0;3、 protues電路圖:4、 實驗截圖:5、 實驗總結(jié):通過本次實驗,我們熟悉了CNT計數(shù),學(xué)會了如何使LED燈上顯示0-9數(shù)字。實驗六1、 實驗題目:兩個數(shù)碼管,K1,K2兩個按鍵,完成K1啟動計數(shù),K2暫停計數(shù),每一秒鐘數(shù)碼管增加1,60秒鐘后,數(shù)碼管回歸0,重新計數(shù)。 二、keil代碼:/*兩個數(shù)碼管,K1,K2兩個按鍵,完成K1啟動計數(shù),K2暫停計數(shù),每一秒鐘數(shù)碼管增加1,60秒鐘后,數(shù)碼管回歸0,重新計數(shù)。按鍵K1,K2采用中斷來管理

21、。(INT0采用邊沿觸發(fā))*/#define uchar unsigned char#define uint unsigned int#includeuchar CNT=0;uchar m=0;sbit P3_7=P37;sbit P3_2=P32;sbit P0_0=P00;uchar CORDING=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F; /0,1,2,3,4.9的段碼void Delay(uint a) while(-a); void intproc() interrupt 0 TR0=0;void Time0() inter

22、rupt 1 m+; /中斷一次,m加1if(m=20) m=0; /中斷次數(shù)清零 CNT+; /秒加1 if(CNT=60) CNT=0; P1=CORDINGCNT/10;/顯示十位 Delay(10); P2=CORDINGCNT%10;/顯示個位 Delay(10);void init() TMOD=0x01; /使用定時器T0 使用方式1TH0 = 0x3c; TL0 = 0xb0; /50ms中斷一次 ET0=1;TR0=1;EX0=1;IT0=1;EA=1;void main() P1=0x3f; P2=0x3f; P3_7=1; while(1) if(P3_7=0) /控制是否開啟 init(); 3、 protues電路圖:四、實驗截圖:5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論