久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

單片機實驗報告[五篇模版]

時間:2019-05-11 22:58:09下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《單片機實驗報告》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《單片機實驗報告》。

第一篇:單片機實驗報告

實驗一

一、實驗題目:試編寫一段程序,其功能為將21H單元的內容8位分別依次存放到從22H開始的8單元中。

二、keil代碼:

org 0000h jmp start

org 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代碼:

org 0000 ljmp start org 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+DPTR

;A是鍵碼表的編碼

;置鍵碼表首址

;表的起始位置的偏移量為零 CJNE A,20H,NEXT1 POP ACC RL A

;將20H值和鍵碼表的值比較

;如相等,序號乘以2,得到分支表內偏移量2n(8位變16位)

MOV DPTR,#APJ

JMP @A+DPTR PRn指令

NEXT1: POP ACC

INC A CJNE A,#6,NEXT;表示如果==6了,說明編碼查完了也沒有相等的,程序直接結束

SJMP $

APJ: AJMP PR0 AJMP PR1 AJMP PR2 AJMP PR3 AJMP PR4

;不相等,則比較下一個

;置分支表首址

;執行表JPT+2H中的AJMP

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 RET

DATA1: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 $

RET BUF1: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 $ RET PR5:

RET PR3:

RET PR4:

RET END

三、實驗截圖:

初始化:

結果:

四、實驗小結:

本實驗中,將鍵碼排成表,將鍵碼表中的值和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(){ char *p1=0x21;char *p2=0x22;int i=1;

*p1=0x8;

while(i<=8)

{

*p2=*p1&0x01;

*p1=*p1>>1;p2++;i++;

} } 實驗二: #include void PR0();void PR1();void PR2();void PR3();void PR4();void PR5();

int main(){ int i;//鍵碼表code[]的下表

int key=0;char code1[]={0xEE,0xDE,0xBE,0x7e,0xED,0xDD};char *p0=0x20;

//指針變量*p0指向20H這個單元

*p0=0xDE;

//給20H單元賦初值(20H單元里存放鍵碼表中任一值)

for(i=0;i

}

key=i;switch(key)if(*p0==code1[i]){break;}

} {

} return 0;case 0:PR0();break;case 1:PR1();break;case 2:PR2();break;case 3:PR3();break;case 4:break;case 5:break;default:break;void PR0(){ char table1[16]={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;R4,R5,R6中

int countR5=0;

//分別將正數、負數和零的個數存入 int countR6=0;for(i=0;i

//依次將table1表里的16個數據存入30H單元開始的單元里。

{

} for(i=0;i

{

if(*p30>0){

} else if(*p30<0){

} else *p50=*p30;++p50;++countR5;

*p40=*p30;++p40;++countR4;

p30[i]=table1[i];

{ } ++countR6;

}

++p30;} }

void PR1(){ char data1[]={0x10,0x11,0x12,0x13};int i;int j;char Cy=PSW^7;data1[0]=(~data1[0])+0x1;//while(j<4)for(j=0;j

} } data1[i]=(~data1[i])+Cy;i++;

void PR2(){ char buf1[]={0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0x0A,0x0B,0x0C,0x0D,0x0E,0xF};char buf2=0;charbuf=0;int sum=0;int i=1;while(i<=16)

{ sum=sum+buf1[i];

++i;

} buf2=sum/0x10;buf=sum%0x10;}

三、實驗截圖:

實驗一:

實驗二:

四、實驗小結:

在本實驗中,我們用C語言編寫代碼的時候,特別注意指針的使用。另外,在單片機中使用C語言,與我們之前寫C語言的時候還是有一些不同的地方,尤其是在指針使用上面的不同。C語言是一種通用的程序設計語言,代碼率高,數據類型豐富,且具有良好的程序結構;單片機的C語言采用C51編譯器,由C51產生的目標代碼短,運行速度快,所需內存空間小。

實驗中,注意:

“for(i=0;i

{

p30[i]=table1[i];}”:表示依次將table1表里的16個數據存入30H單元開始的單元里。實際上,在C中指針就相當于一個數組。

在本實驗中,我可以根據之前的匯編程序實驗,較為容易的根據每個子程序編子函數模塊。由于之前有C語言的基礎,所以能夠比較好的完成本實驗。

實驗四

五、實驗題目: 當K1鍵按下后,首先使蜂鳴器響一聲,然后使LED1-LED8完成3種閃亮的花樣(自己定義),每一種花樣循環 3次,然后周而復始。

六、keil代碼:

/*當K1鍵按下后,首先使蜂鳴器響一聲,然后使LED1-LED8完成3種閃亮的花樣(自己定義),每一種花樣循環 3次,然后周而復始。*/ #include sbit P2_0=P2^0;//接蜂鳴器 sbit P2_7=P2^7;sbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P1_4=P1^4;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;

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_mide[5]={0x00,0x18,0x24,0x42,0x81};//向兩邊延伸 for(i=0;i<5;i++){ P1=data_group_mide[i];DELAY(20000);}

P1=0x00;

} void F2(void){ int i;char data_group_left[8]={0xFF,0x7F,0x3F,0x0F,0x07,0x03,0x01,0x00};//向左延伸 for(i=0;i<8;i++){ P1=data_group_left[i];DELAY(20000);}

P1=0x00;

} void F3(void){ int i;char date_group_right[8]={0x00,0x01,0x03,0x07,0x0f,0x3f,0x7f,0xff};//向右延伸 for(i=0;i<8;i++){ P1=date_group_right[i];DELAY(20000);}

P1=0x00;

} void main(){

unsigned int i;//每種花樣循環三次

P2_0=0;

P2_7=1;

BUZ_ON();

P1=0x00;while(P2_7==0)

{

for(i=0;i<3;i++)//花樣1

{F1();}

for(i=0;i<3;i++)//花樣2

{F2();}

for(i=0;i<3;i++)//花樣3

{F3();}

}

}

三、protues電路圖:

四、實驗截圖:

五、實驗小結:

通過本次實驗,我們熟悉了protues的編譯環境,對以后的單片機學習有很大幫助。

實驗五

一、實驗題目: 程序啟動后4位LED顯示器滾動顯示“-”,每按下1次K1鍵后,首先使蜂鳴器響一聲。然后,依次使LED滾動顯示CNT的計數值(0-9)。

二、Keil代碼:

/*程序啟動后4位LED顯示器滾動顯示“-”,每按下才1次K1鍵后,首先使蜂鳴器響一聲。然后,依次使LED滾動顯示CNT的計數值(0-9)。

1、按鍵K1采用中斷來管理。(INT0采用邊沿觸發)

2、中斷服務程序完成四個功能:

1)消除按鍵K1抖動。

2)CNT計數。

3)查表將計數值轉換成LED顯示器的段代碼。

4)將段代碼分別放入4個顯示緩沖單元。*/ #include #define uchar unsigned char #define uint unsigned int sbit P2_7=P2^7;sbit P3_3=P3^3;uchar CORDING[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xf9,0xa4,};//0,1,2,3,4....9,0,1,2的段碼 intdelayms(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 i;

CNT++;

P2_7=1;delayms(100);for(i=1;i<5;i++)

//4位

{

P1=CORDING[CNT-1];

switch(i)

{

//點亮第1位

//點亮第2位

//點亮第3位

//點亮第4位

delayms(100);

}

case

case

case

case }

P2=0x00;1:P2=0x01;break;2:P2=0x02;break;3:P2=0x04;break;4:P2=0x08;break;

// 熄滅

if(CNT>10){

CNT=CNT-10;}

}

三、protues電路圖:

P2_7=0;} return 0;}

四、實驗截圖:

五、實驗總結:

通過本次實驗,我們熟悉了CNT計數,學會了如何使LED燈上顯示0-9數字。

實驗六

一、實驗題目:

兩個數碼管,K1,K2兩個按鍵,完成K1啟動計數,K2暫停計數,每一秒鐘數碼管增加1,60秒鐘后,數碼管回歸0,重新計數。

二、keil代碼:

/*兩個數碼管,K1,K2兩個按鍵,完成K1啟動計數,K2暫停計數,每一秒鐘數碼管增加1,60秒鐘后,數碼管回歸0,重新計數。按鍵K1,K2采用中斷來管理。(INT0采用邊沿觸發)*/ #define uchar unsigned char #define uint unsigned int #include uchar CNT=0;uchar

m=0;sbit P3_7=P3^7;sbit P3_2=P3^2;sbit P0_0=P0^0;uchar CORDING[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0,1,2,3,4....9的段碼 void Delay(uint a){

while(--a){};

} voidintproc()interrupt 0 {

TR0=0;}

void Time0()interrupt 1 {

m++;

//中斷一次,m加1

if(m==20){

m=0;

//中斷次數清零 CNT++;//秒加1 if(CNT==60){ CNT=0;}

P1=CORDING[CNT/10];//顯示十位 Delay(10);

P2=CORDING[CNT%10];//顯示個位 Delay(10);

} } voidinit(){

TMOD=0x01;

//使用定時器T0 使用方式1 TH0 = 0x3c;

TL0 = 0xb0;

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)//50ms中斷一次 //控制是否開啟

{ init();

} }

三、protues電路圖:

}

四、實驗截圖:

五、實驗總結:

本次實驗,我們用到了中斷,按鍵K1,K2采用中斷來管理。(INT0采用邊沿觸發),通過本次實驗加強了中斷的學習,更加有利于單片機的學習。

實驗七

一、實驗題目:晶振12MHz,波特率1200,程序啟動后單片機主動發出Hello Server,PC使用串口助手應答單片機,單片機收到數據后,不做任何修改返回PC。

二、keil代碼: #include #define uchar unsigned char #define uint unsigned int

uchar code table[]=“HELLO SERVER!”;uint flag = 0;uchara,b;voidinit(){

}

voidSendByte(ucharch){ SBUF = ch;TMOD = 0x20;TH1 = 0xFD;TL1 = 0XFD;SCON = 0X50;TR1 = 1;EA = 1;ES = 1;

} while(!TI);TI = 0;voidSendString(uchar code *str){

}

void main(){

init();

SendString(“HELLO SERVER!”);while(1){

if(flag == 1){

ES = 0;SBUF = a;while(!TI);TI = 0;while(*str)SendByte(*str++);

}

} ES = 1;flag = 0;

}

voidser()interrupt 4 {

}

if(RI == 1){

} RI = 0;a = SBUF;flag = 1;

三、protues電路圖:

四、實驗截圖:

六、實驗總結:

本次實驗,我們利用了中斷來實現,通過本次實驗我們對中斷有了更加深刻的了解,讓我們在以后的為以后的學習之中打下了一定的基礎。

第二篇:單片機實驗報告[范文模版]

實 實 驗 驗 報 報 告

實驗課程:

單片機原理及應用

級:

自動化 2 班

號:

名:

師:

成績:

實 驗 日 期 :

****年**月**日

實驗名稱:

實驗 1-—計數顯示器

一、實驗目得: 學習Proteus 軟件得使用,掌握單片機原理圖得繪圖方法。

二、實驗內容:

?1、繪制“計數顯示器”電路原理圖;2、利用提供得hex 文件驗證此電路得運行效果。

三、實驗要求:

提交得實驗報告中應包括:1、繪圖方法簡述,要求說明元件與電源得選取、擺放及屬性編輯,總線與標簽得畫法等內容;2、電路原理圖;3、仿真運行效果展示,要求就仿真文件加載方法及 3~4幅運行截圖進行簡要說明;4、實驗小結,說明遇到得主要問題或實驗 1 體會等.參考電路原理圖如下:

元件類別 電路符號 元件名稱 Microprocessor ICs “U1“ 80C51 Miscellaneous “X1”/12MHz CRYSTAL Capacitors “C1”~“C2”/1nF CAP Capacitors “C3”/22μF CAP—ELEC Resistors Packs “RP1“/7—100Ω RESPACK—7 Resistors “R1"/100Ω RES Optoelectronics “LED1”~“LED2” 7SEG--CAT-GRN Switches & Relays “BUT” BUTTON 1、、及 編程思路及 C51 源程序:

2、電路原理圖:

3、仿真運行效果展示:

4、實驗小結 :

熟悉Proteus 軟件,了解軟件得結構組成與功能;學習ISIS 模塊得使用方法,學會設置圖紙、選元件、線畫總線、修改屬性等基本操作;學會可執行文件 加載及程序仿法;理解Proteus在單片機開發中得作用,完成單片機電路原 理圖得繪制. 實驗名稱:

實驗 2——LED 指示燈循環控制

一、實驗目得 熟悉μVision3 編譯軟件、掌握 C51編程與調試方法。

二、

實驗內容 1、按照教材 P243 得圖 A、34,繪制實驗二電路原理圖; 2、編寫 C51 程序,實現 8 個 LED 燈依次點亮得功能: P0、0→P0、1→ P0、2→P0、3→ ┅ →P0、7→P0、6→P0、5→ ┅ →P0、0 得順序,無限循環,間隔約50ms; 3、觀察仿真結果,完成實驗報告。

三、

實驗要求 1、采用兩種加載并運行可執行文件得方法,即proteus獨立運行與prote

us + Keil 聯合運行,體會其中得差異與意義;2、練習采用單步、斷點以及監視窗等手段進行程序調試得方法;3、觀察仿真結果,完成實驗報告:繪制得電路原理圖、編程思路分析及 C51源程序、調試過程簡述,仿真運行效果以及實驗小結。、電路原理圖:

及 2、編程思路及 C51 源程序:、仿真運行效果:、實驗小結 :

通過本次實驗我熟悉 uVision3 編譯軟件了解軟件得結構組成與功能學習C51 語言得程序設計方法)學會在 uVision3中進行 C51 程序錄入、編譯、與 調試理解 Proteus 與 Keil 聯合得仿真原理實現 LED 指示燈循環控制功能。

更好得將 C 語言與 C51 語言聯系在了一起)學到得知識能準確得利用了出來。

實驗名稱:

實驗3——指示燈與數碼管得中斷控制

一、實 驗目得 掌握外部中斷得工作原理,學會中斷程序設計.二、實驗內容 1、按照教材帕圖 A、53,繪制實驗四電路原理圖;2、要求采用外部中斷原理完成本次實驗,其中按鍵 K1、K2 均設置為下降沿觸發方式,自然優先級; 3、編寫 C51 程序實現如下功能:開機后 D1滅燈,LED1黑屏,隨后單擊 K1→D1狀態反轉,單擊 K2 →LED1 從 0 開始循環顯示0~F 字符。

4、觀察仿真結果,完成實驗報告。

三、

實驗要求 提交得實驗報告中應包括:電路原理圖,外部中斷工作原理闡述(以 K1 為例說明中斷響應過程),C51 源程序(含流程圖與注釋語句),運行效果(含運行截圖

與說明),實驗小結. 1、電路原理圖 :

2、外部中斷工作原理闡述:

持續按下 K1 則 D1 將“亮→滅→亮→滅→?→亮→滅如此循環,表明實現了 K1 對應于 D1 狀態反轉這個功能;持續按下持續按 K2 則數碼顯示管依次顯 示 1-F,實現了 K2 對應于 0~F 間得數碼管加一計數顯示.

3、、及 編程思路及 C51 源 源 程序:、仿真運行效果:

5、實驗小結:

通過實驗對 Protues 有了更多得了解,同時了解到中斷系統在實際中得更好 應用。經過編程操作起來更加熟練能很快得完成繪圖,編程時也得心應手,能熟練得運用軟件找出自己所編程中得語法問題及其她問題,并以改正。

實驗名稱:

實驗4—-電子秒表顯示器

一、實 實 驗目得 掌握定時/計數器得中斷法工作原理,熟悉 C51 編程與調試方法

二、實驗要求:

1、實驗電路原理圖如教材 P260 A、65 圖所示.程序開始時顯示“00”;當1s 產生時,秒計數加1;秒計數到 59 后,自動從“00”開始。

2、采用12MHz晶振頻率,T0 定時方式 1、50ms 定時中斷法編程(1s 需要經過 20 軟循環)(流程圖與參考程序模版如下所示).//定時中斷方式實現得電子秒表

15()件文頭?(定義無符號字符型變量 t—-中斷次數計數器,并賦初值0(定義無符號字符型變量 second—-秒計數器,并賦初值 0(定義位于 ROM 區得無符號字符型數組table-—顯示字模)timer0()

(中斷函數關鍵詞){ ?()0T 閉關?(初值重裝載 0x3cb0)

()1增器數計數次斷中? {)02==t(fi??

?

// 秒1于當相,次 02斷中若?

;0=t???????? //中斷次數計數器清零 ?

;++dnoces?? ? // 零清器數計秒?

}()零清,06 到達值器數計秒若??()值示顯得 dnoces 量變出輸別分口 2P與0P?()0T動啟??} main(){

?

;]01/dnoces[elbat=0P?? // 值示顯出輸別分口 2P 與 0P?

;]01%dnoces[elbat=2P?(定義T0 定時方式 1—-TMOD)05()0LT與0HT——載加0bc3x0值初出溢 sm?()AE,0TE——化始初斷中?(啟動 T0)

(死循環)3、編程思路及C1 51 源程序: :

4、仿真運行效果:

5、實驗小結 :

本次實驗進行得比較順利,根據指導材料中提供得流程圖完成了源程序得編 寫,成功生成了、hex文件,經過仿真運行達到了預期得實驗結果.通過本次得 實驗,我更加深入得了解到單片機定時/計數功能實現得機理,通過與單片機中 斷功能得結合,可以完成更多得預期功能。但就是進過討論我也發現,程序還就是存 在很大得缺陷,想要實現更加準確實現計時功能還需綜合利用各種知識完善程 序。

第三篇:單片機實驗報告

《單片機原理及應用》

實 驗 報 告

2017—2018學年第一學期

班級: 152 專業: 電子科學與技術 姓名: 子路 學號: 教師:

實驗一:Keil C51

一、實驗目的

1、熟悉Keil C51單片機應用開發系統

2、熟悉Keil C51的調試技巧

二、實驗內容

1、安裝好了Keil軟件以后,我們打開它。打開以后界面如下:

2、我們先新建一個工程文件,點擊“Project->New Project?”菜單,如下圖:

3、選擇工程文件要存放的路徑 ,輸入工程文件名 LED, 最后單擊保存.4、在彈出的對話框中選擇 CPU 廠商及型號

5、選擇好 Atmel 公司的 AT89S52 后 , 單擊確定

6、在接著出現的對話框中選擇“是”。

7、新建一個 C51 文件 , 單擊左上角的 New File 如下圖所示:

8、保存新建的文件,單擊SAVE如下圖:

9、在出現的對話框中輸入保存文件名MAIN.C(注意后綴名必須為.C),再單擊“保存”,如下圖:

10、保存好后把此文件加入到工程中方法如下 : 用鼠標在 Source Group1 上單擊右鍵 , 然后再單擊 Add Files to Group ‘Source Group 1' 如下圖:

11、選擇要加入的文件 , 找到 MAIN.C 后 , 單擊 Add, 然后單擊 Close

12、在編輯框里輸入如下代碼:

13、到此我們完成了工程項目的建立以及文件加入工程 , 現在我們開始編譯工程如下圖所示 : 我們先單擊編譯, 如果在錯誤與警告處看到 0 Error(s)表示編譯通過:

14、生成.hex 燒寫文件,先單擊Options for Target,如圖:

15、在下圖中,我們單擊 Output, 選中 Create HEX F。再單擊“確定”

16、打開文件夾‘實驗1’,查看是否生成了HEX文件。如果沒有生成,在執行

一遍步驟10到步驟12,直到生成。

三、實驗工具(軟件、硬件等)

1、Keil

2、計算機

實驗二:Proteus軟件學習

一、實驗目的

1、了解Proteus的基本功能

2、熟悉Proteus的設計環境Preoteus ISIS及第三方編譯工具Keil

3、掌握Proteus中實現單片機系統設計與仿真的步驟與方法

二、實驗內容

設計與仿真的開發過程

Proteus強大的單方機系統設計與仿真功能,使之成為單片機系統應用開發和改進手段之一。

開發的整個過程都是在計算機上完成的,其過程一般分為三步: 1)Proteus 電路設計:在ISIS平臺上進行單片機系統電路設計、選擇元器件、接插件、連接電路和電氣現則檢查等。

2)Proteus 源程序設計和生成目標代碼文件:在ISIS平臺上或借助第三方編譯工具進行單片機系統程序設計、編輯、匯編編譯、代碼級調試,最后生成目標代碼文件(*hex)。

3)Proteus仿真:在ISIS平臺上將目標代碼文件加載到單片機系統中,由此實現系統實時交互與協同傷真。

三、實驗工具(軟件、硬件等)

1、載有Proteus的計算機一臺

實驗三:LED流水燈

一、實驗目的

1、用Keil軟件編寫程序并利用開發板仿真

2、學習LED燈工作原理

二、實驗內容

延時實現LED流水燈效果P2口八個燈作跑馬燈。采用了寄存器存中間數。

三、實驗工具(軟件、硬件等)1.載有Keil軟件的計算機一臺 2.開發板一套

四、實驗結果及分析

實驗四:靜態數碼管

一、實驗目的

1、用Keil軟件編寫程序并利用開發板仿真

2、學習靜態顯示管工作原理

二、實驗內容

靜態數碼管流動顯示0~9

二、實驗工具(軟件、硬件等)1.載有Keil軟件的計算機一臺 2.開發板一套

四、實驗結果及分析

實驗五:按鍵移位動態顯示

一、實驗目的

1、用Keil軟件編寫程序并利用開發板仿真

2、學習靜態顯示管工作原理

二、實驗內容

靜態顯示管,按鍵不同顯示不同

三、實驗工具(軟件、硬件等)1.載有Keil軟件的計算機一臺 2.開發板一套

四、實驗結果及分析

實驗六:中斷INT0+INT1

一、實驗目的

1、用Keil軟件編寫程序并利用開發板仿真

2、學習中斷INT0和INT1的工作原理

二、實驗內容

試驗數碼管上顯示外部中斷計數,用單片機腳直接控制數碼管和外部中斷使用

三、實驗工具(軟件、硬件等)1.載有Keil軟件的計算機一臺 2.開發板一套

四、實驗結果及分析

第四篇:單片機實驗報告

目錄

第一章單片機簡介....................................................2 第二章

實驗要求..................................................3 第三章實驗設備......................................................3 第四章實驗安排......................................................4 第五章實驗內容......................................................4

LED燈實驗.......................................................4 步進馬達試驗....................................................5 獨立按鍵控制LED實驗............................................7 矩陣鍵盤實驗....................................................9 靜態數碼管實驗.................................................12 動態數碼管實驗.................................................14 NE555脈沖發生器實驗(定時/計數器).............................16 RS232串口通信實驗(接收與發送)..................................21 第六章收獲體會.....................................................25

單片機實驗報告

第一章單片機簡介

單片機也被稱為微控制器(Microcontroller),是因為它最早被用在工業控制領域。單片機由芯片內僅有CPU的專用處理器發展而來。最早的設計理念是通過將大量外圍設備和CPU集成在一個芯片中,使計算機系統更小,更容易集成進復雜的而對體積要求嚴格的控制設備當中。INTEL的Z80是最早按照這種思想設計出的處理器,從此以后,單片機和專用處理器的發展便分道揚鑣。單片機是靠程序運行的,并且可以修改。通過不同的程序實現不同的功能,尤其是特殊的獨特的一些功能,這是別的器件需要費很大力氣才能做到的,有些則是花大力氣也很難做到的。一個不是很復雜的功能要是用美國50年代開發的74系列,或者60年代的CD4000系列這些純硬件來搞定的話,電路一定是一塊大PCB板!但是如果要是用美國70年代成功投放市場的系列單片機,結果就會有天壤之別!只因為單片機的通過你編寫的程序可以實現高智能,高效率,以及高可靠性!

單片機誕生于20世紀70年代末,經歷了SCM、MCU、SoC三大階段。

1.SCM即單片微型計算機(Single Chip Microcomputer)階段,主要是尋求最佳的單片形態嵌入式系統的最佳體系結構。“創新模式”獲得成功,奠定了SCM與通用計算機完全不同的發展道路。在開創嵌入式系統獨立發展道路上,Intel公司功不可沒。

2.MCU即微控制器(Micro Controller Unit)階段,主要的技術發展方向是:不斷擴展滿足嵌入式應用時,對象系統要求的各種外圍電路與接口電路,突顯其對象的智能化控制能力。它所涉及的領域都與對象系統相關,因此,發展MCU的重任不可避免地落在電氣、電子技術廠家。從這一角度來看,Intel逐漸淡出MCU的發展也有其客觀因素。在發展MCU方面,最著名的廠家當數Philips公司。

Philips公司以其在嵌入式應用方面的巨大優勢,將MCS-51從單片微型計算機迅速發展到微控制器。因此,當我們回顧嵌入式系統發展道路時,不要忘記Intel和Philips的歷史功績。

3.單片機是嵌入式系統的獨立發展之路,向MCU階段發展的重要因素,就是尋求

單片機實驗報告

應用系統在芯片上的最大化解決;因此,專用單片機的發展自然形成了SoC化趨勢。隨著微電子技術、IC設計、EDA工具的發展,基于SoC的單片機應用系統設計會有較大的發展。因此,對單片機的理解可以從單片微型計算機、單片微控制器延伸到單片應用系統。

MCS51系列微控制器應用廣泛,在家電、汽車甚至航空等領域都有其活躍的身影。然而,普通51系列微控制器內部資源有限,像我用Proteus構建微控制器虛擬實驗室選用的AT89C52只有三個定時器、一個全雙工的串行口和中斷控制,并且其數據處理能力有限,不適合對大量數據進行復雜分析和運算。

因此,在不重新選型(可選用SoC)的前提下,為實現我們所需要的功能,就需要進行外圍擴展。針對微控制器的特點,我們首先考慮串行擴展,因為微控制器的I/O引腳有限,并行擴展一則外圍芯片面積比較大,二則對抑制EMI不利。

第二章 實驗要求

1.學習Keil C51集成開發工具的操作及調試程序的方法,包括:仿真調試與脫機運行間的切換方法

2.熟悉TD-51單片機系統板及實驗系統的結構及使用

3.進行MCS51單片機指令系統軟件編程設計與硬件接口功能設

4. 學習并掌握Keil C51軟件聯機進行單片機接口電路的設計與編程調試

5.完成指定MCS51單片機綜合設計題

第三章實驗設備

1.HC600S-51單片機開發板 2.Keil C51 3.普中自動下載軟件

第四章 實驗安排

1.LED燈實驗

單片機實驗報告

2.步進馬達試驗

3.獨立按鍵控制LED實驗 4.矩陣鍵盤實驗 5.靜態數碼管實驗 6.動態數碼管實驗

7.NE555脈沖發生器實驗(定時/計數器)8.RS232串口通信實驗(接收與發送)

第五章 實驗內容

一、LED燈實驗

1.基本要求

利用位移循環指令實現LED燈的閃爍 2.實驗內容

在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖

4.電路原理圖

單片機實驗報告

5.程序

#include #define uint unsigned int void d(uint x){uint n;for(;x>0;x--){for(n=0;n<123;n++){;} }}

main(){unsigned int i;while(1)

{for(i=0,P0=1;i<4;i++){d(500);P0=(P0<<2);}}}

二、步進馬達試驗

1.基本要求

編程實現馬達的正反轉,調速等功能 2.實驗內容

在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖(圖一)

單片機實驗報告

圖一 圖二

4.電路原理圖

上圖圖二 5.程序

#include “reg52.h” #define speed 2 sbit PH1 = P1^0;

//定義管腳 sbit PH2 = P1^1;sbit I01 = P1^2;sbit I11 = P1^3;sbit I02 = P1^4;sbit I12 = P1^5;

void delay(int time);

void Go(){ //A

PH1 = 0;//PH1為0 則A線圈為反向電流

I01 = 0;I11 = 0;

//以最大電流輸出

PH2 = 0;//PH2為0 則B線圈為反向電流

I02 = 1;I12 = 1;

//輸出0 delay(speed);//圈為反向電流

I01 = 1;//輸出0 I11 = 1;

PH2 = 1;//PH2為1 則B線圈為正向電流

I02 = 0;//以最大電流輸出

I12 = 0;

delay(speed);//B PH1 = 1;

//PH1為1 則A線圈為

正向電流

I01 = 0;

//以最大電流輸出

I11 = 0;

PH2 = 1;//PH2為1 則B線圈為正

向電流

I02 = 1;//輸出0 I12 = 1;

delay(speed);

PH1 = 1;

//PH1為1 則A線圈為正向電流

I01 = 1;I11 = 1;

PH2 = 0;

//PH2為0 則B線圈為反向電流

I02 = 0;I12 = 0;delay(speed);}

void delay(int time){

int i,j;

for(j=0;j <= time;j++)

for(i =0;i <= 120;i++);}

void main(){

while(1)

{

Go();//步進電機運行

} }

單片機實驗報告

三、獨立按鍵控制LED實驗

1.基本要求

通過編程控制8個獨立按鍵分別控制8個LED燈的開關 2.實驗內容

在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖(圖一)

圖一 圖二

4.電路原理圖 上圖圖二 5.程序

#include #include #define GPIO_KEY P1 //獨立鍵盤用

P1口

#define uchar unsigned char #define uint unsigned int

void Delayms(unsigned int c);

//延時10ms uchar Key_Scan();void main(void){

unsigned char ledValue, keyNum;

ledValue = 0x01;

while(1)

{

keyNum = Key_Scan();//掃描鍵

switch(keyNum)

{

case(0xFE):

//返回按

鍵K1的數據

ledValue = 0x01;

break;

單片機實驗報告

case(0xFD):

ledValue = 0x02;

break;case(0xFB):

ledValue = 0x04;

break;case(0xF7):

ledValue = 0x08;

break;case(0xEF):

ledValue = 0x10;

break;case(0xDF):

ledValue = 0x20;

break;case(0xBF):

ledValue = 0x40;

break;case(0x7F):

ledValue = 0x80;

//返回按鍵K2的數據

//返回按鍵K3的數據

//返回按鍵K4的數據

//返回按鍵K5的數據

//返回按鍵K6的數據

//返回按鍵K7的數據

//返回按鍵K8的數據

break;default:

break;

}

GPIO_LED = ledValue;//點亮LED燈

}

}

uchar Key_Scan(void)//鍵盤掃描函數 { uchar i,n=0xff;

if(P1==0xff)goto Scan_r;//無鍵按

下,返回

goto Scan_r;Scan_1:

while(P1!=0xff);//等待鍵釋放

Delayms(10);Scan_r:

return n;}

void Delayms(uint x){

uint n;

for(;x>0;x--)

{

for(n=0;n<123;n++)

{;}

} }

四、矩陣鍵盤實驗

1.基本要求

編程由16個矩陣按鍵控制數碼管顯示相應的數值 2.實驗內容

在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。

3.接線圖

單片機實驗報告

見下圖圖一

圖一 圖二

4.電路原理圖

見上圖圖二 5.程序

#include #define uchar unsigned char #define uint unsigned int #define uint unsigned int #define GPIO_LED P0

uchar ScanKey(void);void Delayms(uint x);main(){ unsigned char ledValue;uchar i;ledValue = 0x01;loop: i = ScanKey();

switch(i)

{ case 0xee:

ledValue = ~0x3F;

break;

case 0xde:

ledValue = ~0x06;

break;

case 0xbe:

ledValue = ~0x5B;

break;

case 0x7e:

ledValue = ~0x4F;

break;

case 0xed:

ledValue = ~0x66;

break;

case 0xdd:

ledValue = ~0x6D;

break;

單片機實驗報告

case 0xbd:

ledValue = ~0x7D;

break;

case 0x7d:

ledValue = ~0x07;

break;

case 0xeb:

ledValue = ~0x7F;

break;

case 0xdb:

ledValue = ~0x6F;

break;

case 0xbb:

ledValue = ~0x77;

break;

case 0x7b:

ledValue = ~0x7C;

break;

case 0xe7:

ledValue = ~0x39;

break;

case 0xd7:

ledValue = ~0x5E;

break;

case 0xb7:

ledValue = ~0x79;

break;

case 0x77:

ledValue = ~0x71;

break;

}

GPIO_LED = ledValue;i=0;goto loop;}

void Delayms(uint x){uint n;for(;x > 0;x--)

{ for(n=0;n<123;n++)

{;}

} }

uchar ScanKey(void)//鍵盤掃描函數 { uchar i,n=0xff;

P1=0xf0;

if(P1==0xf0)goto Scan_r;//無鍵按下,返回

for(i=0,P1=0xfe;i<4;i++)

{ if((P1&0xf0)!=0xf0)

{ Delayms(10);

if((P1&0xf0)!=0xf0)

{ n=

P1;

goto

Scan_1;}

}

P1=(P1<<1)+1;

//掃描下

一行

} goto Scan_r;Scan_1:

單片機實驗報告

P1=0xf0;while((P1&0xf0)!=0xf0);//等待鍵

釋放

Delayms(10);

Scan_r:

P1=0xff;return n;} }

五、靜態數碼管實驗

1.基本要求

編程使數碼管顯示字符0-F 2.實驗內容

在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線框圖(圖一)

圖一

單片機實驗報告

圖二

4.電路原理圖

見上圖圖二 5.程序

#include #define uchar unsigned char #define uint unsigned int void Delayms(uint x);uchar code LED7Code[]=

{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D, ~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};main(){

unsigned int LedNumVal;//定義變量 while(1)

{

// 將字模送到P0口顯示

LedNumVal++;

P0 = LED7Code[LedNumVal%16];

Delayms(1000);

//調用延時程序

}

}

單片機實驗報告

void Delayms(uint x){uint n;for(;x > 0;x--)

{ for(n=0;n<123;n++)

{;}

} }

六、動態數碼管實驗

1.基本要求

編程實現8個數碼管的動態掃描。通過P22、P23、P24控制3-8譯碼器來對數碼管進行位選,通過P0口經過573的驅動控制數碼管的段選,通過P13控制573的使能端,為低電平時573才會有輸出。2.實驗內容

在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖(圖一)

圖一 圖二

單片機實驗報告

圖三

4.電路原理圖

見上圖圖

二、圖三 5.程序

#define uint unsigned int void Dsplay();void Delayms(uint x);uchar mDS[6];uchar code cDsCode[]=

{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};

void main(){ uchar i;

for(i=0;i<6;i++)mDS[i]=i+1;

loop:

Dsplay();

goto loop;}

void Dsplay()//動態掃描顯示

{uchar i;

for(i=0,P2=0x01;i<6;i++)

{ P1=cDsCode[mDS[i]];//輸出段

Delayms(1000);

P2=P2<<1;

//選通下一位

}

P2=0x00;

//關閉位選通 }

void Delayms(uint x){uint n;for(;x > 0;x--)

{ for(n=0;n<123;n++)

{;}

} }

七、NE555脈沖發生器實驗(定時/計數器)

1.基本要求

2.實驗內容

在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖

4.電路原理圖

5.程序

#include #include“lcd.h” #define uchar unsigned char #define uint unsigned int #define ulong unsigned long uchar code EN_CHAR1[16]={“

CYMOMETER

”};uchar code EN_CHAR2[16]={“FREQ:

HZ”};

單片機實驗報告

void TIMER_Configuration();//初始化定時器 ulong Freq;

//用來存放要顯示的頻率值 ulong TimeCount;//用于計算1S鐘的

void main(){ uchar i, freqValue[6];

LcdInit();TIMER_Configuration();for(i=0;i<16;i++){

LcdWriteData(EN_CHAR1[i]);}

LcdWriteCom(0xc0);//第二行顯示

for(i=0;i<16;i++){

LcdWriteData(EN_CHAR2[i]);}

while(1){

if(TR0==0)

//當計數器停下的時候,表明計數完畢

{

Freq = Freq + TL1;

//讀取TL的值

Freq = Freq +(TH1 * 256);//讀取TH的值

LcdWriteCom(0xc8);

//--求頻率的個十百千萬十萬位--//

freqValue[0]='0'+Freq%1000000/100000;

freqValue[1]='0'+Freq%100000/10000;

freqValue[2]='0'+Freq%10000/1000;

freqValue[3]='0'+Freq%1000/100;

freqValue[4]='0'+Freq%100/10;

freqValue[5]='0'+Freq%10;

for(i=0;i<5;i++)//從最高位開始查找不為0的數開始顯示(最低位為0顯示0)

{

if(freqValue[i]==0x30)

{

freqValue[i]=0x20;//若為0則賦值空格鍵

}

else

單片機實驗報告

{

break;

}

}

for(i=0;i<6;i++)

{

LcdWriteData(freqValue[i]);

}

Freq=0;//將計算的頻率清零

TH1=0;//將計數器的值清零

TL1=0;

TR0=1;//開啟定時器

TR1=1;//開啟計數器

} } }

void TIMER_Configuration(){ TMOD=0x51;TH0=0x3C;TL0=0xB0;ET0=1;ET1=1;EA=1;TR0=1;TR1=1;} void Timer0()interrupt 1 { TimeCount++;if(TimeCount==20)//計時到1S {

TR0=0;

TR1=0;

TimeCount=0;

}

//--12MHZ設置定時50ms的初值--// TH0=0x3C;TL0=0xB0;} void Timer1()interrupt 3 {

單片機實驗報告

//--進入一次中斷,表明計數到了65536--// Freq=Freq+65536;

}

#include“lcd.h”

void Lcd1602_Delay1ms(uint c)

//誤差 0us {

uchar a,b;for(;c>0;c--){

for(b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

} #ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時 void LcdWriteCom(uchar com)

//寫入命令 { LCD1602_E = 0;

//使能

LCD1602_RS = 0;

//選擇發送命令

LCD1602_RW = 0;

//選擇寫入

LCD1602_DATAPINS = com;

//放入命令

Lcd1602_Delay1ms(1);//等待數據穩定

LCD1602_E = 1;

//寫入時序

Lcd1602_Delay1ms(5);

//保持時間

LCD1602_E = 0;} #else

void LcdWriteCom(uchar com)

//寫入命令 { LCD1602_E = 0;//使能清零

LCD1602_RS = 0;//選擇寫入命令

LCD1602_RW = 0;//選擇寫入

LCD1602_DATAPINS = com;// Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序

Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);

單片機實驗報告

LCD1602_DATAPINS = com << 4;//發送低四位

Lcd1602_Delay1ms(1);

LCD1602_E = 1;//寫入時序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS

void LcdWriteData(uchar dat)

//寫入數據 { LCD1602_E = 0;//使能清零

LCD1602_RS = 1;//選擇輸入數據

LCD1602_RW = 0;//選擇寫入

LCD1602_DATAPINS = dat;//寫入數據

Lcd1602_Delay1ms(1);

LCD1602_E = 1;

//寫入時序

Lcd1602_Delay1ms(5);

//保持時間

LCD1602_E = 0;} #else void LcdWriteData(uchar dat)

//寫入數據 { LCD1602_E = 0;//使能清零

LCD1602_RS = 1;

//選擇寫入數據

LCD1602_RW = 0;

//選擇寫入

LCD1602_DATAPINS = dat;

Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序

Lcd1602_Delay1ms(5);LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//寫入低四位

Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif #ifndef LCD1602_4PINS void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x38);//開顯示

單片機實驗報告

LcdWriteCom(0x0c);//開顯示不顯示光標

LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//設置數據指針起點 } #else void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x32);//將8位總線轉為4位總線

LcdWriteCom(0x28);//在四位線下的初始化

LcdWriteCom(0x0c);//開顯示不顯示光標

LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//設置數據指針起點 } #endif

八、RS232串口通信實驗(接收與發送)

1.基本要求

a.通過實驗了解串口的基本原理及使用,理解并掌握對串口進行初始化; b.使用串口調試助手(Baud 9600、數據位

8、停止位

1、效驗位無)做為上位機來做收發試驗;

c.利用串口調試助手中字符串輸入進行數據發送,接受窗口顯示收到的數據。2.實驗內容

在Keil C51中進行程序的編寫設計并生成.HEX文件,按照下圖連接電路后將HC600S-51單片機開發板接通電源,按下開關,錄入。打開普中錄入生成.HEX文件,加載程序,觀察實驗結果,如果不正確對程序進行改進后重復此操作。實驗結束后先斷電源再拆線,將元器件歸位后離開。3.接線圖

單片機實驗報告

4.電路原理圖

5.程序

#include #include“lcd.h” unsigned char ChCode[14] = “Received data:”;void UsartConfiguration();void main(){ unsigned char i, receiveData;LcdInit();for(i=0;i<14;i++){

LcdWriteData(ChCode[i]);} UsartConfiguration();while(1){

if(RI == 1)

//查看是否接收到數據

{

receiveData = SBUF;//讀取數據

單片機實驗報告

RI = 0;

//清除標志位

LcdWriteCom(0xC0);

LcdWriteData('0' +(receiveData / 100));

// 百位

LcdWriteData('0' +(receiveData % 100 / 10));// 十位

LcdWriteData('0' +(receiveData % 10));

// 個位

} } } void UsartConfiguration(){ SCON=0X50;

//設置為工作方式1 TMOD=0X20;//設置計數器工作方式2 PCON=0X80;

//波特率加倍

TH1=0XF3;

//計數器初始值設置,注意波特率是4800的TL1=0XF3;TR1=1;

//打開計數器 }

#include“lcd.h”

void Lcd1602_Delay1ms(uint c)

//誤差 0us {

uchar a,b;for(;c>0;c--){

for(b=199;b>0;b--)

{

for(a=1;a>0;a--);

}

}

} #ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時 void LcdWriteCom(uchar com)

//寫入命令 { LCD1602_E = 0;

//使能

LCD1602_RS = 0;

//選擇發送命令

LCD1602_RW = 0;

//選擇寫入

LCD1602_DATAPINS = com;

//放入命令

Lcd1602_Delay1ms(1);//等待數據穩定

LCD1602_E = 1;

//寫入時序

單片機實驗報告

Lcd1602_Delay1ms(5);

//保持時間

LCD1602_E = 0;} #else

void LcdWriteCom(uchar com)

//寫入命令 { LCD1602_E = 0;//使能清零

LCD1602_RS = 0;//選擇寫入命令

LCD1602_RW = 0;//選擇寫入

LCD1602_DATAPINS = com;Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序

Lcd1602_Delay1ms(5);LCD1602_E = 0;Lcd1602_Delay1ms(1);LCD1602_DATAPINS = com << 4;//發送低四位

Lcd1602_Delay1ms(1);LCD1602_E = 1;//寫入時序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif

#ifndef LCD1602_4PINS

void LcdWriteData(uchar dat)

//寫入數據 { LCD1602_E = 0;//使能清零

LCD1602_RS = 1;//選擇輸入數據

LCD1602_RW = 0;//選擇寫入

LCD1602_DATAPINS = dat;//寫入數據

Lcd1602_Delay1ms(1);LCD1602_E = 1;

//寫入時序

Lcd1602_Delay1ms(5);

//保持時間

LCD1602_E = 0;} #else void LcdWriteData(uchar dat)

//寫入數據 { LCD1602_E = 0;

//使能清零

LCD1602_RS = 1;

//選擇寫入數據

LCD1602_RW = 0;//選擇寫入

LCD1602_DATAPINS = dat;

Lcd1602_Delay1ms(1);LCD1602_E = 1;

//寫入時序

Lcd1602_Delay1ms(5);

單片機實驗報告

LCD1602_E = 0;LCD1602_DATAPINS = dat << 4;//寫入低四位

Lcd1602_Delay1ms(1);LCD1602_E = 1;

//寫入時序

Lcd1602_Delay1ms(5);LCD1602_E = 0;} #endif

#ifndef LCD1602_4PINS void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x38);//開顯示

LcdWriteCom(0x0c);//開顯示不顯示光標

LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//設置數據指針起點 } #else void LcdInit()

//LCD初始化子程序 { LcdWriteCom(0x32);//將8位總線轉為4位總線

LcdWriteCom(0x28);//在四位線下的初始化

LcdWriteCom(0x0c);//開顯示不顯示光標

LcdWriteCom(0x06);//寫一個指針加1 LcdWriteCom(0x01);//清屏

LcdWriteCom(0x80);//設置數據指針起點 } #endif

單片機實驗報告

第六章 收獲體會

本次微控制器綜合設計基本上使用了所選微控制器的所有資源,進一步熟悉和加深了對中斷、定時器和串行通信的理解和使用。我覺得軟件實驗就是讓我們初學者熟悉keil的使用,然后復習下匯編的思想和掌握程序的流程,所以軟件實驗可以很快的完成,并且慢慢熟悉調試的強大功能。硬件設計中,仿真讓我很有感觸,感覺蠻好玩的,可以摒棄麻煩的實驗硬件自己在寢室玩而且不受硬件狀態的限制,即便出錯了也不會損壞。當然更重要的是這種好習慣,仿真完后再去在實驗板上驗證會比直接要來的確切而且便捷,至少不要老是去插拔線。在做實驗中在同學指導下我試用C語言來編寫程序,確實發現比匯編語言容易編寫也容易理解,以前的實驗還是有參考資料的習慣,現在什么都開始自己寫感覺還是很有成就感的,當然這是基于程序本身就那么幾行很容易編寫,也不是說參考不好。總而言之,這學期的單片機實驗還是收獲頗豐的。相信在以后的實驗學習實踐工作中都會有個潛移默化的作用的。

第五篇:單片機實驗報告

單片機實驗報告

一、實驗目的

1.熟練使用Keil、Protues兩款軟件 2.通過上機操作,增強個人動手實踐能力 3.加深對理論知識的理解

4.培養運用匯編語言進行初步編寫程序的能力

二、實驗內容

1.將片外RAM3050-306FH中數據轉移至片內70-8FH中。

要求:可以從Keil或Protues上看到RAM的數據轉移結果。2.設計一個外部中斷觸發流水燈系統:當外部中斷來臨時,啟動流水燈,即令P2口的LED輪流循環點亮。

要求:開發板或Prrotues演示

3.將片內存儲器80H中存放的BCD碼轉換為ASCII碼,要求使用表格查詢技術。

要求:在Keil或Protues上看到數據轉換結果。

4.各使用中斷方式和查詢方式設計一個方波發生器,頻率為50HZ。

要求:Protues使軟件間示波器顯示方波。

三、實驗程序

1.將片外RAM3050-306FH中數據轉移至片內70-8FH中

ORG 0000H AJMP MAIN 上電,轉向主程序

ORG 0030H 主程序入口

MAIN: MOV DPTR,#3050H 數據指針指向地址3050H MOV A,#04H 將立即數04H送A寄存器

MOV R0,#20H NEXT: MOVX @DPTR,A INC DPTR 數據指針DPTR自加一

DJNZ R0,NEXT 判斷是否跳轉到NEXT或繼續向下執行

MOV DPTR,#3050H MOV R0,#70H MOV R2,#20H NEXT1: MOVX A,@DPTR MOV @R0,A INC DPTR INC R0 DJNZ R2,NEXT1

SJMP $ 等待

END 2.設計一個外部中斷觸發流水燈系統:當外部中斷來臨時,啟動流水燈,即令P2口的LED輪流循環點亮 ORG 0000H SJMP MAIN 上電,轉向主程序

ORG 0003H 外部中斷0向量入口

AJMP INSER ORG 0030H 主程序入口

MAIN: SETB EX0 SETB IT0

SETB EA CPUHERE: SJMP HERE ORG 0200H INSER: MOV R2,#08H MOV A,#01H NEXT: MOV P2,A LCALL DELAY RL A DJNZ R2,NEXT NEXT或繼續向下執行

RETI DELAY: MOV R3,#0FFH DEL2: MOV R4,#0FFH DEL1: NOP

允許外部中斷0中斷 選擇邊沿觸發方式 開中斷 等待中斷 設置循環次數 賦初值,設置高電平亮 將初值送往P2口 延時 左移一位

判斷循環次數,是否跳轉到中斷返回 延時程序 DJNZ R4,DEL1 DJNZ R3,DEL2 RET END 3.將片內存儲器80H中存放的BCD碼轉換為ASCII碼,要求使用表格查詢技術 ORG 0000H LJMP MAIN ORG 0030H主程序起始地址 MAIN: MOV 80H,#05H 將立即數50H轉送內存單元80H MOV A,80H 將內存單元80H中的內容送寄存器A MOV DPTR,#TAB MOVC A,@A+DPTR A寄存器內容加指針偏移量后送A寄存器 MOV 80H,A RET TAB: DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H 4.1中斷方式產生50HZ方波

ORG 0000H

AJMP MAIN

ORG 0030H 主程序入口 MAIN: MOV TMOD,#10H 設置定時器工作模式為模式1 MOV TH1,#0D8H 裝入T1計數初值

MOV TL1,#0F0H

SETB ET1 開中斷

SETB EA CPU開中斷

SETB TR1 啟動定時器T1 HERE: SJMP HERE 等待中斷 ORG 001BH T1中斷向量地址

CLR TF1 將TF1清零

CPL P2.0 P2.0取反輸出

MOV TH1,#0D8H 重裝初值

MOV TH0,#0F0H

RETI;中斷返回

END 4.2 查詢方式產生50HZ方波

ORG 0000H

AJMP MAIN

ORG 0030H 主程序入口

MAIN: MOV TMOD,#10H 設置定時器的工作模式為模式1 SETB TR1 啟動定時器T1 LOOP: MOV TH1,#0D8H 裝入T1計數初值

MOV TH0,#0F0H JNB TF1,$ T1沒有溢出則等待

CLR TF1

產生溢出,清標志位

CPL P2.0 P2.0取反輸出

SJMP LOOP 循環

END

四、實驗結果截圖

1.2

3.4.1

4.2

下載單片機實驗報告[五篇模版]word格式文檔
下載單片機實驗報告[五篇模版].doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    單片機實驗報告

    實驗四、中斷交通燈實驗 林立強1000850116 一、實驗目的 1、了解MCS-51單片機的組成、中斷原理,中斷處理過程、外部中斷的中斷方式。 2、掌握中斷響應及處理的編程方法。 二......

    單片機實驗報告

    51單片機控制流水燈 目錄 (1)51精簡開發板簡介 (2)實驗目的 (3)實驗內容 (4)元件 (5)原理圖 (6)實驗步驟 (7)主要功能介紹(8)實驗錯誤及分析 (9)調試及程序 (10)系統測試 (11)實驗心得 一、51精簡......

    單片機實驗報告大全

    單片機原理與應用實學校:合肥工業大學 班級:計算機科學與技術 學號: 姓名:驗報告 第一章MC51 單片機原理及應用軟件實驗 實驗1:系統認識實驗 1. 實驗目的 (1)了解ZY15MCU12BC2單片......

    單片機實驗報告

    單片機實驗一 實驗報告 課程名稱: 姓名: 系別: 專業: 年級: 學號: 指導教師: 單片機原理及應用實驗 陳璐 信息系 電氣工程及其自動化 2012級 120712041 李莉 2015 年6 月 25 日......

    單片機實驗報告

    實驗一 uVision2 集成開發環境的使用 一、 實驗目的和要求二、實驗設備與儀器三、實驗內容四、實驗原理、方法與步驟 五、實驗小結:1.簡述生成應用程序的過程。2.記錄程序調試......

    單片機實驗報告4

    單片機實驗報告(實驗一) 一、實驗目的: 1. 掌握stm8的時鐘切換。 2. 熟悉匯編語言的指令系統。 3. 加深對stm8功能的理解,掌握去其使用方法。 二、實驗儀器: stm8s105c6單片機......

    單片機實驗報告[推薦五篇]

    單片機實驗報告 流水燈實驗一 一:實驗目的 1、掌握51單片機如何控制信號輸出。 2、掌握Keil C集成開發環境的使用。3、掌握51開發平臺的使用。 二、實驗內容 在開發板上實現8......

    單片機實驗報告(三)

    實驗報告書 信息工程系 電氣自動化11班姓名:張青日期:2014.10.14 實驗一:完成AT89S51單片機與PC機的RS232串行通信接口電路實物制作。該部分電路可在實物電路板Ⅰ上進行搭建。......

主站蜘蛛池模板: 一本色道久久综合亚州精品蜜桃| av明星换脸无码精品区| 国产一极内射視颍一| 久久精品国产99国产精品澳门| 国产欧美va欧美va香蕉在线观看| 亚洲AV秘?成人久久无码海归| 精品国产成人一区二区| 国产成人久久a免费观看| 免费做a爰片久久毛片a片| 亚洲性视频免费视频网站| 中文国产成人精品久久app| 国产精品久久久久7777按摩| 亚洲av日韩综合一区二区三区| 精品国产乱码久久久久久软件大全| 国产麻豆剧果冻传媒一区| 未满十八18禁止免费无码网站| 国产人妻久久精品二区三区| 国产精品无码av片在线观看播| 中文字幕在线不卡精品视频99| 国产偷国产偷亚洲高清app| 久久天天躁狠狠躁夜夜2020| 交换交换乱杂烩系列yy| 精品一区二区三区四区五区六区| 午夜无码一区二区三区在线观看| 高清粉嫩无套内谢国语播放| 国产激情久久久久影院| 欧美视频区高清视频播放| 国产综合精品| 精品乱码卡1卡2卡3免费开放| 成人一区二区免费中文字幕视频| 久久人妻公开中文字幕| 久久久亚洲精品成人| 日本熟日本熟妇中文在线观看| 日韩 亚洲 欧美 国产 精品| 好男人在线社区www资源| 国产精品99久久久久久猫咪| 韩产日产国产欧产| 东京热人妻系列无码专区| 国产综合久久久久久鬼色| 国产成人精品午夜福利a| 国产精品视频色拍在线视频|