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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 單片機原理及應用 實 驗 報 告 冊 系別: 電 氣 學 院 班級: 自 動 化142 姓名: 學號: 實驗一:熟悉keil c51 集成開發(fā)環(huán)境及常用指令1、 實驗目的:(1) 了解80c51典型應用系統(tǒng)的開發(fā)過程,熟悉keil c51集成開發(fā)環(huán)境;(2) 掌握單步執(zhí)行程序,查看專用寄存器和單片機RAM的執(zhí)行結果;(3) 掌握80c51的尋址方式及常用指令的使用方法。2、 實驗內容(1) 基本指令練習;(2) 數(shù)據轉送(循環(huán)方式)。3、 思考題1、 分別執(zhí)行以下程序,在調試狀態(tài)下觀察有關單元的內容順序執(zhí)行的程序:ORG 00HSJMP MAINORG 30HMAIN: MOV SP,#60

2、H MOV R0,#40H MOV R1,#30H MOV 30H,#50H MOV A,#40H MOV R0,A ;R0與A內容相等為40H INC A MOV A,R1 ;A的內容為30H,R1的內容給A PUSH ACC ;61H給A POP 32H ;60H給30H MOV A,#5FH SWAP A ;高四位低四位交換,A為F5H MOV DPTR,#0030H MOVX DPTR,A循環(huán)程序:XUNHUAN1: MOV R0,#30H ;要賦值的首地址 MOV R2,#10H ;一共賦值16次 CLR A ;從0開始賦值LOOP1: MOV R0,A ;賦值16次后停止賦值 IN

3、C A ;32H=2,37H=7,3BH=0B,3FH=0F INC R0 DJNZ R2,LOOP1 XUNHUAN2: MOV R0,#30H MOV R1,#40H MOV R2,#10HLOOP2: MOV A,R0 ;從40H開始一直賦值 MOV R1,A ;賦的值從30H開始 INC R0 ;就是40H=30H,41H=31H INC R1 ;一直到R2=0 DJNZ R2,LOOP2 ;就是4FH=3FH匯編程序3:PANDUAN1: MOV 30H,#10H MOV 31H,#4BH MOV R0,#30H MOV R1,#31HPAN0: MOV A,R0 CLR C ;進位

4、位清零 SUBB A,R1 ;帶進位位的加法 JNC PAN1 ;判斷進位位C,不為零跳轉 MOV A,R0 ;所以當C等于零時,將 MOV 40H,R1 ;30H和30H的內容互換 MOV R0,40H MOV R1,APAN0: NOP END2、 編程完成:單片機內部RAM40H4FH置初值A0H4FH的內容傳送到外部RAM中的2000H200FH單元,在把外部RAM中的2000H200FH單元的內容傳送到單片機內部RAM的50H5FH單元。匯編代碼: ORG 00HAJMP MAINORG 30HMAIN:MOV R0,#40HMOV R1,#16MOV A,#01HMOV DPTR,

5、#2000HLOOP1:MOV R0,AMOVX DPTR,AINC DPTRINC R0INC ADJNZ R1,LOOP1MOV R0,#50HMOV R1,#16MOV DPTR,#2000HLOOP2:MOVX A,DPTRMOV R0,AINC DPTRINC R0DJNZ R1,LOOP2END實驗二:中斷、定時器與I/O口控制1、 實驗目的 (1)掌握定時器/計數(shù)器、中斷初始化程序設計的方法; (2) 掌握定時/計數(shù)器方式2的編程方法; (3)掌握中斷的編程方法; (4)掌握使用單片機P1口和P3口做I/O輸出,各參數(shù)的配置。2、 實驗任務完成在每隔50MS/1S下接在P1口的八

6、個發(fā)光二極管循環(huán)亮滅程序設計和調試。要求:1、選擇定時器T0方式一定時,中斷方式產生50MS,使P1口的八個發(fā)光二極管循環(huán)亮滅。 2、用定時器與計數(shù)器的方式,使T0工作定時產生50MS,使T1工作與計數(shù)器,計數(shù)10次,每次T0溢出后從P3.0給T1端P3.5一個脈沖。三、(1) 用定時器定時,計數(shù)器計數(shù),當50ms到來時,取反P3.0讓P3.0口能夠輸出一個周期為100ms的脈沖,通過外接導線到P3.5,則計數(shù)器就有了外部脈沖的信號,而計數(shù)器是在下降沿時計數(shù),所以應該讓P3.0一開始就輸出低電平。電路圖如下:(2)定時器方式一和方式二最大定時間分別是: 方式一:65.536ms(213微秒)

7、方式二:0.256ms(28微秒)實驗三:擴展并行接口81551、 實驗目的:(1) 掌握8051單片機與8155的接口方法(2) 掌握keil c51集成開發(fā)環(huán)境在硬件仿真條件下各參數(shù)的設置;(3) 掌握軟件延時和定時器中斷延時的編程方法。2、 實驗內容畫出實驗電路圖:匯編程序: ORG 0000H LJMP MAIN ORG 000BH LJMP TIMEOMAIN: MOV SP ,#60H MOV TMOD ,#01H MOV TH0 ,#3CH MOV TL0 ,#0B0H ;定時50ms MOV DPTR ,7FF8 ;DPTR指向命令寄存器8155 MOV A ,#03H ;設定

8、A,B,C工作方式 MOVX DPTR ,A ;啟動8155 MOV DPTR,#7FF9H ;打開A口 MOV A ,#0FEH MOVX DPTR ,A ;將流水燈值給PA口 SETB EA SETB ET0 SETB TR0 ;打開單片機定時器0 SJMP $TIME0: MOV TH0 ,#3CH MOV TL0 ,0B0H RL A MOVX DPTR ,A ;將左移的值給PA口 RETI END實驗四:并行A/D轉換1、 實驗目的:(1) 掌握并行A/D芯片ADC0809與單片機的接口方法(2) 了解ADC0809芯片的性能;(3) 通過實驗了解單片機實現(xiàn)數(shù)據采集的方法。2、 實驗

9、內容:畫出電路圖:按圖中cs接P2.7則模擬輸入通道的地址值INT0INT7:7FF87FFF#include "stdio.h"typedef int ElemType; typedef int Status; struct List  ElemType *list1; /指向線性表的第一個節(jié)點   int length; /線性表的實際長度    int listSize;

10、 /線性表的最大長度 324   /附加1:給線性表增加空間 Status AgainMalloc(struct List *L1)      ElemType *p = (ElemType *)realloc(L1->list1,(L1->listSize + 1)*sizeof(ElemType);  if(!p)   &

11、#160;          printf("存儲空間分配失?。?quot;);         exit(1);          L1->list1 = p; /*使list1指向新線性表空間*/     L1

12、->listSize=L1->listSize + 1; /*把線性空間大小修改為新的長度*/  /附加2:遍歷線性表元素  Status Traverse(struct List *L1)   int i;      for(i = 0;i < L1->length;i+)   printf("

13、;%d  ",L1->list1i);      /1.創(chuàng)建線性表,給定長度  Status InitList(struct List *L1,int ms)   if(ms<0)   printf("初始化線性表的長度不能小于0n");    exit(1);    L1->le

14、ngth = 0;  L1->listSize = ms;   /給list1分配空間,單元大小為定義的ElemType類型,長度為ms    L1->list1 = (ElemType *)malloc(ms * sizeof(ElemType);   if(!L1)             &

15、#160; printf("空間分配失?。?quot;);         exit(1);               else        printf("空間分配成功!n");      printf("

16、;您分配的空間大小為%dn",ms);         return 0;    /2.銷毀線性表 Status DestoryList(struct List *L1)  if(L1 != NULL)   L1->length = 0;    L1->listSize = 0

17、;   free(L1);    printf("銷毀成功!n");  return 0;/3.清空線性表 Status ClearList(struct List *L1)  /清空只需要將線性表的長度記為0即可。   L1->length = 0;   printf("清空成功!n");   ret

18、urn 0; /4.判斷線性表是否為空(如果為空返回0,如果不為空返回1)  Status ListEmpty(struct List *L1)  if(L1->length != 0)   printf("線性表不為空!n");   return 1;      else     printf(&qu

19、ot;線性表為空!n");    return 0;    /5.返回線性表的當前長度 int ListLength(struct List *L1)   return L1->length;   /6.返回第i個元素的值 ElemType GetElem(struct List *L1,int i)  if(i 

20、;< 1)|(i > L1->listSize)   printf("查找的位置超出線性表的范圍!");   /退出    exit(1);  else   /返回第pos個元素的值    return L1->list1i-1;      /7.判斷某個元素是否是

21、線性表元素,如果是,返回這個元素第一次在線性表中出現(xiàn)的位置,如果不是返回0 int IsElem(struct List *L1,ElemType e) /必須要先定義,后使用! int i; for(i = 0;i<L1->length;i+) if(L1->list1i=e) /因為i是從0,開始,所有返回i+1 return i + 1; /如果沒有找到相應的元素,返回-1; return 0; /8.返回某個元素的前驅元素(如果這個元素是第一個,則提示“這是第一個元素”) /1、如果這個元素不是線性表元素,返回-1  /2、如果這個元素是

22、線性表第一個元素,返回0,提示第一個元素沒有前驅元素  ElemType PriorElem(struct List *L1,ElemType e)    /判斷這個元素是否是線性表元素,如果是返回它的第一個位置  /調用IsElem函數(shù),并將結果返回給temp變量    int temp = IsElem(L1,e);  if(temp = 0)   printf(

23、"這個元素不是線性表的元素");   return -1;   else if(temp = 1)   printf("這個元素是第一個元素,沒有前驅元素");     return 0;   else/返回e元素的前驅元素    return L1->list1temp-2; &#

24、160;   /9.返回某個元素的后繼元素(如果這個元素是最后一個,則提示“這是最后一個元素”)  /1、如果這個元素不是線性表元素,返回-1  /2、如果這個元素是線性表的最后一個元素,返回0,提示最后一個元素沒有后繼元素   ElemType NextElem(struct List *L1,ElemType e)    /判斷這個元素是否是線性表元素,如果是返回它的第一個位置  /調用IsElem函數(shù),并將結果返回給temp變量 

25、   int temp = IsElem(L1,e);  if(temp = 0)     printf("這個元素不是線性表的元素");    return -1;     else if (temp = L1->length)     printf("這個元素是最后一個元素,沒有后繼元素");

26、60;    return 0;     else     /返回e元素的后繼元素     return L1->list1temp;        /10.在線性表的指定位置i之前插入元素e Status ListInsert(struct List *L1,int i,ElemType e) int temp; if(i < 1)|(i > L1->lengt

27、h + 1) printf("i越界,不能插入"); exit(1); /如果線性表的長度等于最大長度,增加空間 if(L1->length = L1->listSize) /每次增加1個ElemType單位的個空間 AgainMalloc(L1); /將位置i之后的元素向后以一個位置 for(temp = (L1->length+1);temp >= i;temp-) L1->list1temp = L1->list1temp-1; /在i-1的位置插入新元素e L1->list1i-1 = e; /長度加1 L1->len

28、gth = L1->length +1; return 0;  /11.刪除線性表中指定位置i的元素e,并將e返回  ElemType ListDelete(struct List *L1,int i)    ElemType e;  int temp;  if(i < 1)|(i > L1->length)   printf("要刪除的元素超

29、出線性表的范圍!");   exit(1);    /將第i個位置的元素返回給e   e = L1->list1i-1;   for(temp = i;i < L1->length;i+)     /將第i+1個元素的值賦值給第i個位置     L1->list1i-1 = L1->lis

30、t1i;       /將長度減去1    L1->length = L1->length - 1;   return e;   int main()  int itemp = 0;   int anytemp = 0;    int i = 1;

31、   int listlength = 0;    ElemType e;   struct List L1;   printf("線性表的基本操作!n");printf("*初始化操作*n");printf("請輸入初始化的長度:"); scanf("%d",&itemp); /1.創(chuàng)建-InitList(struct List *L1,int ms)Ini

32、tList(&L1,itemp); printf("請輸入線性表的值,不能超過%d個,以911結束,911不算長度:n",itemp); for(i = 1;i <= itemp;i+) scanf("%d",&e); /這里不能是exit,exit直接退出了所有程序,所以是break if(e = 911) break; /10.在線性表指定位置i之前插入元素e ListInsert(&L1,i,e); /5.返回長度-ListLength(struct List *L1) listlength = ListLength(&L1); printf("目前,線性表的長度為:%dn",listlength); /遍歷線性表 printf("目前,線性表的值為:n"); /遍歷,在Traverse中輸出 Traverse(&L1); /6.返回第i個元素值-GetElem(struct List *L1,int i) printf("請輸入,要返回第幾個元素值:n");/輸入時,要在這里賦值地址“&” scanf("%

溫馨提示

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

評論

0/150

提交評論