51單片機(jī)匯編語言及C語言經(jīng)典實(shí)例.doc_第1頁
51單片機(jī)匯編語言及C語言經(jīng)典實(shí)例.doc_第2頁
51單片機(jī)匯編語言及C語言經(jīng)典實(shí)例.doc_第3頁
51單片機(jī)匯編語言及C語言經(jīng)典實(shí)例.doc_第4頁
51單片機(jī)匯編語言及C語言經(jīng)典實(shí)例.doc_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

51單片機(jī)匯編語言及C語言經(jīng)典實(shí)例實(shí)驗(yàn)及課程設(shè)計(jì)51單片機(jī)匯編語言及C語言經(jīng)典實(shí)例一、閃爍燈如圖1 所示為一簡單單片機(jī)系統(tǒng)原理圖:在 P1.0 端口上接一個(gè)發(fā)光二極管 L1,使 L1 在不停地一亮一滅,一亮一滅的時(shí)間間隔為 0.2 秒。延時(shí)程序的設(shè)計(jì)方法,作為單片機(jī)的指令的執(zhí)行的時(shí)間是很短,數(shù)量大微秒級(jí),因此,我們要求的閃爍時(shí)間間隔為 0.2 秒,相對(duì)于微秒來說,相差太大,所以我們?cè)趫?zhí)行某一指令時(shí),插入延時(shí)程序,來達(dá)到我們的要求,但這樣的延時(shí)程序是如何設(shè)計(jì)呢?下面具體介紹其原理:如圖 4.1.1 所示的石英晶體為 12MHz,因此,1 個(gè)機(jī)器周期為 1 微秒,機(jī)器周期 微秒如圖 1 所示,當(dāng) P1.0 端口輸出高電平,即 P1.01 時(shí),根據(jù)發(fā)光二極管的單向?qū)щ娦钥芍?,這時(shí)發(fā)光二極管 L1 熄滅;當(dāng) P1.0 端口輸出低電平,即 P1.00 時(shí),發(fā)光二極管 L1 亮;我們可以使用 SETB P1.0 指令使 P1.0端口輸出高電平,使用 CLR P1.0 指令使 P1.0 端口輸出低電平。C 語言源程序#include sbit L1=P10;void delay02s(void) /延時(shí) 0.2 秒子程序圖1 單片機(jī)原理圖unsigned char i,j,k;for(i=20;i0;i-)for(j=20;j0;j-)for(k=248;k0;k-); void main(void)while(1)L1=0;delay02s();L1=1;delay02s();匯編源程序ORG 0START: CLR P1.0LCALL DELAY圖2 程序設(shè)計(jì)流程圖SETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延時(shí)子程序,延時(shí) 0.2 秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND 二、多路開關(guān)狀態(tài)指示如圖 3 所示,AT89S51 單片機(jī)的 P1.0P1.3 接四個(gè)發(fā)光二極管 L1L4,P1.4P1.7 接了四個(gè)開關(guān) K1K4,編程將開關(guān)的狀態(tài)反映到發(fā)光二極管上。(開關(guān)閉合,對(duì)應(yīng)的燈亮,開關(guān)斷開,對(duì)應(yīng)的燈滅)。對(duì)于開關(guān)狀態(tài)檢測,相對(duì)單片機(jī)來說,是輸入關(guān)系,我們可輪流檢測每個(gè)開關(guān)狀態(tài),根據(jù)每個(gè)開關(guān)的狀態(tài)讓相應(yīng)的發(fā)光二極管指示,可以采用 JB P1.X,REL或 JNB P1.X,REL 指令來完成;也可以一次性檢測四路開關(guān)狀態(tài),然后讓其指示,可以采用 MOV A,P1 指令一次把 P1 端口的狀態(tài)全部讀入,然后取高 4 位的狀態(tài)來指示。方法1(匯編源程序)ORG 00HSTART: MOV A,P1ANL A,#0F0HRR ARR ARR ARR AORL A,#0F0HMOV P1,ASJMP STARTEND方法1(C語言程序)圖4 程序流程圖#INClude unsigned char temp;void main(void)while(1)temp=P14;temp=temp | 0xf0;P1=temp;方法2(匯編源程序)ORG 00HSTART: JB P1.4,NEXT1CLR P1.0SJMP NEX1圖3 單片機(jī)原理圖NEXT1: SETB P1.0NEX1: JB P1.5,NEXT2CLR P1.1SJMP NEX2NEXT2: SETB P1.1NEX2: JB P1.6,NEXT3CLR P1.2SJMP NEX3NEXT3: SETB P1.2NEX3: JB P1.7,NEXT4CLR P1.3SJMP NEX4NEXT4: SETB P1.3NEX4: SJMP STARTEND方法2(C 語言源程序)#INClude void main(void)while(1)if(P1_4=0)P1_0=0;ElseP1_0=1;if(P1_5=0)P1_1=0;elseP1_1=1;if(P1_6=0)P1_2=0;elseP1_2=1;if(P1_7=0)P1_3=0;else圖5 單片機(jī)原理圖三、廣告燈的設(shè)計(jì)利用取表的方法,使端口 P1 做單一燈的變化:左移 2 次,右移 2 次,閃爍 2 次(延時(shí)的時(shí)間 0.2 秒)。利用 MOV DPTR,DATA16 的指令來使數(shù)據(jù)指針寄存器指到表的開頭。利用 MOVC A,ADPTR 的指令,根據(jù)累加器的值再加上 DPTR 的值,就可以使程序計(jì)數(shù)器 PC 指到表格內(nèi)所要取出的數(shù)據(jù)。因此,只要把控制碼建成一個(gè)表,而利用 MOVC A,ADPTR 做取碼的操作,就可方便地處理一些復(fù)雜的控制動(dòng)作,取表過程如下圖所示:匯編源程序ORG 0START: MOV DPTR,#TABLELOOP: CLR AMOVC A,A+DPTRCJNE A,#01H,LOOP1JMP STARTLOOP1: MOV P1,AMOV R3,#20LCALL DELAYINC DPTRJMP LOOPDELAY: MOV R4,#20D1: MOV R5,#248圖6 程序流程圖DJNZ R5,$DJNZ R4,D1DJNZ R3,DELAYR RETT ABLE: DB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 07FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEHDB 07FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEHDB 00H, 0FFH,00H, 0FFHDB 01HENDC 語言源程序#INClude unsigned char code table=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,0x01;unsigned char i;void delay(void)unsigned char m,n,s;for(m=20;m0;m-)for(n=20;n0;n-)for(s=248;s0;s-);void main(void)while(1)if(tablei!=0x01)P1=tablei;i+;delay();elsei=0;四、 0059 秒計(jì)時(shí)器如下圖8所示,在 AT89S51 單片機(jī)的 P0 和 P2 端口分別接有兩個(gè)共陰數(shù)碼管,P0 口驅(qū)動(dòng)顯示秒的時(shí)間的十位,而 P2 口驅(qū)動(dòng)顯示秒的時(shí)間的個(gè)位。在設(shè)計(jì)過程中我們用一個(gè)存儲(chǔ)單元作為秒計(jì)數(shù)單元,當(dāng)一秒鐘到來時(shí),就讓秒計(jì)數(shù)單元加 1,當(dāng)秒計(jì)數(shù)達(dá)到 60 時(shí),就自動(dòng)返回到 0,重新秒計(jì)數(shù)。對(duì)于秒計(jì)數(shù)單元中的數(shù)據(jù)要把它十位數(shù)和個(gè)位數(shù)分開,方法仍采用對(duì) 10 整除和對(duì) 10 求余。匯編源程序Second EQU 30HORG 0000HSTART: MOV Second, #00HNEXT: MOV A, SecondMOV B,#10DIV ABMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,AMOV A,BMOVC A,A+DPTRMOV P2,ALCALL DELY1SINC SecondMOV A,SecondCJNE A,#60,NEXT圖7 程序流程圖LJMP STARTDELY1S: MOV R5,#100D2: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHENDC 語言源程序#include unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsigned char Second;void delay1s(void)unsigned char i,j,k;for(k=100;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);void main(void)Second=0;P0=tableSecond/10;P2=tableSecond%10;while(1)delay1s();Second+;if(Second=60)Second=0;P0=tableSecond/10;P2=tableSecond%10;圖8 單片機(jī)原理圖五、動(dòng)態(tài)數(shù)碼顯示技術(shù)如圖 9 所示,P0 端口接動(dòng)態(tài)數(shù)碼管的字形碼筆段,P2 端口接動(dòng)態(tài)數(shù)碼管的數(shù)位選擇端,P1.7 接一個(gè)開關(guān),當(dāng)開關(guān)接高電平時(shí),顯示“12345”字樣;當(dāng)開關(guān)接低電平時(shí),顯示“HELLO”字樣。動(dòng)態(tài)掃描方法:動(dòng)態(tài)接口采用各數(shù)碼管循環(huán)輪流顯示的方法,當(dāng)循環(huán)顯示頻率較高時(shí),利用人眼的暫留特性,看不出閃爍顯示現(xiàn)象,這種顯示需要一個(gè)接口完成字形碼的輸出(字形選擇),另一接口完成各數(shù)碼管的輪流點(diǎn)亮(數(shù)位選擇)。在進(jìn)行數(shù)碼顯示的時(shí)候,要對(duì)顯示單元開辟 8 個(gè)顯示緩沖區(qū),每個(gè)顯示緩沖區(qū)裝有顯示的不同數(shù)據(jù)即可。對(duì)于顯示的字形碼數(shù)據(jù)我們采用查表方法來完成。匯編源程序圖9 單片機(jī)原理圖ORG 0000HSTART: JB P1.7,DIR1MOV DPTR,#TABLE1SJMP DIRDIR1: MOV DPTR,#TABLE2DIR: MOV R0,#00HMOV R1,#01HNEXT: MOV A,R0 MOVC A,A+DPTRMOV P0,AMOV A,R1MOV P2,ALCALL DAYINC R0RL AMOV R1,ACJNE R1,#0DFH,NEXTSJMP STARTDAY: MOV R6,#4D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1圖10 單片機(jī)原理圖RETTABLE1: DB 06H,5BH,4FH,66H,6DHTABLE2: DB 78H,79H,38H,38H,3FHENDC 語言源程序#include Unsigned char code table1 =0x06,0x5b,0x4f,0x66,0x6d;Unsigned char code table2=0x78,0x79,0x38,0x38,0x3f;Unsigned char i;Unsigned char a,b;Unsigned char temp;void main(void) while(1)temp=0xfe;for(i=0;i5;i+) if(P1_7=1)P0=table1i; else P0=table2i; P2=temp;a=temp(7-i); temp=a|b;for(a=4;a0;a-)for(b=248;b0;b-); 六、44 矩陣式鍵盤識(shí)別技術(shù)如圖 11 所示,用 AT89S51 的并行口 P1 接 44 矩陣鍵盤,以 P1.0P1.3作輸入線,以 P1.4P1.7 作輸出線;在數(shù)碼管上顯示每個(gè)按鍵的“0F”序。對(duì)應(yīng)的按鍵的序號(hào)排列如圖12 所示每個(gè)按鍵有它的行值和列值 ,行值和列值的組合就是識(shí)別這個(gè)按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和 CPU 通信。每個(gè)按鍵的狀態(tài)同樣需變成數(shù)字量“0”和“1”,開關(guān)的一端(列線)通過電阻接 VCC,而接地是通過程序輸出數(shù)字“0”實(shí)現(xiàn)的。鍵盤處理程序的任務(wù)是:確定有無鍵按下,判斷哪一個(gè)鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時(shí)的抖動(dòng)。兩個(gè)并行口中,一個(gè)輸出掃描碼,使按鍵逐行動(dòng)態(tài)接地,另一個(gè)并行口輸入按鍵狀態(tài),由行掃描值和回饋信號(hào)共同形成鍵編碼而識(shí)別按鍵,通過軟件查表,查出該鍵的功能。匯編源程序KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2WAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1MOV KEYBUF,#0LJMP DK1NK1: CJNE A,#0DH,NK2MOV KEYBUF,#1LJMP DK1NK2: CJNE A,#0BH,NK3MOV KEYBUF,#2LJMP DK1NK3: CJNE A,#07H,NK4MOV KEYBUF,#3LJMP DK1NK4: NOPDK1:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ADK1A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK1ANOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5MOV KEYBUF,#4LJMP DK2NK5: CJNE A,#0DH,NK6MOV KEYBUF,#5LJMP DK2NK6: CJNE A,#0BH,NK7MOV KEYBUF,#6LJMP DK2NK7: CJNE A,#07H,NK8MOV KEYBUF,#7LJMP DK2NK8: NOPDK2:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ADK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2ANOKEY2:MOV P3,#0FFHCLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11MOV KEYBUF,#10LJMP DK3NK11: CJNE A,#07H,NK12MOV KEYBUF,#11LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ADK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ANOKEY3:MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4MOV A,P3ANL A,#0FHCJNE A,#0EH,NK13MOV KEYBUF,#12LJMP DK4NK13: CJNE A,#0DH,NK14MOV KEYBUF,#13LJMP DK4NK14: CJNE A,#0BH,NK15MOV KEYBUF,#14LJMP DK4NK15: CJNE A,#07H,NK16MOV KEYBUF,#15LJMP DK4NK16: NOPDK4:MOV A,KEYBUFMOV DPTR,#TABLEMOVC A,A+DPTRMOV P0,ADK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ANOKEY4:LJMP WAITDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HENDC 語言源程序#INClude unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;unsigned char temp;unsigned char key;unsigned char i,j;void main(void)while(1)P3=0xff;P3_4=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f;switch(temp)case 0x0e:key=7;break;case 0x0d:key=8;break;case 0x0b:key=9;break;case 0x07:key=10;break;temp=P3;P1_0=P1_0;P0=tablekey;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f;P3=0xff;P3_5=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f;switch(temp)case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=11;break;temp=P3;P1_0=P1_0;P0=tablekey;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f;P3=0xff;P3_6=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f;switch(temp)case 0x0e:key=1;break;case 0x0d:key=2;break;case 0x0b:key=3;break;case 0x07:key=12;break;temp=P3;P1_0=P1_0;P0=tablekey;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f;P3=0xff;P3_7=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f;switch(temp)case 0x0e:key=0;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;temp=P3;P1_0=P1_0;P0=tablekey;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f;七、按鍵識(shí)別方法每按下一次開關(guān) SP1,計(jì)數(shù)值加 1,通過AT89S51 單片機(jī)的 P1 端口的 P1.0 到 P1.3顯示出其二進(jìn)制計(jì)數(shù)值。*程序設(shè)計(jì)方法:作為一個(gè)按鍵從沒有按下到按下以及釋放是一個(gè)完整的過程,也就是說,當(dāng)我們按下一個(gè)按鍵時(shí),總希望某個(gè)命令只執(zhí)行一次,而在按鍵按下的 過程中,不要有干擾進(jìn)來,因?yàn)?,在按下的過程中,一旦有干擾過來,可能造成誤觸發(fā)過程,這并不是我們所想要的。因此在按鍵按下的時(shí)候,要把我們手上的干擾信號(hào)以及按鍵的機(jī)械接觸等干擾信號(hào)給濾除掉,一般情況下,我們可以采用電容來濾除掉這些干擾信號(hào),但實(shí)際上,會(huì)增加硬件成本及硬件電路的體積,這是我們不希望,總得有個(gè)辦法解決這個(gè)問題,因此我們可以采用軟件濾波的方法去除這些干擾信號(hào),一般情況下,一個(gè)按鍵按下的時(shí)候,總是在按下的時(shí)刻存在著一定的干擾信號(hào),按下之后就基本上進(jìn)入了穩(wěn)定的狀態(tài)。具體的一個(gè)按鍵從按下到釋放的全過程的信號(hào)圖如上圖所示:從圖中可以看出,我們?cè)诔绦蛟O(shè)計(jì)時(shí),從按鍵被識(shí)別按下之后,延時(shí) 5ms 以上,從而避開了干擾信號(hào)區(qū)域,我們?cè)賮頇z測一次,看按鍵是否真得已經(jīng)按下,若真得已經(jīng)按下,這時(shí)肯定輸出為低電平,若這時(shí)檢測到的是高電平,證明剛才是由于干擾信號(hào)引起的誤觸發(fā),CPU 就認(rèn)為是誤觸發(fā)信號(hào)而舍棄這次的按鍵識(shí)別過程。從而提高了系統(tǒng)的可靠性。由于要求每按下一次,命令被執(zhí)行一次,直到下一次再按下的時(shí)候,再執(zhí)行一次命令,因此從按鍵被識(shí)別出來之后,我們就可以執(zhí)行這次的命令,所以要有一個(gè)等待按鍵釋放的過程,顯然釋放的過程,就是使其恢復(fù)成高電平狀態(tài)。1 匯編源程序ORG 0000HSTART: MOV R1,#00H ;初始化 R1 為 0,表示從 0 開始計(jì)數(shù)MOV A, R1 ;CPL A ;取反指令MOV P1,A ;送出 P1 端口由發(fā)光二極管顯示REL: JB P3.7,REL ;判斷 SP1 是否按下LCALL DELAY10MS ;若按下,則延時(shí) 10ms 左右JB P3.7,REL ;再判斷 SP1 是否真得按下INC R1 ;若確實(shí)按下,則進(jìn)行按鍵處理,使MOV A,R1 ;計(jì)數(shù)內(nèi)容加 1,并送出 P1 端口由CPL A ;發(fā)光二極管顯示MOV P1,A ;JNB P3.7,$ ;等待 SP1 釋放SJMP REL ;繼續(xù)對(duì) K1 按鍵掃描DELAY10MS: MOV R6,#20 ;延時(shí) 10ms 子程序L1: MOV R7,#248DJNZ R7,$DJNZ R6,L1RETEND2. C 語言源程序#include unsigned char count;void delay10ms(void)unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);void main(void)while(1)if(P3_7=0)delay10ms();if(P3_7=0)count+;if(count=16)count=0;P1=count;while(P3_7=0);八、數(shù)字鐘(1 開機(jī)時(shí),顯示 12:00:00 的時(shí)間開始計(jì)時(shí);(2 P0.0/AD0 控制“秒”的調(diào)整,每按一次加 1 秒;(3 P0.1/AD1 控制“分”的調(diào)整,每按一次加 1 分;(4 P0.2/AD2 控制“時(shí)”的調(diào)整,每按一次加 1 個(gè)小時(shí)6 匯編源程序SECOND EQU 30HMINITE EQU 31HHOUR EQU 32HHOURK BIT P0.0MINITEK BIT P0.1SECONDK BIT P0.2DISPBUF EQU 40HDISPBIT EQU 48HT2SCNTA EQU 49HT2SCNTB EQU 4AHTEMP EQU 4BHORG 00HLJMP STARTORG 0BHLJMP INT_T0START: MOV SECOND,#00HMOV MINITE,#00HMOV HOUR,#12MOV DISPBIT,#00HMOV T2SCNTA,#00HMOV T2SCNTB,#00HMOV TEMP,#0FEHLCALL DISPMOV TMOD,#01HMOV TH0,#(65536-2000) / 256MOV TL0,#(65536-2000) MOD 256SETB TR0SETB ET0SETB EAWT: JB SECONDK,NK1LCALL DELY10MSJB SECONDK,NK1INC SECONDMOV A,SECONDCJNE A,#60,NS60MOV SECOND,#00HNS60: LCALL DISPJNB SECONDK,$NK1: JB MINITEK,NK2LCALL DELY10MSJB MINITEK,NK2INC MINITEMOV A,MINITECJNE A,#60,NM60MOV MINITE,#00HNM60: LCALL DISPJNB MINITEK,$NK2: JB HOURK,NK3LCALL DELY10MSJB HOURK,NK3INC HOURMOV A,HOURCJNE A,#24,NH24MOV HOUR,#00HNH24: LCALL DISPJNB HOURK,$NK3: LJMP WTDELY10MS:MOV R6,#10D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETDISP:MOV A,#DISPBUFADD A,#8DEC AMOV R1,AMOV A,HOURMOV B,#10DIV ABMOV R1,ADEC R1MOV A,BMOV R1,ADEC R1MOV A,#10MOVR1,ADEC R1MOV A,MINITEMOV B,#10DIV ABMOV R1,ADEC R1MOV A,BMOV R1,ADEC R1MOV A,#10MOVR1,ADEC R1MOV A,SECONDMOV B,#10DIV ABMOV R1,ADEC R1MOV A,BMOV R1,ADEC R1RETINT_T0:MOV TH0,#(65536-2000) / 256MOV TL0,#(65536-2000) MOD 256MOV A,#DISPBUFADD A,DISPBITMOV R0,AMOV A,R0MOV DPTR,#TABLEMOVC A,A+DPTRMOV P1,AMOV A,DISPBITMOV DPTR,#TABMOVC A,A+DPTRMOV P3,AINC DISPBITMOV A,DISPBITCJNE A,#08H,KNAMOV DISPBIT,#00HKNA: INC T2SCNTAMOV A,T2SCNTACJNE A,#100,DONEMOV T2SCNTA,#00HINC T2SCNTBMOV A,T2SCNTBCJNE A,#05H,DONEMOV T2SCNTB,#00HINC SECONDMOV A,SECONDCJNE A,#60,NEXTMOV SECOND,#00HINC MINITEMOV A,MINITECJNE A,#60,NEXTMOV MINITE,#00HINC HOURMOV A,HOURCJNE A,#24,NEXTMOV HOUR,#00HNEXT: LCALL DISPDONE: RETITABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40HTAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FHEND7 C 語言源程序#INClude unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00;unsigned char dispbitcode=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char dispbuf8=0,0,16,0,0,16,0,0;unsigned char dispbitcnt;unsigned char second;unsigned char minite;unsigned char hour;unsigned int tcnt;unsigned char mstcnt;unsigned char i,j;void main(void)TMOD=0x02;TH0=0x06;TL0=0x06;TR0=1;ET0=1;EA=1;while(1)if(P0_0=0)for(i=5;i0;i-)for(j=248;j0;j-);if(P0_0=0)second+;if(second=60)second=0;dispbuf0=second%10;dispbuf1=second/10;while(P0_0=0);if(P0_1=0)for(i=5;i0;i-)for(j=248;j0;j-);if(P0_1=0)minite+;if(minite=60)minite=0;dispbuf3=minite%10;dispbuf4=minite/10;while(P0_1=0);if(P0_2=0)for(i=5;i0;i-)for(j=248;j0;j-);if(P0_2=0)hour+;if(hour=24)hour=0;dispbuf6=hour%10;dispbuf7=hour/10;while(P0_2=0);void t0(void) interrupt 1 using 0mstcnt+;if(mstcnt=8)mstcnt=0;P1=dispcodedispbufdispbitcnt;P3=dispbitcodedispbitcnt;dispbitcnt+;if(dispbitcnt=8)dispbitcnt=0;tcnt+;if(tcnt=4000)tcnt=0;second+;if(second=60)second=0;minite+;if(minite=60)minite=0;hour+;if(hour=24)hour=0;dispbuf0=second%10;dispbuf1=second/10;dispbuf3=minite%10;dispbuf4=minite/10;dispbuf6=hour%10;dispbuf7=hour/10;九 ADC0809A/D 轉(zhuǎn)換器基本應(yīng)用技術(shù)1 基本知識(shí)ADC0809 是帶有 8 位 A/D 轉(zhuǎn)換器、8 路多路開關(guān)以及微處理機(jī)兼容的控制邏輯的 CMOS 組件。它是逐次逼近式 A/D 轉(zhuǎn)換器,可以和單片機(jī)直接接口。2 ADC0809 的內(nèi)部邏輯結(jié)構(gòu)圖9-1由上圖可知,ADC0809 由一個(gè) 8 路模擬開關(guān)、一個(gè)地址鎖存與譯碼器、一個(gè) A/D轉(zhuǎn)換器和一個(gè)三態(tài)輸出鎖存器組成。多路開關(guān)可選通 8 個(gè)模擬通道,允許 8 路模擬量分時(shí)輸入,共用 A/D 轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。三態(tài)輸出鎖器用于鎖存 A/D 轉(zhuǎn)換完的數(shù)字量,當(dāng) OE 端為高電平時(shí),才可以從三態(tài)輸出鎖存器取走轉(zhuǎn)換完的數(shù)據(jù)。3 引腳結(jié)構(gòu)IN0IN7:8 條模擬量輸入通道ADC0809 對(duì)輸入模擬量要求:信號(hào)單極性,電壓范圍是 05V,若信號(hào)太小,必須進(jìn)行放大;輸入的模擬量在轉(zhuǎn)換過程中應(yīng)該保持不變,如若模擬量變化太快,則需在輸入前增加采樣保持電路。地址輸入和控制線:4 條ALE 為地址鎖存允許輸入線,高電平有效。當(dāng) ALE 線為高電平時(shí),地址鎖存與譯碼器將 A,B,C 三條地址線的地址信號(hào)進(jìn)行鎖存,經(jīng)譯碼后被選中的通道的模擬量進(jìn)轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。A,B 和 C 為地址輸入線,用于選通 IN0IN7 上的一路模擬量輸入。通道選擇表如下表所示。CBA選擇的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7數(shù)字量輸出及控制線:11 條ST 為轉(zhuǎn)換啟動(dòng)信號(hào)。當(dāng) ST 上跳沿時(shí),所有內(nèi)部寄存器清零;下跳沿時(shí),開始進(jìn)行 A/D 轉(zhuǎn)換;在轉(zhuǎn)換期間,ST 應(yīng)保持低電平。EOC 為轉(zhuǎn)換結(jié)束信號(hào)。當(dāng) EOC 為高電平時(shí),表明轉(zhuǎn)換結(jié)束;否則,表明正在進(jìn)行 A/D 轉(zhuǎn)換。OE 為輸出允許信號(hào),用于控制三條輸出鎖存器向單片機(jī)輸出轉(zhuǎn)換得到的數(shù)據(jù)。OE1,輸出轉(zhuǎn)換得到的數(shù)據(jù);OE0,輸出數(shù)據(jù)線呈高阻狀態(tài)。D7D0 為數(shù)字量輸出線。CLK 為時(shí)鐘輸入信號(hào)線。因 ADC0809 的內(nèi)部沒有時(shí)鐘電路,所需時(shí)鐘信號(hào)必須由外界提供,通常使用頻率為 500KHZ,VREF(),VREF()為參考電壓輸入。4 ADC0809 應(yīng)用說明(1) ADC0809 內(nèi)部帶有輸出鎖存器,可以與 AT89S51 單片機(jī)直接相連。(2) 初始化時(shí),使 ST 和 OE 信號(hào)全為低電平。(3) 送要轉(zhuǎn)換的哪一通道的地址到 A,B,C 端口上。(4) 在 ST 端給出一個(gè)至少有 100ns 寬的正脈沖信號(hào)。(5) 是否轉(zhuǎn)換完畢,我們根據(jù) EOC 信號(hào)來判斷。(6) 當(dāng) EOC 變?yōu)楦唠娖綍r(shí),這時(shí)給 OE 為高電平,轉(zhuǎn)換的數(shù)據(jù)就輸出給單片機(jī)了。5 實(shí)驗(yàn)任務(wù)如下圖所示,從 ADC0809 的通道 IN3 輸入 05V 之間的模擬量,通過 ADC0809轉(zhuǎn)換成數(shù)字量在數(shù)碼管上以十進(jìn)制形成顯示出來。ADC0809 的 VREF 接5V電壓。6 電路原理圖5 系統(tǒng)板上硬件連線(1) 把“單片機(jī)系統(tǒng)板”區(qū)域中的 P1 端口的 P1.0P1.7 用 8 芯排線連接到“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的 A B C D E F G H 端口上,作為數(shù)碼管的筆段驅(qū)動(dòng)。(2) 把“單片機(jī)系統(tǒng)板”區(qū)域中的 P2 端口的 P2.0P2.7 用 8 芯排線連接到“動(dòng)態(tài)數(shù)碼顯示”區(qū)域中的 S1 S2 S3 S4 S5 S6 S7 S8 端口上,作為數(shù)碼管的位段選擇。(3) 把“單片機(jī)系統(tǒng)板”區(qū)域中的 P0 端口的 P0.0P0.7 用 8 芯排線連接到“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的 D0D1D2D3D4D5D6D7 端口上,A/D 轉(zhuǎn)換完畢的數(shù)據(jù)輸入到單片機(jī)的 P0 端口(4) 把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的 VREF 端子用導(dǎo)線連接到“電源模塊”區(qū)域中的 VCC 端子上;(5) 把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的 A2A1A0 端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的 P3.4 P3.5 P3.6 端子上;(6) 把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的 ST 端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的 P3.0 端子上;(7) 把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的 OE 端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的 P3.1 端子上;(8)把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的 EOC 端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的 P3.2 端子上;(9) 把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的 CLK 端子用導(dǎo)線連接到“分頻模塊”區(qū)域中的 /4 端子上;(10) 把“分頻模塊”區(qū)域中的 CK IN 端子用導(dǎo)線連接到“單片機(jī)系統(tǒng)”區(qū)域中的 ALE 端子上;(11) 把“模數(shù)轉(zhuǎn)換模塊”區(qū)域中的 IN3 端子用導(dǎo)線連接到“三路可調(diào)壓模塊”區(qū)域中的 VR1 端子上;6 程序設(shè)計(jì)內(nèi)容(1) 進(jìn)行 A/D 轉(zhuǎn)換時(shí),采用查詢 EOC 的標(biāo)志信號(hào)來檢測 A/D 轉(zhuǎn)換是否完畢,若完畢則把數(shù)據(jù)通過 P0 端口讀入,經(jīng)過數(shù)據(jù)處理之后在數(shù)碼管上顯示。(2) 進(jìn)行 A/D 轉(zhuǎn)換之前,要啟動(dòng)轉(zhuǎn)換的方法:ABC110 選擇第三通道ST0,ST1,ST0 產(chǎn)生啟動(dòng)轉(zhuǎn)換的正脈沖信號(hào)7 匯編源程序CH EQU 30HDPCNT EQU 31HDPBUF EQU 33HGDATA EQ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論