單片機終極版_第1頁
單片機終極版_第2頁
單片機終極版_第3頁
單片機終極版_第4頁
單片機終極版_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1、LED閃爍程序注釋#include<reg52.h>sbitLED=P0A0;sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=P1A3;sbitENLED=P1A4;voidmain()/void即函數(shù)類型(/以下為聲明語句部分unsignedinti=0;/定義一個無符號整型變量i,并賦初值0/以下為執(zhí)行語句部分ENLED=0;/U3、U4兩片74HC138總使能ADDR3=1;/使能U3使之正常輸出ADDR2=1;/經(jīng)U3的丫6輸出開啟三極管Q16ADDR1=1;ADDR0=0;while(1)(LED=0;/點

2、亮小燈for(i=0;i<30000;i+);/延時一段時間LED=1;/熄滅小燈for(i=0;i<30000;i+);/延時一段時間)2、流水燈的程序注釋#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;voidmain()unsignedinti=0;/定義循環(huán)變量i,用于軟件延時unsignedcharcnt=0;/定義計數(shù)變量cnt,用于移位控制ENLED=0;ADDR3=1;ADDR2=1;ADDR1=1;ADDR0=0;whil

3、e(1)/主循環(huán),程序無限循環(huán)執(zhí)行該循環(huán)體語句P0=(0x01<<cnt);/P0等于1左移cnt位,控制8個LEDfor(i=0;i<20000;i+);/軟件延時cnt+;/移位計數(shù)變量自加1if(cnt>=8)/移位計數(shù)超過7后,再重新從0開始cnt=0;3、數(shù)碼管的靜態(tài)顯示程序注釋#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;/用數(shù)組來存儲數(shù)碼管的真值表,數(shù)組將在下一章詳細介紹unsignedcharcodeLedCh

4、ar=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E;voidmain()unsignedcharcnt=0;/記錄T0中斷次數(shù)unsignedcharsec=0;/記錄經(jīng)過的秒數(shù)ENLED=0;/使能U3,選擇數(shù)碼管DS1ADDR3=1ADDR2=0ADDR1=0ADDR0=0TMOD=0x01;/設(shè)置T0為模式1TH0=0xB8;/為T0賦初值0xB800TL0=0x00;TR0=1;/啟動T0while(1)if(TF0=1)/TF0=0;/T0TH0=0xB8;/TL0=0x

5、00;cnt+;/溢出是否達到50次判斷T0是否溢出溢出后,清零中斷標志并重新賦初值if(cnt>=50)/判斷T0cnt=0;/P0=LedCharsec;sec+;/秒數(shù)記錄自加達到50次后計數(shù)值清零/當前秒數(shù)對應(yīng)的真值表中的值送到P0口1if(sec>=16)/當秒數(shù)超過0x0F(15)后,重新從0開始sec=0;4、點陣程序讀寫注釋1、#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;voidmain()ENLED=0;/U3、U4兩

6、片74HC138總使能ADDR3=0;/使能U4使之正常輸出ADDR2=0;/經(jīng)U4的Y1輸出開啟三極管Q11ADDR1=0;ADDR0=1;P0=0x00;/向P0寫入0來點亮一行while(1);/程序停止在這里2、#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;voidmain()EA=1;/使能總中斷ENLED=0;/使能U4,選擇LED點陣ADDR3=0;/TMOD=0x01;/TH0=0xFC;/因為需要動態(tài)改變ADDR0-2的值,所以不需

7、要再初始化了設(shè)置T0為模式1為T0賦初值0xFC67,定時1msTL0=0x67;ET0=1;/使能T0中斷TR0=1;/啟動T0while;程序停在這里,等待定時器中斷/*定時器0中斷服務(wù)函數(shù)*/動態(tài)掃描的索引voidInterruptTimer0()interrupt1staticunsignedchari=0;/TH0=0xFC;/重新加載初值TL0=0x67;/以下代碼完成LED點陣動態(tài)掃描刷新P0=0xFF;/顯示消隱switch(i)case0:ADDR2=0;ADDR1=0;ADDR0=0;i+;P0=0x00;break;case1:ADDR2=0;ADDR1=0;ADDR0=

8、1;i+;P0=0x00;break;case2:ADDR2=0;ADDR1=1ADDR0=0;i+;P0=0x00;break;case3:ADDR2=0;ADDR1=1;ADDR0=1;i+;P0=0x00;break;case4:ADDR2=1;ADDR1=0;ADDR0=0;i+;P0=0x00;break;case5:ADDR2=1;ADDR1=0;ADDR0=1;i+;P0=0x00;break;case6:ADDR2=1;ADDR1=1;ADDR0=0;i+;P0=0x00;break;case7:ADDR2=1;ADDR1=1;ADDR0=1;i=0;P0=0x00;break

9、;default:break;5、寫程序#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=Pi1;sbitADDR2=Pi2;sbitADDR3=Pi3;sbitENLED=Pi4;unsignedcharcodeimage=/圖片的字模表0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3,0x

10、FF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;voidmain()(EA=1;/使能總中斷ENLED=0;/使能U4,選擇LED點陣ADDR3=0;TMOD=0x01;/設(shè)置T0為模式1TH0=0xFC;/為T0賦初值0xFC67,定時1msTL0=0x67;ET0=1;/使能T0中斷TR0=1;/啟動T0while(1);/*定時器0中斷服務(wù)函數(shù)*/voidInterruptTimer0()interrupt1staticunsignedchari=0;/動態(tài)掃描的索引軟件定時器staticunsignedcharindex=0;/static圖片刷新

11、索引unsignedchartmr=0;250msTH0=0xFC;/重新加載初值TL0=0x67;/以下代碼完成LED點陣動態(tài)掃描刷新P0=0xFF;/顯示消隱switch(i)case0:ADDR2=0;ADDR1=0;ADDR0=0;i+;P0=imageindex+0;break;case1:ADDR2=0ADDR1=0ADDR0=1;i+;P0=imageindex+1;break;case2:ADDR2=0;ADDR1=1;ADDR0=0;i+;P0=imageindex+2;break;case3:ADDR2=0;ADDR1=1;ADDR0=1;i+;P0=imageindex+

12、3;break;case4:ADDR2=1;ADDR1=0;ADDR0=0;i+;P0=imageindex+4;break;case5:ADDR2=1ADDR1=0;ADDR0=1;i+;P0=imageindex+5;break;case6:ADDR2=1ADDR1=1ADDR0=0;i+;P0=imageindex+6;break;case7:ADDR2=1ADDR1=1;ADDR0=1;i=0;P0=imageindex+7;break;default:break;/以下代碼完成每250ms改變一幀圖像tmr+;if(tmr>=250)/達到250ms時改變一次圖片索引tmr=0

13、;index+;if(index>=32)/圖片索引達到32后歸零index=0;6、矩陣按鍵的掃描程序(與注釋相對應(yīng))#include<reg52.h>sbitADDR0=P1A0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=P1A3;sbitENLED=P1A4;sbitKEY_IN_1=P2A4;sbitKEY_IN_2=P2A5;sbitKEY_IN_3=P2A6;sbitKEY_IN_4=P2A7;sbitKEY_OUT_=P2A3;sbitKEY_OUT_2=P2A2;sbitKEY_OUT_*P2A1;sbitKEY_OUT_

14、4=P2A0;unsignedcharcodeLedChar=/數(shù)碼管顯示字符轉(zhuǎn)換表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E;unsignedcharKeySta44=/全部矩陣按鍵的當前狀態(tài)1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1按鍵值備份,保存前一次;voidmain()unsignedchari,j;unsignedcharbackup44=/的值1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;EA=1;/ENLED=0;/ADDR3

15、=1;ADDR2=0;ADDR1=0;ADDR0=0;TMOD=0x01;/TH0=0xFC;/TL0=0x67;ET0=1;/TR0=1;/選擇數(shù)碼管DS1進行顯示能總中斷設(shè)置T0為模式1為T0賦初值0xFC67,定時1ms使能T0中斷啟動T0P0=LedChar0;/默認顯示0while(1)for(i=0;i<4;i+)/循環(huán)檢測4*4的矩陣按鍵for(j=0;j<4;j+)if(backupij!=KeyStaij)/檢測按鍵動作if(backupij!=0)/按鍵按下時執(zhí)行動作P0=LedChari*4+j;/將編號顯示到數(shù)碼管backupij=KeyStaij;/更新前

16、一次的備份值/*T0中斷服務(wù)函數(shù),掃描矩陣按鍵狀態(tài)并消抖*/voidInterruptTimer0()interrupt1unsignedchari;staticunsignedcharkeyout=0;/矩陣按鍵掃描輸出索引staticunsignedcharkeybuf44=/矩陣按鍵掃描緩沖區(qū)0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF;TH0=0xFC;/重新加載初值TL0=0x67;/將一彳f的4個按鍵值移入緩沖區(qū)keybufkeyout0=(keybufkeyout0&

17、lt;<1)|KEY_IN_1;keybufkeyout1=(keybufkeyout1<<1)|KEY_IN_2;keybufkeyout2=(keybufkeyout2<<1)|KEY_IN_3;keybufkeyout3=(keybufkeyout3<<1)|KEY_IN_4;/消抖后更新按鍵狀態(tài)for(i=0;i<4;i+)/每行4個按鍵,所以循環(huán)4次if(keybufkeyouti&0x0F)=0x00)/連續(xù)4次掃描值為0,即4*4ms內(nèi)都是按下狀態(tài)時,可認為按鍵已穩(wěn)定的按下KeyStakeyouti=0;elseif(key

18、bufkeyouti&0x0F)=0x0F)/連續(xù)4次掃描值為1,即4*4ms內(nèi)都是彈起狀態(tài)時,可認為按鍵已穩(wěn)定的彈起KeyStakeyouti=1;/執(zhí)行下一次的掃描輸出keyout+;/輸出索引遞增keyout=keyout&0x03;/索引值加到4即歸零switch(keyout)/根據(jù)索引,釋放當前輸出引腳,拉低下次的輸出引腳case0:KEY_OUT_4=1;KEY_OUT_1=0;break;case1:KEY_OUT_1=1;KEY_OUT_2=0;break;case2:KEY_OUT_2=1;KEY_OUT_3=0;break;case3:KEY_OUT_3=

19、1;KEY_OUT_4=0;break;default:break;7、程序注釋#include<reg52.h>voidConfigUART(unsignedintbaud);voidmain()EA=1;/使能總中斷ConfigUART(9600);配置波特率為9600while(1);/*串口配置函數(shù),baud-通信波特率*/SCON=0x50;/TMOD&=0x0F;/TMOD|=0x20;/voidConfigUART(unsignedintbaud)配置串口為模式1清零T1的控制位配置T1為模式2#include<reg52.h>voidConfig

20、UART(unsignedintbaud);voidmain()EA=1;/使能總中斷ConfigUART(9600);/配置波特率為9600while(1);/*串口配置函數(shù),baud-通信波特率*/voidConfigUART(unsignedintbaud)SCON=0x50;/配置串口為模式1TMOD&=0x0F;/清零T1的控制位TMOD|=0x20;/配置T1為模式28、程序注釋#include<reg52.h>sbitLED=P0A0;sbitADDR0=Pi0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=P1A3;sbit

21、ENLED=Pi4;voidmain()unsignedcharcnt=0;/定義一個計數(shù)變量,記錄T0溢出次數(shù)ENLED=0;/使能U3,選擇獨立LEDADDR3=1;ADDR2=1;ADDR1=1;ADDR0=0;TMOD=0x01;/設(shè)置T0為模式1TH0=0xB8;/為T0賦初值0xB800TL0=0x00;TR0=1;/啟動T0while(1)if(TF0=1)/判斷T0是否溢出TF0=0;/T0TH0=0xB8;/溢出后,清零中斷標志并重新賦初值TL0=0x00;cnt+;/計數(shù)值自加1if(cnt>=50)/判斷T0溢出是否達到50次cnt=0;/達到50次后計數(shù)值清零LE

22、D=LED;/LED取反:0->1、1->09、按鍵掃描#include<reg52.h>sbitADDR0=Pi0;sbitADDR1=P1A1;sbitADDR2=P1A2;sbitADDR3=Pi3;sbitENLED=Pi4;sbitKEY1=P2A4;sbitKEY2=P2A5;sbitKEY3=P2A6;sbitKEY4=P2A7;unsignedcharcodeLedChar=/數(shù)碼管顯示字符轉(zhuǎn)換表0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E;

23、bitKeySta=1;/當前按鍵狀態(tài)unsignedvoidmain()bitbackup=1;/按鍵值備份,保存前一次的掃描值charcnt=0;/EA=1;/按鍵計數(shù),記錄按鍵按下的次數(shù)使能總中斷ENLED=0;/選擇數(shù)碼管DS1進行顯示ADDR3=1;ADDR2=0;ADDR1=0;ADDR0=0;TMOD=0x01;/TH0=0xF8;/TL0=0xCD;ET0=1;/TR0=1;/設(shè)置T0為模式1為T0賦初值0xF8CD,定時2ms使能T0中斷啟動T0P2=0xF7;/P2.3置0,即KeyOut1輸出低電平P0=LedCharcnt;/顯示按鍵次數(shù)初值當前值與前次值不相等說明此時

24、按鍵有動作如果前次值為0,則說明當前是彈起動作只用1個數(shù)碼管顯示,所以加到10就清零重新開始while(1)if(KeySta!=backup)/if(backup=0)/cnt+;/按鍵次數(shù)+1if(cnt>=10)/cnt=0;P0=LedCharcnt;/計數(shù)值顯示到數(shù)碼管上backup=KeySta;/更新備份為當前值,以備進行下次比較*/掃描緩沖區(qū),保存一段時間內(nèi)的掃描值/*T0中斷服務(wù)函數(shù),用于按鍵狀態(tài)的掃描并消抖voidInterruptTimer0()interrupt1staticunsignedcharkeybuf=0xFF;/TH0=0xF8;/重新加載初值TL0=

25、0xCD;(keybufkeybuf=(keybuf<<1)|KEY4;/緩沖區(qū)左移一位,并將當前掃描值移入最低位if=0x00)/連續(xù)8次掃描值都為0,即16ms內(nèi)都只檢測到按下狀態(tài)時,可認為按鍵已按下KeySta=0;elseif(keybuf=0xFF)/連續(xù)8次掃描值都為1,即16ms內(nèi)都只檢測到彈起狀態(tài)時,可認為按鍵已彈起KeySta=1;else/其它情況則說明按鍵狀態(tài)尚未穩(wěn)定,則不對KeySta變量值進行更新10、馬達轉(zhuǎn)動#include<reg52.h>unsignedlongbeats=0;/電機轉(zhuǎn)動節(jié)拍總數(shù)voidStartMotor(unsigne

26、dlongangle);voidmain()EA=1;/使能總中斷TMOD=0x01;/設(shè)置T0為模式1TH0=0xF8;/TL0=0xCD;ET0=1;/TR0=1;/為T0賦初值0xF8CD,定時2ms使能T0中斷啟動T0StartMotor(360*2+180);/控制電機轉(zhuǎn)動2圈半while(1);)/*步進電機啟動函數(shù),angle-需轉(zhuǎn)過的角度*/voidStartMotor(unsignedlongangle)(/在計算前關(guān)閉中斷,完成后再打開,以避免中斷打斷計算過程而造成錯誤EA=0;beats=(angle*4076)/360;/實測為4076拍轉(zhuǎn)動一圈EA=1;)/*T0中斷

27、服務(wù)函數(shù),用于驅(qū)動步進電機旋轉(zhuǎn)voidInterruptTimer0()interrupt1unsignedchartmp;/臨時變量staticunsignedcharindex=0;/unsignedcharcodeBeatCode8=/0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6);*/節(jié)拍輸出索引步進電機節(jié)拍對應(yīng)的IO控制代碼TH0=0xF8;/重新加載初值TL0=0xCD;if(beats!=0)/節(jié)拍數(shù)不為0則產(chǎn)生一個驅(qū)動節(jié)拍tmp=P1;/用tmp把P1口當前值暫存tmp=tmp&0xF0;/用&®作清零低4位tmp=tmp|BeatC

28、odeindex;/用|操作把節(jié)拍代碼寫到低4位P1=tmp;/index+;/把低4位的節(jié)拍代碼和高4位的原值送回P1節(jié)拍輸出索引遞增index=index&0x07;/用&操作實現(xiàn)到8歸零beats-;/總節(jié)拍數(shù)-1)else/節(jié)拍數(shù)為0則關(guān)閉電機所有的相P1=P1|0x0F;1 .單片機的三大內(nèi)部資源是:Flash程序存儲空間RAM-數(shù)據(jù)存儲空間。SFR-特殊功能寄存器,Flash以其可重復(fù)擦寫且容量大成本低的優(yōu)點成為現(xiàn)在絕大多數(shù)單片機的程序存儲器。對于單片機來說Flash最大的意義是斷電后數(shù)據(jù)不丟失。RAM是單片機的數(shù)據(jù)存儲空間,用來存儲程序運行過程中產(chǎn)生的和需要的數(shù)據(jù)

29、,關(guān)電后數(shù)據(jù)丟失,讀寫速度非常快,理論上是可無限次寫入的。SFR是特殊功能寄存器,單片機每個功能都會對應(yīng)一個或多個SFR,我們就是通過對SFR的讀寫來實現(xiàn)單片機的多種多樣的功能的。2 .單片機最小系統(tǒng)的三要素是?其中復(fù)位電路有幾種?加以介紹。單片機最小系統(tǒng)的三要素就是電源、晶振、復(fù)位電路。單片機復(fù)位電路分為3種:上電復(fù)位、手動復(fù)位、程序自動復(fù)位。上電復(fù)位保證單片機每次都從一個固定的相同的狀態(tài)開始工作;復(fù)位按鍵讓程序重新初始化重新運行,這個過程就叫做手動復(fù)位;當程序死機或者跑飛的時候,我們的單片機往往有一套自動復(fù)位機制,比如看門狗,如果程序長時間失去響應(yīng),單片機看門狗模塊會自動復(fù)位重啟。3 .C

30、19和C10分別起什么作用?C19的作用:緩沖作用。當上電的瞬間,電流從電源處流下來的時候,不穩(wěn)定,容易沖擊電子器件,加個電容可以起到緩沖作用。,穩(wěn)定作用。我們的一整套電路,后級電子器件的功率大小都不一樣,而器件正常工作的時候,所需電流的大小也不是一成不變的。電流猛的增大,電路中的電壓(水位)就會直接突然下降,電容會在這個時候把存儲在里邊的電量釋放一下,穩(wěn)定電壓。C10的作用:電容C10,它容值較小,用來濾除高頻信號干擾的。4 .如何選取R17,使三極管處于飽和狀態(tài)三極管都有一個放大倍數(shù)0,要想處于飽和狀態(tài),b極電流就必須大于e和c之間電流值除以0。這個0,對于常用的三極管大概可以認為是100

31、oe和c之間的電流是3mA,那么b極電流最小就是3mA除以100等于30uA,大概有4.3V電壓會落在基極電阻上,那么基極電阻最大值就是4.3V/30uA=143K。電阻值只要比這個值小就可以。5 .在使用定時器的時候,需要哪幾個步驟?第一步:設(shè)置特殊功能寄存器TMOD配置好工作模式。第二步:設(shè)置計數(shù)寄存器TH0和TL0的初值。第三步:設(shè)置TCON通過TR0置1來讓定時器開始計數(shù)。第四步:判斷TCON寄存器的TF0位,監(jiān)測定時器溢出情況6 .會計算重載值:(方法,非實際作答時的答案)寫程序之前,我們要先來學(xué)會計算如何用定時器定時時間。我們的晶振是11.0592M,時鐘周期就是1/11059200,機器周期是12/11059200,假如要定時20ms,就是0.02秒,要經(jīng)過x個機器周期得到0.02秒,我們來算一下x*12/11059200=0.02,得到x=18432。16位定時器的溢出值是65536(因65535再加1才是溢出),

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論