《單片機(jī)原理與實(shí)驗(yàn)教程》課件第7章_第1頁(yè)
《單片機(jī)原理與實(shí)驗(yàn)教程》課件第7章_第2頁(yè)
《單片機(jī)原理與實(shí)驗(yàn)教程》課件第7章_第3頁(yè)
《單片機(jī)原理與實(shí)驗(yàn)教程》課件第7章_第4頁(yè)
《單片機(jī)原理與實(shí)驗(yàn)教程》課件第7章_第5頁(yè)
已閱讀5頁(yè),還剩116頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章基礎(chǔ)實(shí)驗(yàn)

實(shí)驗(yàn)一Keil軟件和ISP在線編程工具使用實(shí)驗(yàn)實(shí)驗(yàn)二數(shù)據(jù)傳送實(shí)驗(yàn)實(shí)驗(yàn)三數(shù)據(jù)轉(zhuǎn)換實(shí)驗(yàn)

實(shí)驗(yàn)四拆字、拼字實(shí)驗(yàn)

實(shí)驗(yàn)五I/O口實(shí)驗(yàn)(發(fā)光二極管實(shí)驗(yàn))實(shí)驗(yàn)六數(shù)碼管實(shí)驗(yàn)實(shí)驗(yàn)七中斷實(shí)驗(yàn)實(shí)驗(yàn)八鍵盤掃描實(shí)驗(yàn)實(shí)驗(yàn)九RS232串口實(shí)驗(yàn)實(shí)驗(yàn)十液晶控制實(shí)驗(yàn)實(shí)驗(yàn)一Keil軟件和ISP在線編程工具使用實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?/p>

(1)掌握Keil軟件的使用方法。

(2)掌握Atmel公司的ISP軟件在線編程的方法。

(3)了解ISP編程器硬件及Keil軟件的軟仿真功能。二、實(shí)驗(yàn)原理

Keil軟件的使用方法參見第5章內(nèi)容,ISP軟件使用和ISP編程器硬件介紹見第6章的有關(guān)內(nèi)容。三、實(shí)驗(yàn)內(nèi)容(1)根據(jù)第5章介紹的Keil軟件的使用方法,打開Keil軟件,建立工程,選擇器件,并將文件保存在相應(yīng)的目錄下。建立新文件時(shí),應(yīng)注意文件的擴(kuò)展名應(yīng)為*.C。將參考程序中的代碼輸入文件、保存、編譯,生成*.HEX文件。(2)對(duì)步驟(1)輸入的程序進(jìn)行軟仿真。(3)將AT89S52實(shí)驗(yàn)平臺(tái)與計(jì)算機(jī)相連(注意下載器的1腳和實(shí)驗(yàn)箱的1腳對(duì)應(yīng))。打開桌面上的AtmelISP在線編程工具,連接實(shí)驗(yàn)平臺(tái)和計(jì)算機(jī)(具體操作參考第6章的ISP編程工具介紹內(nèi)容),將步驟(1)生成的*.HEX文件下載到實(shí)驗(yàn)平臺(tái)。

(4)觀察實(shí)驗(yàn)現(xiàn)象。四、參考程序

1.匯編程序

/*本程序?qū)崿F(xiàn)功能:實(shí)現(xiàn)流水燈功能,LED循環(huán)左移*/

ORG0000H

AJMPMAIN

ORG0030H/*主程序從0030H單元開始*/

MAIN: MOVR4,#08/*左移程序,設(shè)置循環(huán)次數(shù)為8*/

MOVA,#0FEH/*準(zhǔn)備把11111110賦予P0口*/ROUNDLED:

MOVP0,A

RLA

/*左移一位*/

MOVR5,#50/*設(shè)置延遲時(shí)間*/

LCALLDELAY

/*調(diào)用延時(shí)程序,使人能看清楚燈的循環(huán)*/DJNZR4,ROUNDLED/*判斷R5是否循環(huán)了8次*/

LJMPMAINDELAY:

MOVR6,#50/*延遲子程序,總延遲時(shí)間為R5*10ms*/

TT2:

MOVR7,#100

DJNZR7,$

DJNZR6,TT2

DJNZR5,DELAY

RET

END

2.C51語(yǔ)言程序

#include<reg52.h>

#include<intrins.h>

main()

{

unsignedchardigled;

inti;

longintj;

digled=0xfe;

while(1){

for(i=7;i>=0;i--)

/*8位LED顯示*/

{P0=digled;/*點(diǎn)亮LED*/

if((digled&0x80)==0x00)

digled=digled*2;

elsedigled=digled*2+1;/*左移一位*/

for(j=1000;j>0;j--);/*延時(shí)*/

}

}

}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺(tái)、AtmelISP在線編程軟件。六、思考與分析

(1)指出編譯生成的*.HEX文件的路徑、文件的大小,并分析文件的大小與AT89S52的Flash大小之間的關(guān)系。(2)說明如何在軟仿真中觀察變量i、digled的變化。實(shí)驗(yàn)二數(shù)據(jù)傳送實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?/p>

(1)掌握AT89S52存儲(chǔ)器之間的數(shù)據(jù)傳送方法。

(2)掌握指針操作方法。二、實(shí)驗(yàn)原理在Keil環(huán)境中編寫并調(diào)試一個(gè)數(shù)據(jù)傳送程序,同時(shí)完成下面操作:

(1)將AT89S52內(nèi)部RAM的40H~4FH單元中的數(shù)據(jù)送到數(shù)據(jù)存儲(chǔ)器的7E00H~7E0FH單元中;

(2)將數(shù)據(jù)存儲(chǔ)器的7E00H~7E0FH單元中的數(shù)據(jù)送到AT89S52內(nèi)部RAM的50H~5FH中。該實(shí)驗(yàn)無需將程序下載到實(shí)驗(yàn)系統(tǒng)中,只需在Keil環(huán)境中完成仿真即可。實(shí)驗(yàn)參考流程圖如圖7-1所示。

(注意:流程圖中的BP1、BP2、BP3表示斷點(diǎn)。)圖7-1數(shù)據(jù)傳送實(shí)驗(yàn)程序流程圖三、實(shí)驗(yàn)內(nèi)容在Keil環(huán)境下根據(jù)實(shí)驗(yàn)要求編寫程序。在Keil軟仿真環(huán)境下調(diào)試程序,調(diào)試方法如下:

(1)打開仿真軟件中的內(nèi)部數(shù)據(jù)空間和外部數(shù)據(jù)空間,在40H~4FH數(shù)據(jù)單元中分別送數(shù),例如,1,2,3,4……共16個(gè)數(shù)據(jù)。

(2)單步運(yùn)行(斷點(diǎn)設(shè)在BP2,程序運(yùn)行至斷點(diǎn)),檢查外部RAM(7E00H~7E0FH)數(shù)據(jù)是否與40H~4FH數(shù)據(jù)一一對(duì)應(yīng)。

(3)如果程序運(yùn)行不能進(jìn)入某一斷點(diǎn),則應(yīng)用單步、斷點(diǎn)方法分段檢查程序,排除錯(cuò)誤直至正確為止。四、參考程序

1.匯編程序

ORG0000H

AJMPMAIN

MAIN:

MOVR6,#16/*數(shù)據(jù)個(gè)數(shù)*/

MOVR0,#40H/*設(shè)置數(shù)據(jù)首地址*/

TRANDATA1:

/*將40H~4FH單元數(shù)據(jù)送到數(shù)據(jù)存儲(chǔ)器7E00H~

7E0FH單元中*/

MOV@R0,P1/*通過P1口傳送數(shù)據(jù)*/

INCR0/*下一個(gè)地址*/

DJNZR6,TRANDATA1/*直到16個(gè)數(shù)據(jù)送完*/

MOVR6,#16

MOVDPH,#7EH/*設(shè)置存放數(shù)據(jù)的RAM地址*/

MOVDPL,#00H

MOVR0,#40HLOOP:

MOVA,@R0

MOVX@DPTR,A

INCDPTR

INCR0

DJNZR7,LOOPTRANDATA2:

/*數(shù)據(jù)存儲(chǔ)器7E00H~7E0FH單元的內(nèi)容送到內(nèi)部RAM的50H~5FH單元中*/

MOVR1,#50H/*設(shè)置數(shù)據(jù)首地址*/

MOVR7,#16/*數(shù)據(jù)個(gè)數(shù)*/

MOVDPH,#7EH

MOVDPL,#00HLOOP1:

MOVXA,@DPTR

MOV@R1,A

INCDPTR

INCR1

DJNZR7,LOOP1

END

2.C51語(yǔ)言程序

#include<reg52.h>

#include<intrins.h>

main()

{

unsignedchardata*point1;//片內(nèi)存儲(chǔ)器地址指針

unsignedcharxdata*point2;//片外存儲(chǔ)器地址指針

unsignedchari;//個(gè)數(shù)計(jì)數(shù)

point1=0x40;

for(i=0;i<16;i++){*point1=i+1;point1++;} //給以0x40開始的地址賦值1~0x10[JP]

point1=0x40;

point2=0x7E00;for(i=0;i<16;i++)

//將以地址以0x40開始的數(shù)據(jù)送到以0x7E00開始的16個(gè)地址中

{ *point2=*point1;

point1++;

point2++;

}

point1=0x50;

point2=0x7E00;

for(i=0;i<16;i++)//將以地址0x7E00開始的數(shù)據(jù)送到以0x50開始的16個(gè)地址中{ *point1=*point2;

point1++;

point2++;

}

while(1)

{;}

}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件。六、思考與分析(1)試編寫將外部的數(shù)據(jù)存儲(chǔ)區(qū)6030H~607FH的內(nèi)容寫入外部RAM的0x3030~0x307FH單元中的程序。(2)說明在C51語(yǔ)言中對(duì)地址操作的方法。實(shí)驗(yàn)三數(shù)據(jù)轉(zhuǎn)換實(shí)驗(yàn)

一、實(shí)驗(yàn)?zāi)康恼莆諗?shù)據(jù)格式轉(zhuǎn)換程序的編寫方法。二、實(shí)驗(yàn)原理編寫并調(diào)試一個(gè)二翻十程序,其功能為將40H,50H兩單元中的二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),并將轉(zhuǎn)換結(jié)果存放在R4,R5,R6單元中。將二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)的方法有多種,此實(shí)驗(yàn)采用先左移二進(jìn)制數(shù),再加倍十進(jìn)制數(shù)并加入二進(jìn)制數(shù)移出位的方法來實(shí)現(xiàn)。具體算法是:先將存放十進(jìn)制數(shù)的3個(gè)單元清0;再將二進(jìn)制數(shù)左移1位,最高位移入進(jìn)位;然后,十進(jìn)制數(shù)存放單元中的BCD碼數(shù)按BCD碼的規(guī)則加倍并加入進(jìn)位;如此連續(xù)移位、加倍、校正,直到所有的二進(jìn)制數(shù)位均移出為止。程序流程圖如圖7-2所示。圖7-2實(shí)驗(yàn)參考流程圖三、實(shí)驗(yàn)內(nèi)容在Keil環(huán)境下根據(jù)實(shí)驗(yàn)要求編寫程序。在Keil軟仿真環(huán)境下調(diào)試程序,調(diào)試方法如下:

(1)斷點(diǎn)設(shè)在BP1,程序運(yùn)行至BP1,檢查40H、50H內(nèi)容是否與輸入值正確對(duì)應(yīng)。

(2)斷點(diǎn)設(shè)在BP2,程序運(yùn)行至BP2,檢查R4、R5、R6內(nèi)容是否為二進(jìn)制數(shù)所對(duì)應(yīng)的十進(jìn)制數(shù)轉(zhuǎn)換結(jié)果。

(3)程序連續(xù)運(yùn)行,若有錯(cuò)誤應(yīng)改用單步或斷點(diǎn)分段調(diào)試程序,排除軟件錯(cuò)誤,直至正確為止。

(4)改動(dòng)40H、50H單元中的內(nèi)容,連續(xù)運(yùn)行以觀察結(jié)果正確與否。四、參考程序

1.匯編程序

ORG0000H

AJMPMAIN

MAIN:

MOV40H,#60H/*將數(shù)據(jù)送到RAM的

40H單元*/

MOV50H,#3CH/*將數(shù)據(jù)送到RAM的

50H單元*/

CLRA

/*清累加器*/

MOVR4,A

/*清存放轉(zhuǎn)換后數(shù)據(jù)的寄存器R4,R5,R6*/

MOVR5,A

MOVR6,A

MOVR7,#16

BITBCD:CLRC/*C清零*/MOVA,50H/*將50H中的內(nèi)容左移1位*/RLCAMOV50H,AMOVA,40H/*將40H中的內(nèi)容左移1位*/RLCAMOV40H,AMOVA,R6/*(R6)+(R6)+(C),和進(jìn)行二—十進(jìn)制調(diào)整,調(diào)整后的BCD碼送R6中*/ADDCA,R6DAAMOVR6,AMOVA,R5/*(R5)+(R5)+(C),和進(jìn)行二—十進(jìn)制調(diào)整,調(diào)整后的BCD碼送R5中*/ADDCA,R5DAAMOVR5,AMOVA,R4/*(R4)+(R4)+(C),和進(jìn)行二—十進(jìn)制調(diào)整,調(diào)整后的BCD碼送R4中*/ADDCA,R4DAAMOVR4,ADJNZR7,BITBCD/*判斷循環(huán)是否完成*/END

2.C51程序假設(shè)2字節(jié)二進(jìn)制數(shù)存放在內(nèi)部RAM的0x35和0x36單元中(0x35放高位),轉(zhuǎn)換結(jié)果存入0x37~0x39這三個(gè)單元中,則C51程序如下:

#include<absacc.h>#defineucharunsignedchar#defineuintunsignedintvoidmain(){uchardata*q;

uintdata*p;

p=0x35;

q=0x3f;

while(q!=0x3A){ *q--=*p%10; *p=*p/10;

}}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件。六、思考與分析

試用C51語(yǔ)言編寫一個(gè)功能和本實(shí)驗(yàn)類似的整數(shù)十翻二子程序。實(shí)驗(yàn)四拆字、拼字實(shí)驗(yàn)

一、實(shí)驗(yàn)?zāi)康?/p>

掌握拆字和拼字程序的編寫方法。二、實(shí)驗(yàn)原理拆字程序:把7000H單元的內(nèi)容拆開,高位送7001H單元的低位,低位送7002H單元的低位,7001H、7002H單元的高位清零。拼字程序:把7000H,7001H單元的低位相拼后,送入7002H單元中。圖7-3(a)為拆字程序的流程圖;圖7-3(b)為拼字程序流程圖。圖7-3實(shí)驗(yàn)參考流程圖三、實(shí)驗(yàn)內(nèi)容在Keil環(huán)境下根據(jù)實(shí)驗(yàn)原理中的實(shí)驗(yàn)要求編寫程序。在Keil軟件仿真環(huán)境下調(diào)試程序,調(diào)試方法如下。拆字程序單步運(yùn)行到BP1,觀察7000H和A單元中的內(nèi)容是否為68;單步運(yùn)行到BP2,觀察7001H單元中的內(nèi)容是否為6;單步運(yùn)行到BP3,觀察7002H單元中的內(nèi)容是否為8。若是,程序?qū)?;若不是,反?fù)修改程序直到正確為止。同理可調(diào)試拼字程序。四、參考程序

1.匯編程序

1)拆字程序

ORG0000H

AJMPMAIN

MAIN:MOVSP,#60H/*設(shè)置堆棧指針為

RAM地址60H*/

MOVDPTR,#7000H/*設(shè)置存放數(shù)據(jù)的地址*/

MOVA,#68

MOVX@DPTR,A/*68送7000H單元*/

MOVXA,@DPTR

INCDPTRPUSHAcc/*將68壓棧*/SWAPA/*高低位交換*/ANLA,#0FH/*屏蔽高4位*/MOVX@DPTR,A/*8送7001H單元的低4位*/INCDPTRPOPAcc/*68出棧*/ANLA,#0FH/*屏蔽高四位*/MOVX@DPTR,A/*6送7002H單元的低4位*/END

2)拼字程序

ORG0000H

AJMPMAIN

MAIN:MOVDPTR,#7000H/*設(shè)置存放數(shù)據(jù)的地址*/

MOVA,#56

MOVX@DPTR,A

/*置7000H單元內(nèi)容為56*/

MOVXA,@DPTR

SWAPA

/*高低位交換*/

ANLA,#0F0H

/*屏蔽低4位*/

MOVR1,A

MOVB,R1

INCDPTRMOVA,#98MOVX@DPTR,A

/*置7000H單元內(nèi)容為98*/MOVXA,@DPTRANLA,#0FH

/*屏蔽高4位*/MOVR2,BORLA,R2INCDPTRMOVX@DPTR,AEND

2.C51語(yǔ)言程序

#include<reg51.h>

#include<stdio.h>

#include<absacc.h>

#include<intrins.h>

main()

{

//拆字程序

XBYTE[0x7000]=0x34;

XBYTE[0x7001]=XBYTE[0x7000]&0x0f; //取低位賦值給0x7001地址

XBYTE[0x7002]=XBYTE[0x7000]>>4; //取高位賦值給0x7002地址

//拼字程序

XBYTE[0x7000]=0x34;

XBYTE[0x7001]=0x56;

//0x7000地址的低位作為0x7002的高位,0x7001地址的低位作為0x7002的低位

XBYTE[0x7002]=((XBYTE[0x7000]&0x0f)<<4)+(XBYTE[0x7001]&0x0f);

while(1) {

;

}}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件。六、思考與分析如何將一個(gè)單元中的內(nèi)容拆開?實(shí)驗(yàn)五I/O口實(shí)驗(yàn)(發(fā)光二極管實(shí)驗(yàn))

一、實(shí)驗(yàn)?zāi)康?/p>

(1)掌握I/O口的編程方法。

(2)掌握Atmel公司ISP軟件的在線編程方法。

(3)了解ISP編程器硬件及Keil軟件的軟仿真功能。二、實(shí)驗(yàn)原理

AT89S52的P0口為8位雙向口,每一位可獨(dú)立定義為輸入、輸出口。CPU對(duì)P0口的操作可以是字節(jié)操作,也可以是位操作。實(shí)驗(yàn)中,P0口接8個(gè)發(fā)光二極管。編寫程序,通過P0口控制發(fā)光二極管(LED)的點(diǎn)亮和熄滅。通過該實(shí)驗(yàn)理解CPU對(duì)P0口的操作和編程方法。實(shí)驗(yàn)平臺(tái)上發(fā)光二極管的控制與其他外設(shè)的控制共用P0口。實(shí)驗(yàn)時(shí)將J17的跳線帽插上即可選擇P0口對(duì)發(fā)光二極管的控制。三、實(shí)驗(yàn)內(nèi)容

(1)將J17上的跳線冒插上,選擇P0口對(duì)8個(gè)發(fā)光二極管控制。

(2)編寫程序使P0口的8個(gè)發(fā)光二極管同時(shí)滅,并延時(shí)0.5s,再同時(shí)亮,反復(fù)循環(huán)。

(3)編寫程序使發(fā)光二極管依次點(diǎn)亮,間隔時(shí)間為0.5s,反復(fù)循環(huán)。循環(huán)點(diǎn)亮程序的流程圖如圖7-4所示。圖7-4循環(huán)點(diǎn)亮軟件流程圖四、參考程序(只完成循環(huán)點(diǎn)亮LED)

1.匯編程序

ORG0000H[KG4]

AJMPMAIN

ORG0030H

/*主程序從0030H單元開始*/

MAIN:

MOVP0,#0FFH

/*通過置位P0使LED燈全不亮*/

MOVR5,#50

/*設(shè)置時(shí)間*/

LCALLDELAY

/*調(diào)用延時(shí)程序*/

MOVR4,#08H

/*左移程序,設(shè)置循環(huán)次數(shù)為8*/

MOVA,#0FEH

/*準(zhǔn)備把11111110賦予P0口,首先存入累加器A中*/RDLED:MOVP0,A

RLA/*左移1位*/

MOVR5,#50/*設(shè)置時(shí)間*/

LCALLDELAY/*調(diào)用延時(shí)程序,使人能看清楚燈的循環(huán)*/DJNZR4,RDLED/*判斷自減后R5是否為0,若是,則順序執(zhí)行下面程序,若不是,則繼續(xù)循環(huán)*/LJMPMAINDELAY:

MOVR6,#50/*延時(shí)子程序,總延遲時(shí)間R5*10ms*/

TT2:

MOVR7,#100

DJNZR7,$

DJNZR6,TT2

DJNZR5,DELAY

RET

END

2.C51語(yǔ)言程序

#include<reg52.h>

#include<intrins.h>

main()

{

unsignedchardigled;

inti;

longintj;

while(1)

{

digled=0xfe;

for(i=7;i>=0;i--)/*8位diglight顯示*/ {P0=digled;

digled=_crol_(digled,1);/*循環(huán)左移1位*/ for(j=5000;j>0;j--);/*延時(shí)*/ }}}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺(tái)、AtmelISP在線編程軟件。

六、思考與分析

(1)說明P0口的操作方法。

(2)說明LED的控制方法,并說明LED是高電平控制還是低電平控制。

(3)修改程序使發(fā)光二極管從左到右顯示。實(shí)驗(yàn)六數(shù)碼管實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康模?)掌握七段LED的顯示原理。(2)掌握LED動(dòng)態(tài)顯示的編程方法。二、實(shí)驗(yàn)原理

關(guān)于LED原理可參考第6章內(nèi)容,實(shí)驗(yàn)箱提供了8位七段數(shù)碼管(LED)顯示電路,8位LED由兩個(gè)4位動(dòng)態(tài)顯示的共陽(yáng)極數(shù)碼管組成。8位數(shù)據(jù)線接到單片機(jī)的P0口,8位片選線接到單片機(jī)的P1口,高電平選擇。操作過程為:選擇相應(yīng)數(shù)碼管(給P1口送數(shù)據(jù)),控制數(shù)碼管的8位數(shù)據(jù)線(給P0口送相應(yīng)數(shù)據(jù)),讀者只要按地址輸出相應(yīng)數(shù)據(jù),就可以實(shí)現(xiàn)對(duì)LED的控制。顯示共有8位,用動(dòng)態(tài)方式顯示。三、實(shí)驗(yàn)內(nèi)容

(1)將撥動(dòng)開關(guān)J3撥在開的位置。(2)根據(jù)給出的程序流程圖(見圖7-5)在Keil編程環(huán)境下編寫程序,在數(shù)碼管上顯示數(shù)字0,1,2,3,并生成*.HEX文件。(3)通過Atmel公司的ISP軟件將生成的*.HEX文件下載到實(shí)驗(yàn)箱的單片機(jī)中,并使實(shí)驗(yàn)箱離線運(yùn)行。圖7-5程序流程圖四、參考程序

1.匯編語(yǔ)言程序

BUFEQU30H/*定義變量,用來存放4位顯示器字型數(shù)據(jù)*/

ORG0000H/*程序由地址0000H開始執(zhí)行*/

AJMPMAIN/*轉(zhuǎn)向主程序*/MAIN:

/*主程序*/MOVA,#0FFHMOVP0,A/*使4位數(shù)碼管不亮*/MOVR2,#4/*計(jì)數(shù)4次*/MOVR0,#BUF/*設(shè)置RAM的變量地址*/MOVR1,#0/*數(shù)碼管數(shù)值索引值*/MOVA,#0FFHMOVP1,AMOVDPTR,#TABLE/*指向字型數(shù)據(jù)數(shù)組*/A1:MOVA,R1MOVCA,@A+DPTR/*取出字型數(shù)據(jù)*/MOV@R0,A

/*字型數(shù)據(jù)放入顯示器緩沖器內(nèi)*/INCR0

/*變量地址加1指到下一位顯示器緩沖器地址*/INCR1

/*索引值加1*/DJNZR2,A1

/*循環(huán)判斷是否繼續(xù)執(zhí)行*/LOOP:LCALLSCAN/*掃描控制顯示器顯示一次*/AJMPLOOP/*一直循環(huán)*/DELAY:/*延遲子程序,總延遲時(shí)間R5*1ms*/MOVR6,#5D1:MOVR7,#100

DJNZR7,$DJNZR6,D1DJNZR5,DELAYRET

TABLE:/*字型數(shù)據(jù)數(shù)組*/DB0C0H,0F9H,0A4H,0B0H,99HDB92H,82H,0F8H,80H,90HSCAN:MOVR0,#BUF/*指向顯示器顯示緩沖區(qū)起始地址*/MOVR2,#4/*循環(huán)執(zhí)行4次*/MOVA,#08H/*加載掃描輸出信號(hào)初值00001000

B*/SS1:MOVR3,AMOVA,@R0/*取出七段顯示數(shù)據(jù)*/MOVP0,A/*由P0口送出1位七段顯示數(shù)據(jù)*/MOVA,R3MOVP1,A/*由P2口送出掃描輸出信號(hào)*/MOVR5,#1H/*延遲時(shí)間設(shè)置*/LCALLDELAYMOVA,R3RRA/*改變掃描碼,使其下一個(gè)數(shù)碼管亮*/

INCR0/*顯示器顯示緩沖區(qū)地址加1*/DJNZR2,SS1/*循環(huán)判斷是否繼續(xù)執(zhí)行*/RETEND

2.C51語(yǔ)言程序

#include<reg52.h>

//動(dòng)態(tài)顯示0、1、2、3

#defineucharunsignedchar

#defineuintunsignedint

ucharDisbuf[10]={0,1,2,3};//顯示的4位數(shù)值表uchartab[]={0xc0,0xf9,0xa4,0xb0,/*01234*/

0x99,0x92,0x82,0xf8,0x80,0x90};/*56789*/

voiddelay(uinti)

{while(i--);}

voidmain(){

uchari=0,npos=0x01;

while(1)

{

for(i=0;i<4;i++)//4位數(shù)碼管顯示

{

P1=npos;//使能位

npos<<=1;//移位

P0=tab[Disbuf[i]];//查表顯示

delay(400);//延時(shí)

}

npos=0x01;

}

}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺(tái)、AtmelISP在線編程軟件。六、思考與分析

(1)說明動(dòng)態(tài)顯示數(shù)碼管和靜態(tài)顯示數(shù)碼管的區(qū)別。

(2)修改C語(yǔ)言程序?yàn)槎〞r(shí)器工作方式,顯示定時(shí)為100ms,每位數(shù)碼管顯示10ms。實(shí)驗(yàn)七中斷實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?/p>

(1)掌握中斷程序的編程方法。

(2)了解蜂鳴器的控制方法。二、實(shí)驗(yàn)原理本實(shí)驗(yàn)主要為了使讀者理解中斷原理和掌握中斷的編程方法。關(guān)于中斷原理可參考第3章的有關(guān)內(nèi)容。本實(shí)驗(yàn)通過外部中斷1所接的輕觸開關(guān)打開或關(guān)斷蜂鳴器,循環(huán)點(diǎn)亮跑馬燈。三、實(shí)驗(yàn)內(nèi)容

(1)接通J18(控制蜂鳴器跳線)和J17(控制8位跑馬燈跳線)。(2)在Keil編譯環(huán)境下,根據(jù)流程圖(圖7-6)編寫程序,生成*.HEX文件。(3)在ISP環(huán)境下將生成的*.HEX文件下載到AT89S52中。(4)離線運(yùn)行,觀察運(yùn)行結(jié)果。圖7-6中斷流程圖四、參考程序

1.匯編程序

BEEPEQUP3.4[KG6]/*定義蜂鳴器*/

ORG0000H

AJMPMAIN

ORG0013H

LJMPINT1PRM/*轉(zhuǎn)向外部中斷1服務(wù)子程序*/MAIN:SETBIT1

/*下降沿觸發(fā)*/MOVIE,#84H/*中斷控制寄存器設(shè)置*/WAIT:AJMP$

/*等待中斷發(fā)生*/INT1PRM:CPLBEEP

/*蜂鳴器取反*/CLRCMOVA,#0FFH/*準(zhǔn)備把11111110賦予P0口,首先存入累加器A中*/MOVR5,#09H/*設(shè)置循環(huán)次數(shù)為9*//*左移程序*/XUNH:

/*流水燈子程序*/

RLCA

/*左移一位*/

MOVP0,A

ACALLDELAY/*調(diào)用延時(shí)程序,使人能看清楚燈的循環(huán)*/

DJNZR5,XUNH/*判斷自減后R5是否為0,若是,則跳回按鍵判斷程序,若不是,則繼續(xù)循環(huán)*/

RETIDELAY:MOVR6,#0FFH/*延時(shí)程序*/TT2:MOVR7,#0FFH

DJNZR7,$DJNZR6,TT2RETEND

2.C51語(yǔ)言程序

#include<reg52.h>

sbitBeep=P3∧4;//蜂鳴器

unsignedchartime;

main()

{P3=0xff;

EX1=1; //外部中斷1允許位

IT1=1;//下降沿觸發(fā)

EA=1; //開總中斷

Beep=0x00;

while(1)

{;}

}voidinttrer()interrupt2{unsignedinti,j;

Beep=~Beep; //蜂鳴器取反

time=0x01;

for(i=0;i<8;i++)//digitled控制跑馬燈輪流亮

{P0=~time;

time=time<<1;

for(j=5000;j>0;j--){;}}}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺(tái)、AtmelISP在線編程軟件。六、思考與分析(1)描述中斷處理過程。(2)將程序改寫成查詢方式,要求能達(dá)到同樣的程序效果,并說明中斷和查詢的區(qū)別。實(shí)驗(yàn)八鍵盤掃描實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康模?)掌握鍵盤掃描的編程方法。(2)掌握LED動(dòng)態(tài)顯示的方法二、實(shí)驗(yàn)原理無論是單片機(jī)控制系統(tǒng)還是單片機(jī)測(cè)量系統(tǒng),都需要一個(gè)人機(jī)對(duì)話裝置,這種人機(jī)對(duì)話裝置通常采用鍵盤和顯示器。鍵盤是單片機(jī)應(yīng)用系統(tǒng)中人機(jī)對(duì)話常用的輸入裝置,而顯示器是單片機(jī)應(yīng)用系統(tǒng)中人機(jī)對(duì)話常用的輸出裝置。鍵盤是由若干個(gè)按鍵開關(guān)組成的,鍵的多少根據(jù)單片機(jī)應(yīng)用系統(tǒng)的用途而定。鍵盤由許多鍵組成,每個(gè)鍵相當(dāng)于一個(gè)機(jī)械開關(guān)觸點(diǎn),當(dāng)鍵按下時(shí),觸點(diǎn)閉合,當(dāng)鍵松開時(shí),觸點(diǎn)斷開。單片機(jī)接收到按鍵的觸點(diǎn)信號(hào)后作相應(yīng)的功能處理。因此,對(duì)于單片機(jī)系統(tǒng)來說鍵盤接口信號(hào)是輸入信號(hào)。單片機(jī)的鍵盤接口分為獨(dú)立式和矩陣式。獨(dú)立式鍵盤的每個(gè)按鍵都有一個(gè)信號(hào)線與單片機(jī)電路相連,所有按鍵有一個(gè)公共地或公共正端,每個(gè)鍵相互獨(dú)立互不影響。如圖7-7所示,當(dāng)按下鍵1時(shí),無論其他鍵是否按下,鍵1的信號(hào)線均由1變0;當(dāng)松開鍵1時(shí),無論其他鍵是否按下,鍵1的信號(hào)線均由0變1。圖7-7獨(dú)立式按鍵原理圖矩陣式鍵盤的按鍵觸點(diǎn)接于由行、列母線構(gòu)成的矩陣電路的交叉處,每當(dāng)一個(gè)按鍵按下時(shí)通過該鍵將相應(yīng)的行、列母線連通。若在行、列母線中把行母線逐行置0(一種掃描方式),那么列母線就用來作信號(hào)輸入線。矩陣式鍵盤的原理圖如圖7-8所示。圖7-8矩陣式按鍵原理圖針對(duì)以上兩大類鍵盤的工作方式,單片機(jī)又有三種鍵盤掃描方式:查詢方式、定時(shí)掃描方式和中斷掃描方式。查詢方式是指在程序中用一段專門的掃描和讀按鍵程序不停地查詢有無按鍵按下,確定鍵值。這種方式電路簡(jiǎn)單,但需要占用單片機(jī)的機(jī)器時(shí)間。定時(shí)掃描方式是指利用單片機(jī)內(nèi)的定時(shí)器來產(chǎn)生定時(shí)中斷,然后在定時(shí)中斷的服務(wù)程序中掃描,檢查有無鍵按下,并確定鍵值。這種方式的電路也比較簡(jiǎn)單,不占用單片機(jī)的機(jī)器時(shí)間,但需要占用一個(gè)定時(shí)器,同時(shí)定時(shí)的時(shí)間不能過長(zhǎng),否則可能檢測(cè)不到相應(yīng)的按鍵。中斷掃描方式是指當(dāng)有鍵按下時(shí)由相應(yīng)的硬件電路產(chǎn)生中斷信號(hào),單片機(jī)在中斷服務(wù)程序中掃描,檢查有無鍵按下,并確定鍵值。這種方式硬件電路上必須要產(chǎn)生中斷線,這需要通過與門和非門來產(chǎn)生,但中斷方式不占用單片機(jī)的機(jī)器時(shí)間,也不會(huì)出現(xiàn)采用定時(shí)方式時(shí)的檢測(cè)不到鍵盤的情況。另外,在掃描鍵盤時(shí)需處理鍵盤抖動(dòng)問題,稱為去抖。一般去抖可以采用軟件方式完成,操作方法是,當(dāng)檢測(cè)到有鍵按下時(shí),等待10ms左右時(shí)間,如果此按鍵仍然保持按下的狀態(tài),則確認(rèn)此次按鍵,如果在100ms內(nèi)連續(xù)檢測(cè)到此按鍵按下,則不確認(rèn)第二次按下的鍵。鍵盤掃描程序流程圖如圖7-9所示。圖7-9鍵盤掃描程序流程圖本實(shí)驗(yàn)系統(tǒng)中的鍵盤在硬件上采用查詢方式工作,鍵盤采用矩陣鍵盤,有16個(gè)按鍵,見第6章的實(shí)驗(yàn)箱硬件資料。三、實(shí)驗(yàn)內(nèi)容(1)根據(jù)圖7-9所示流程圖在Keil編譯環(huán)境下編寫程序,生成*.HEX文件,要求任意按下鍵盤時(shí),能在LED上將按下的鍵所對(duì)應(yīng)的十六進(jìn)制數(shù)顯示出來。(2)通過ISP軟件將生成的*.HEX文件下載到單片機(jī)當(dāng)中。(3)將撥動(dòng)開關(guān)K1撥到“on”的位置,離線運(yùn)行程序,觀察實(shí)驗(yàn)現(xiàn)象,看是否滿足要求,不滿足實(shí)驗(yàn)要求時(shí),檢查實(shí)驗(yàn)代碼。四、參考程序

1.匯編程序

FKEYEQU20H.0/*按鍵標(biāo)志*/

KEYNUMEQU30H/*按鍵編號(hào)變量*/

ORG0000H

AJMPMAINMAIN:

ACALLKEYET

MOV@R0,A

MOVA,@R0

MOVP0,A

AJMPMAINTABLE:/*字型數(shù)據(jù)數(shù)組*/

DB0C0H,0F9H,0A4H,0B0H

DB99H,92H,82H,0F8H

DB80H,90H,88H,83H

DB0C6H,0A1H,86H,8EHKEYET:

CLRFKEY/*清除按鍵標(biāo)志*/

ACALLSCAN/*執(zhí)行按鍵掃描*/

JBFKEY,G1/*測(cè)試按鍵標(biāo)志*/

AJMPKEYET/*若沒有按鍵則等待按鍵*/DELAY:/*延遲子程序*/

MOVR6,#50/*總延遲時(shí)間R5*10ms*/D1:MOVR7,#100

DJNZR7,$

DJNZR6,D1

DJNZR5,DELAY

RET

G1:

ACALLSCAN/*執(zhí)行按鍵掃描*/

JBFKEY,G1/*等待按鍵放開*/

MOVA,KEYNUM

MOVDPTR,#TABLE/*找出按鍵碼*/

MOVCA,@A+DPTR

RETSCAN:

/*鍵盤掃描控制程序*/MOVR3,#0FEH/*加載掃描,輸出信號(hào)初值

11111110B*/

MOVR4,#0/*按鍵計(jì)數(shù)標(biāo)號(hào)清除為0*/

MOVR1,#4/*循環(huán)1執(zhí)行4次*/

CLRPSW.5/*PSW.5=0,表示未按鍵*/L1:

MOVA,R3

MOVP2,A/*由P2口送出掃描輸出信號(hào)*/

MOVR5,#1

ACALLDELAY

MOVA,P2/*讀取P2口數(shù)據(jù),以便判斷是否有按鍵*/

ANLA,#0F0H

MOVR2,#4L2:

JBACC.4,N1/*累加器A第4位若為1,表示沒按鍵*/

MOVKEYNUM,R4/*加載按鍵編號(hào)*/

SETBPSW.5/*按鍵標(biāo)志設(shè)為1*/

N1:

INCR4/*按鍵編號(hào)加1*/

RRA/*檢查下一位*/

DJNZR2,L2

MOVA,R3/*加載舊的掃描碼*/

RLA

MOVR3,A

DJNZR1,L1BACK:

JNBPSW.5,NO_KEY/*設(shè)置是否按鍵*/

SETBFKEY/*若有按鍵,則FKEY=1*/

RET

NO_KEY:

CLRFKEY

RET

END2.

C51語(yǔ)言程序

#include<reg52.h>

#defineucharunsignedchar

#defineunitunsignedint

voiddelay();

ucharkeyscan();

unitj,h;

voidmain()

{ucharkey;

P1=0xff;[KG15]/*數(shù)碼管使能*/

while(1)

{

key=keyscan(); /*鍵盤值返回*/

delay();

switch(key) /*判斷鍵值*/

{case0xee:P0=0xc0;break; /*0~F的鍵值*/case0xde:P0=0xf9;break;case0xbe:P0=0xa4;break;case0x7e:P0=0xb0;break;case0xed:P0=0x99;break;case0xdd:P0=0x92;break;case0xbd:P0=0x82;break;case0x7d:P0=0xf8;break;case0xeb:P0=0x80;break;case0xdb:P0=0x90;break;case0xbb:P0=0x88;break;case0x7b:P0=0x83;break;case0xd7:P0=0xa1;break;case0xb7:P0=0x86;break;case0x77:P0=0x8e;break;case0x00:P0=0xc1;break;}

}

}

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

voiddelay() /*延時(shí)*/

{

unsignedinti;

for(i=8000;i>0;i--);

}

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

ucharkeyscan() /*鍵盤掃描*/{

while(1)

{

P2=0xff; /*P2口拉高*/

P2=0xfe; /*第一行置低*/

if((P2&0xff)!=0xfe)/*判斷是否有鍵按下*/{

delay(); /*去抖動(dòng)*/

if((P2&0xff)!=0xfe)

returnP2; /*返回鍵值*/

elseP2=0xfd;

}

elseP2=0xfd; /*第二行置低*/if((P2&0xff)![KG-*3]=0xfd)

{

delay();

if((P2&0xff)![KG-*3]=0xfd)

returnP2;

elseP2=0xfb;

}

elseP2=0xfb; /*第三行置低*/

if((P2&0xff)!=0xfb){

delay();

if((P2&0xff)!=0xfb)

returnP2;

elseP2=0xf7;

}

elseP2=0xf7;/*第四行置低*/

if((P2&0xff)!=0xf7)

{

delay();

if((P2&0xff)!=0xf7)

returnP2;

elsereturnP2=0xfe;

}

} }五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺(tái)、AtmelISP在線編程軟件。六、思考與分析

(1)說明查詢方式的工作原理。

(2)說明中斷方式和查詢方式的優(yōu)缺點(diǎn)。實(shí)驗(yàn)九RS232串口實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?/p>

(1)掌握RS232串行通信的基本原理。(2)掌握RS232串口的程序設(shè)計(jì)方法。(3)了解PC端的串口調(diào)試工具。二、實(shí)驗(yàn)原理

關(guān)于單片機(jī)串口工作原理請(qǐng)讀者參考第2章的有關(guān)內(nèi)容。實(shí)驗(yàn)箱上的串口資源原理圖請(qǐng)參考附錄B或第6章的有關(guān)內(nèi)容。三、實(shí)驗(yàn)內(nèi)容在單片機(jī)上實(shí)現(xiàn)與PC機(jī)的通信。(1)通過PC機(jī)的串口調(diào)試工具發(fā)送數(shù)據(jù),發(fā)送的數(shù)據(jù)在LED上顯示,同時(shí)應(yīng)答PC機(jī)的“OK”信息。根據(jù)程序要求在Keil編譯環(huán)境下編寫程序,生成*.HEX文件。(2)通過ISP軟件將程序下載到單片機(jī)中,運(yùn)行程序。(3)通過串口調(diào)試工具發(fā)送“55”,觀察實(shí)驗(yàn)箱上的顯示結(jié)果和串口調(diào)試工具的應(yīng)答信息。程序流程圖如圖7-10所示。圖7-10串口流程圖四、參考程序

//功能:通過串口工具發(fā)送2位數(shù)據(jù),將其轉(zhuǎn)換成十進(jìn)制數(shù)后,在LED上顯示,并發(fā)回應(yīng)答信號(hào)//

#include<reg52.h>

#defineucharunsignedchar

#defineunitunsignedint

uchardispbuf[]={0,0,0,0};

ucharsendbuf[]={0,0};

ucharrec_data[]={0,0};

unitj,h;

ucharcgf2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//共陽(yáng)極LED對(duì)應(yīng)的段碼為0~9voiddelay(unsignedinti)

{

while(i--);

}

voidDispbuf(unsignedinttemper) //轉(zhuǎn)換程序

{

dispbuf[3]=temper/1000;

dispbuf[2]=(temper%1000)/100;

dispbuf[1]=(temper%100)/10;

dispbuf[0]=temper%10;

}

voidscomre(unsignedcharB0,unsignedcharB1) //應(yīng)答回信號(hào)

{unsignedchark;

k=0;

sendbuf[0]=B0;

sendbuf[1]=B1;

while(k<2)

{

SBUF=sendbuf[k];

while(TI==0);

TI=0;

k++;

}

delay(200);

}

main()

{

uchari,rec_data,npos=0x01,flag=0;

TMOD=0x20;

//定時(shí)器1初始化,方式2

TL1=0xf4;TH1=0xf4;//波特率為2400b/s,晶振為11.0592MHz

SCON=0x50;

//串口初始化,方式1

TR1=1;

RI=0;

while(1)

{if(RI)//是否有收到信號(hào)

{

rec_data=SBUF;

RI=0; //清接收標(biāo)志

flag=1; //置接收標(biāo)志

}

for(i=0;i<4;i++) //4位動(dòng)態(tài)顯示{

Dispbuf(rec_data);

P1=npos;

npos=1;

P0=cgf2[dispbuf[i]];

delay(500);

}

npos=0x01;

if(flag==1) //接收標(biāo)志置位,發(fā)應(yīng)答信號(hào)

{

scomre(′O′,′K′);//應(yīng)答信號(hào)

flag=0;

}

}

}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺(tái)、

溫馨提示

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

評(píng)論

0/150

提交評(píng)論