51單片機(jī)c語言總結(jié)_第1頁
51單片機(jī)c語言總結(jié)_第2頁
51單片機(jī)c語言總結(jié)_第3頁
51單片機(jī)c語言總結(jié)_第4頁
51單片機(jī)c語言總結(jié)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、入門有針對性的解決一些簡單的實(shí)際問題,邊理論邊實(shí)踐學(xué)一樣會一樣基本實(shí)驗(yàn):流水燈,數(shù)碼管顯示,鍵盤控制,音樂播放,繼電器控制通信實(shí)驗(yàn),串口通信實(shí)驗(yàn),紅外線遙控信號解碼實(shí)驗(yàn)等單片機(jī)的定義分類和內(nèi)部組成1單片機(jī)就是中央處理器CPU,隨機(jī)存儲器RAM。只讀存儲器ROM。定時、計數(shù)器和各種輸入輸出接口I/o接口電路等部件集成在一塊電路芯片上的微型計算機(jī)。2,1分類按制造工藝分:HMOS和CHMOS CHMOS包括80c51等中間加了C功耗要小適合便攜式手提式和野外作業(yè)。2分類按不同容量的存儲器配置分:51子系列和52子系列51表示單片機(jī)最后一位數(shù)字為1作為標(biāo)志。片內(nèi)帶有4KbROM或EPROM(Eras

2、able Programmable ROM,可擦除可編程ROM,128BRAM,兩個16位定時器/計數(shù)器和5個中段器52系列是增強(qiáng)型各項(xiàng)指標(biāo)都高。AT89S51是AT89C51的升級版支持ISP在線更新程序ISP(Internet Service Provider內(nèi)部集成看門狗計時器等。3.1串行接口就是接口數(shù)據(jù)傳送3.2中斷控制系統(tǒng)接收中斷請求如定時時間到,需要鳴笛報警類似stop to do 停下來去執(zhí)行ROM中特定的每段程序,執(zhí)行完后再繼續(xù)執(zhí)行先前中斷的程序時鐘電路控制節(jié)拍工作。一個典型的單片機(jī)應(yīng)用系統(tǒng)包括輸入電路,單片機(jī),輸出電路把他想象成電腦。單片機(jī)的應(yīng)用:十六進(jìn)制記和點(diǎn)得點(diǎn)不是十六

3、進(jìn)制加邏輯數(shù)據(jù)的運(yùn)算邏輯與。兩個輸入一個輸出中間加一個恒定電壓有為,全出邏輯或有為,全出;字長通常與計算機(jī)內(nèi)部的寄存器和運(yùn)算器數(shù)據(jù)總線的寬度一致實(shí)例1功能感受protues仿真單片機(jī)播放渴望主題曲運(yùn)用protues打開仿真原理圖。對單片機(jī)進(jìn)行處理編輯edit component,選取目標(biāo)文件hexClock frequency 時鐘頻率Ok原理圖編輯窗口沒有滾動條,可通過預(yù)覽窗口該表原理圖的可視范圍。Protues雙擊右鍵刪除先單擊鼠標(biāo)右鍵,可通過鼠標(biāo)左鍵可以編輯元器件的屬性鼠標(biāo)右鍵來刪除畫錯的連線中鍵縮放原理圖新建即保存新建設(shè)計文件Junction dot mode連接點(diǎn) Subcircui

4、t mode 子電路 lab用總線時會用到Terminals mode 終端接口,有VCC地輸出輸入等接口Device pins mode 器件引腳用于繪制各種引腳。Graph mode 仿真圖表,用于各種分析,如noise analysisTape recorder mode錄音機(jī)Generator mode 信號發(fā)生器Voltage probe mode 電壓探針仿真圖表用Current probe mode 電流探針仿真圖表用Virtual instruments mode虛擬儀表有示波器可顯示工作波形Resistors 電阻Capacitors電容Crystal晶振Radianl el

5、ectrolytic圓柱形電解電容Keywords輸入resistors 470r或功率先選擇元器件后放元器件Led+yellowDrag object 拖動對象Editi properties 編輯屬性Rotate clockwise 順時針旋轉(zhuǎn)90Rotate anti-clockwise 逆時針旋轉(zhuǎn)90X-mirror 水平翻轉(zhuǎn)Y-mirror 垂直翻轉(zhuǎn)刪可以右鍵雙擊雙擊鼠標(biāo)左鍵編輯label放置電源和地必須編輯正確的label如VCC地GND各元器件引腳通過總線的連接并不表示真正意義上的電氣連接,需要添加網(wǎng)絡(luò)標(biāo)號。要運(yùn)行雙擊單片機(jī)基本電源5V振蕩電路:單片機(jī)是一種時序電路,必須施加脈沖

6、信號才能工作。在它的內(nèi)部有一個時鐘產(chǎn)生電路,只要接上兩個電容和一個晶振即可正常工作。P30復(fù)位電路;啟動后讓單片機(jī)從初始狀態(tài)開始執(zhí)行程序。EA一橫:接正電源端,表示使用內(nèi)部程序存儲器。注意:觀察仿真效果時,晶振電路,復(fù)位電路和EA引腳和電路的連接可以省略。Keil軟件源程序后綴。C必須手工輸入,表示為c語言程序,讓keilc51采用對應(yīng)的c語言的方式來編譯源程序。#include包含51單片機(jī)寄存器定義的頭文件將新建的源程序文件加載到項(xiàng)目管理器右擊source group文件add c文件單片機(jī)不能處理c,必須將c轉(zhuǎn)換成二進(jìn)制或十六進(jìn)制代碼,匯編或編譯。用鼠標(biāo)右鍵點(diǎn)擊target 進(jìn)入opti

7、ons for target 確認(rèn)output選項(xiàng)中create hex重新構(gòu)造所有目標(biāo)程序燒錄器及燒錄軟件的使用單片機(jī)軟硬件系統(tǒng)仿真成功后,要真正投入實(shí)際應(yīng)用,必須將程序燒寫入單片機(jī)芯片,A51程序燒錄器和先將COM接口(用作數(shù)據(jù)通信)與計算機(jī)的COM接口(RS-232)連接好,然后將單片機(jī)安插在燒錄器的插座中,再用一根USB線將USB接口與計算機(jī)的USB接口連接,讓計算機(jī)通過這根USB線向燒錄器提供+5V電源使用燒錄器前,手動設(shè)置一些,參數(shù)標(biāo)簽頁,根據(jù)COM口,設(shè)置好串口,波特率設(shè)置為28800;點(diǎn)擊自動擦除器件命令,點(diǎn)擊打開文件命令選擇單片機(jī)文件十六進(jìn)制文件hex 再點(diǎn)擊打開點(diǎn)擊自動寫器

8、件。實(shí)例4用單片機(jī)控制一個燈閃爍Led燈亮存在電壓差和正向偏置延遲函數(shù)Void main(void)/ 兩個void分別表示無須返回值和沒有參數(shù)傳遞 Unsigned int i;/ 定義無符號整數(shù),最大65535 For(i=0;i20000;i+) ; 只有一個分號表示什么都不做,等待一個機(jī)器周期 0x中的0是數(shù)字0,而不是字母O郁悶一編寫keil時,文檔第一行必須是#include虛擬儀表示波器oscilloscopeProtues示波器面板?及使用單片機(jī)需要一個時鐘信號送給內(nèi)部個電路,才能使他們有節(jié)拍的工作,時鐘信號的頻率由外部振蕩電路的晶振頻率決定,51系列單片機(jī)的機(jī)器周期是由12個

9、振蕩周期組成。指令周期:單片機(jī)執(zhí)行一條指令的時間。時鐘頻率越低,延時的時間就越長,燈閃爍的速度就越慢。實(shí)例5 將p1口狀態(tài)送入p0口p2口p3口利用單片機(jī)工作速度快的特點(diǎn),無限循環(huán)可以讓單片機(jī)不停地把p1口的電平狀態(tài)送到p0口p2口和p3口。引腳接地低電平被輸入到p口實(shí)例6使用p3口流水點(diǎn)亮8位led記憶,0xfe 0xfd 0xfb 0xf7 0xef 0xdf 0xbf 0x7f 實(shí)例7通過對p3口地址的操作流水點(diǎn)亮8位led單片機(jī)都有固定的地址,記憶:張三在教室的第2排第5列老師可以說清張三回答問題也可以說請第2排第5列的同學(xué)答題。Sfr x=0xb0; 通過關(guān)鍵字sfr將x定義為p2的

10、地址0xb0定義后,程序中對x的操作就相當(dāng)于對地址0xb0即p3的操作類似于指針P3口的固定地址是BOHMCS-51單片機(jī)存儲器的基本結(jié)構(gòu) 它有兩種1即程序存儲器和2數(shù)據(jù)存儲器從物理MSC-51有4個存儲地址空間,即片內(nèi)程序存儲器和片外程序存儲器程序存儲器受EA一橫外接電平的控制。1當(dāng)EA一橫接地時,單片機(jī)只能使用外部程序存儲器2當(dāng)EA一橫接+5v是單片機(jī)先使用內(nèi)部程序存儲器,容量不夠時自動使用外部程序存儲器。特殊功能寄存器ACC 累加器標(biāo)識符名稱地址ACC累加器E0HBb寄存器F0HPSW程序狀態(tài)字D0HSP堆棧指針81HDRTR數(shù)據(jù)指針83H 82HP080HP190HP2A0HP3B0H

11、IP中斷優(yōu)先級控制B8HIE允許中斷控制A8HTMOD定計方式控制89HTCON定計控制88HTH0定計0高位字節(jié)8CHTL0定計0低位字節(jié)8AHTH1定計1高位字節(jié)8DHTL1定計1低位字節(jié)8BHSCON串行控制98HSBUF串行數(shù)據(jù)緩沖器99HPCON電源控制87H單片機(jī)的復(fù)位電路P54頁?單片機(jī)C語言開發(fā)基礎(chǔ)#includeC注釋1種采用/*。*/可以注釋多行內(nèi)容2種采用/但只能注釋一行ANSI標(biāo)準(zhǔn)定義的關(guān)鍵字P57記憶思考P58跳過數(shù)據(jù)類型表p59頁指針型數(shù)據(jù)位類型數(shù)據(jù)空類型數(shù)據(jù)延時函數(shù)不需要返回值。X+先用x的值,再讓x加1邏輯與&邏輯或|邏輯非!按位與& 25&77=9按位或| 2

12、5|77=93按位異或 相異為1,相同出0按位取反 有0出1,有1出0左移運(yùn)算符 將一個二進(jìn)制數(shù)的各位全部左移若干位,移動的過程中,高位丟棄,低位補(bǔ)0. w=0x3a B w低位丟棄,高位補(bǔ)0賦值運(yùn)算符逗號運(yùn)算符條件運(yùn)算符強(qiáng)制轉(zhuǎn)換運(yùn)算符?實(shí)例8用不同數(shù)據(jù)類型的數(shù)據(jù)控制led的閃爍 使用無符號整型數(shù)據(jù)和無符號字符數(shù)據(jù)來設(shè)計延時函數(shù)。由于整型數(shù)據(jù)占兩個字節(jié),而無符號字符型數(shù)據(jù)僅占一個字節(jié),因此對無符號整型數(shù)據(jù)進(jìn)行操作花費(fèi)的時間就要長一些,整型數(shù)據(jù)要實(shí)現(xiàn)100次循環(huán),消耗的時間約800個機(jī)器周期。無符號100占300個。為了提高運(yùn)行效率,盡可能用無符號字符型數(shù)據(jù)。實(shí)例9 用p0口和p1口分別顯示加法

13、和減法運(yùn)算結(jié)果其實(shí)就是利用二進(jìn)制的單位數(shù)值進(jìn)行亮1不亮0的表示乘法除法就是利用二進(jìn)制轉(zhuǎn)化為十進(jìn)制再進(jìn)行處理實(shí)例12用自增運(yùn)算控制p0口8位ked的閃爍花樣只要送到p0口的數(shù)值發(fā)生變化,p0口8位led點(diǎn)亮的狀態(tài)就會發(fā)生變化??梢韵葘⒆兞康某踔邓偷絧0口延遲一段時間,再利用自增運(yùn)算使變量加1,然后將新的變量值送到p0口并延時一段時間,即可使8位led的閃爍花樣不斷變化,Unsigned char I;定義無符號字符型變量,其值不超過255運(yùn)用變量的值變化和將變量的值送到p口用來變化。For(i=0;i0)&(90xab)=1&0=0;將運(yùn)算結(jié)果送到p0口實(shí)例14用p0口顯示條件運(yùn)算的結(jié)果P0=(

14、84)?8:4; P0=8=B實(shí)例15;用p0口顯示按位異或運(yùn)算結(jié)果異或相異出1,相同出0;記憶異性才能很火熱的做出子女P0=0xa20x3c 異或要做必須上頂 很公平應(yīng)用實(shí)例16 用p0口顯示左移的運(yùn)算結(jié)果實(shí)例17萬能邏輯電路 F=EY+Z邏輯函數(shù)p77圖1專門設(shè)計數(shù)字電路,實(shí)現(xiàn)邏輯功能2通過單片機(jī)編程來實(shí)現(xiàn)邏輯功能軟件即硬件/實(shí)例17:萬能邏輯電路實(shí)驗(yàn)#include /包含單片機(jī)寄存器的頭文件sbit F=P14; /將F位定義為 P1.4sbit X=P15; /將X位定義為 P1.5sbit Y=P16; /將Y位定義為 P1.6sbit Z=P17; /將Z位定義為 P1.7voi

15、d main(void) while(1) F=(X)&Y)|Z; /將邏輯運(yùn)算結(jié)果賦給F ; 實(shí)例18用右移實(shí)現(xiàn)流水燈前提設(shè)p口為0xff八次右移一位高位丟棄低位補(bǔ)0延遲用的變量因?yàn)橐〈髷?shù)所以必須用int后面因?yàn)橐焖匀har型變量因?yàn)閱纹瑱C(jī)運(yùn)行快。所以led燈閃后要延遲。C語言語句 If(S1=0)P1=0x00;如果按鍵s按下接地(相應(yīng)位為低電平),Swich 整型 break 三者緊密While語句花括號運(yùn)用和 一般情況下,在循環(huán)體中應(yīng)該有讓循環(huán)停止的語句。?Do while 語句注意;Do和while連用 while后面的分號不能丟,它表示整個循環(huán)語句的結(jié)束Do循環(huán)語句 whi

16、le(循環(huán)式)盡量避免使用goto語句P87頁的程序軟件即硬件實(shí)例21用for語句實(shí)現(xiàn)鳴笛報警T=1/f,所以要讓蜂鳴器發(fā)出頻率f的聲音,只要讓單片機(jī)輸送周期為t的脈沖方波電平即可,讓單片機(jī)沒半個周期取反一次。半周期可通過延時來實(shí)現(xiàn)??梢酝ㄟ^循環(huán)的方式來實(shí)現(xiàn)延時,P90一重循環(huán)消耗的機(jī)器數(shù)近似N=3*n二重循環(huán)消耗的機(jī)器數(shù)近似N=3*n*m例子,如果單片機(jī)的晶振頻率為11.0592MHz,則機(jī)器的周期為1.085s,要發(fā)出1600Hz的聲音,就讓單片機(jī)每半個周期312s將輸出電平取反一次,而延時312s需要消耗機(jī)器周期數(shù)N=312/1.085286可以取300循環(huán)次數(shù)300/3=100次Voi

17、d delay(void) Unsigned char I;For(i=0;i100;i+);形成1600Hz的音頻相對應(yīng)800Hz的音頻可以i取200Sbit sound=P15;Sound=0; 即可執(zhí)行Unsigned char i;While(1)i=0;?數(shù)組是同類型的一組變量?Unsigned char code tab應(yīng)用卻是tab【】? 字符型數(shù)組中的個字符數(shù)據(jù)在單片機(jī)中是以字符的ASCII 存放的,正確的使用指針,可以有效地表示復(fù)雜的數(shù)據(jù)類型,動態(tài)分配內(nèi)存,方便的使用字符串,有效地使用數(shù)組。指針本身就具有地址還存在一個地址,Unsigned char*p;Unsigned c

18、har a;P=&a;指針數(shù)組Unsigned char a=0,1,2,3;Unsigned char *a=&a0,&a1,&a2,&a3;數(shù)組的指針Unsigned char a=0,1,2,3;Unsignde *p;P=&a0;Pi+j 為Pij實(shí)例26未細(xì)看返回值是通過return語句獲得的。如果函數(shù)無返回值,需要用void來聲明。數(shù)組作為函數(shù)參數(shù)一個數(shù)組的名字表示該數(shù)組的首地址,所以用數(shù)組名作為函數(shù)的參數(shù)時。被傳遞的數(shù)組的首地址,被調(diào)用函數(shù)的參數(shù)的形式須是定義為指針型變量。 用數(shù)組名作為函數(shù)的參數(shù)時,應(yīng)該在主調(diào)函數(shù)和被調(diào)函數(shù)中都進(jìn)行數(shù)組定義。定義的數(shù)組類型必須一致。編譯器不檢查形

19、參數(shù)組的長度p109函數(shù)?函數(shù)型指針一個函數(shù)在編譯時,就分配了一個入口地址,這個入口地址就是函數(shù)的指針,類型說明符 (*指針變量名)(形參列表)Int (*p)(int a,int b)(*p)(a,b)這些需要思考p110頁。P1=z/256;取得z的高八位P2=z/256;取得z的低八位?While(1);無限循環(huán)防止程序跑飛。實(shí)例30用有參函數(shù)控制p0口8位流水燈的流水速度P113實(shí)例31不實(shí)用?、實(shí)例32 實(shí)例33是不錯的c語言程序函數(shù)調(diào)用。練習(xí)c語言p115p116實(shí)例34不錯c語言程序p118指針數(shù)組適合用來指向若干個字符串,尤其是各列字符串長度不一致的情形,這對于字符的液晶顯示等

20、很有意義。實(shí)際運(yùn)用液晶等顯示器顯示字符時,如果液晶的接口通過P0口和單片機(jī)連接,將各字符串送入p0口,實(shí)際上就是送入液晶顯示器。實(shí)例35#includeP0=isalpha(_)?0xf0:0x0f;內(nèi)部函數(shù)文件instrins.h中有_crol_()函數(shù)實(shí)例36;應(yīng)用內(nèi)部函數(shù)文件instrins.h中有_crol_()函數(shù)來點(diǎn)亮P3口8位流水燈_crol_(15,2)的返回值為B=0x3c思考他的應(yīng)用實(shí)例37實(shí)例38感覺像是介紹函數(shù)以后?c語言應(yīng)用程序卡那可可能看看C語言編譯預(yù)處理宏定義c語言允許一個標(biāo)示符來表示一個字符串,稱為宏。P125宏定義不是c語句,所以不需加分號。可以用#undef

21、命令來終止宏定義的作用域。即對#undef后面的無用。為防止歧義應(yīng)加括號及時帶參數(shù)的函數(shù)宏和函數(shù)不同,函數(shù)是先求出實(shí)參表達(dá)式的值,然后代入形參,而帶參數(shù)的宏只是進(jìn)行簡單的字符替換。實(shí)例40文件包含應(yīng)用舉例使用頭文件為#include中有關(guān)特殊功能寄存器的定義已將P3_0定義為P3.0引腳,直接應(yīng)用P3_0就可以對P3口進(jìn)行操作了。實(shí)例41條件編譯應(yīng)用舉例 常用的條件編譯是根據(jù)某常量表達(dá)式的值的是否為真來控制編譯即#if 常量表達(dá)式 程序段1#else 程序段2#endif?思考好的應(yīng)用第五章單片機(jī)的定時器計數(shù)器當(dāng)加在定時器計數(shù)器T0或T1用作計數(shù)器時,對外接晶振產(chǎn)生的振蕩信號經(jīng)12分頻后,提供

22、給計數(shù)器,作為計數(shù)器的脈沖輸入,計數(shù)器以12分頻后的脈沖周期為基本計數(shù)單位,對輸入的脈沖進(jìn)行計數(shù),直至產(chǎn)生溢出。?P136頁到p140頁有點(diǎn)不懂。工作方式圖p135T0或T1引腳上的外部脈沖信號出現(xiàn)一個由1到0的負(fù)跳變時,計數(shù)器加1,直至計數(shù)器溢出。CPU是按順序進(jìn)行工作的。實(shí)例42用計時器T0查詢方式控制P2口的8位LED閃爍T0工作于方式1,LED燈的閃爍周期為100ms,即亮50ms,熄滅50ms;12分頻即頻率被12等分,周期即12除頻率定時器的初值設(shè)定需要進(jìn)行計算,總而言之,就是定時器必須達(dá)到頂值即65536.初值需要T0的高八位寄存器TH0和低八位寄存器TL0分別存儲存儲方法及TH

23、0= /256;TL0= %256;溢出標(biāo)志位是否為1若為1表示時間已到,否則,等待。/實(shí)例42:用定時器T0查詢方式P2口8位控制LED閃爍#include / 包含51單片機(jī)寄存器定義的頭文件/*函數(shù)功能:主函數(shù)*/void main(void) / EA=1; /開總中斷/ET0=1; /定時器T0中斷允許 TMOD=0x01; /使用定時器T0的模式1TH0=(65536-46083)/256; /定時器T0的高8位賦初值TL0=(65536-46083)%256; /定時器T0的高8位賦初值TR0=1; /啟動定時器T0TF0=0;P2=0xff; while(1)/無限循環(huán)等待查詢

24、 while(TF0=0)/查詢標(biāo)志位是否溢出 ; TF0=0; P2=P2;按位取反,實(shí)現(xiàn)led燈的閃爍 TH0=(65536-46083)/256; /定時器T0的高8位賦初值 TL0=(65536-46083)%256; /定時器T0的高8位賦初值 TFO 記憶flow溢出TRO 記憶trigger引起啟動THO 記憶high高八位TMOD 記憶mode 方式實(shí)例43,用定時器t1查詢方式控制單片機(jī)發(fā)出1kHz音頻/實(shí)例43:用定時器T1查詢方式控制單片機(jī)發(fā)出1KHz音頻#include / 包含51單片機(jī)寄存器定義的頭文件sbit sound=P37; /將sound位定義為P3.7引

25、腳/*函數(shù)功能:主函數(shù)*/void main(void) / EA=1; /開總中斷/ET0=1; /定時器T0中斷允許 TMOD=0x10; /使用定時器T1的模式1TH1=(65536-921)/256; /定時器T1的高8位賦初值TL1=(65536-921)%256; /定時器T1的高8位賦初值TR1=1; /啟動定時器T1TF1=0;while(1)/無限循環(huán)等待查詢 while(TF1=0) ; TF1=0;sound=sound; /將P3.7引腳輸出電平取反 TH1=(65536-921)/256; /定時器T0的高8位賦初值 TL1=(65536-921)%256; /定時器

26、T0的高8位賦初值 /實(shí)例44:將計數(shù)器T0計數(shù)的結(jié)果送P1口8位LED顯示#include / 包含51單片機(jī)寄存器定義的頭文件sbit S=P34; /將S位定義為P3.4引腳/*函數(shù)功能:主函數(shù)*/void main(void) / EA=1; /開總中斷/ET0=1; /定時器T0中斷允許 TMOD=0x02; /使用定時器T0的模式2TH0=256-156; /定時器T0的高8位賦初值TL0=256-156; /定時器T0的高8位賦初值TR0=1; /啟動定時器T0while(1)/無限循環(huán)等待查詢 while(TF0=0) /如果未計滿就等待 if(S=0) /按鍵S按下接地,電平

27、為0 P1=TL0; /計數(shù)器TL0加1后送P1口顯示 TF0=0; /計數(shù)器溢出后,將TF0清0 第六章單片機(jī)的中斷系統(tǒng)中斷系統(tǒng)類似寫作業(yè)定時器計時器實(shí)際上就是中斷源。MCS51單片機(jī)提供5個中斷源。外部中斷INT0一橫 編號0 由P3.2引腳輸入定時器T0 編號1外部中斷INT1一橫 編號2 由P3.3引腳輸入定時器T1 編號3串行口通信中斷RI或TI 編號4自然優(yōu)先級從上到下逐級遞減。P150 p151頁未看void Time(void) interrupt 1 using 0/實(shí)例46:用定時器T0的中斷實(shí)現(xiàn)長時間定時#include / 包含51單片機(jī)寄存器定義的頭文件sbit D1

28、=P20; /將D1位定義為P2.0引腳unsigned char Countor; /設(shè)置全局變量,儲存定時器T0中斷次數(shù)/*函數(shù)功能:主函數(shù)*/void main(void) EA=1; /開總中斷ET0=1; /定時器T0中斷允許 TMOD=0x01; /使用定時器T0的模式2TH0=(65536-46083)/256; /定時器T0的高8位賦初值TL0=(65536-46083)%256; /定時器T0的高8位賦初值TR0=1; /啟動定時器T0Countor=0; /從0開始累計中斷次數(shù)while(1)/無限循環(huán)等待中斷 ; /*函數(shù)功能:定時器T0的中斷服務(wù)程序*/void Tim

29、e0(void) interrupt 1 using 0 /“interrupt”聲明函數(shù)為中斷服務(wù)函數(shù) /其后的1為定時器T0的中斷編號;0表示使用第0組工作寄存器 Countor+; /中斷次數(shù)自加1if(Countor=20) /若累計滿20次,即計時滿1s D1=D1; /按位取反操作,將P2.0引腳輸出電平取反Countor=0; /將Countor清0,重新從0開始計數(shù) TH0=(65536-46083)/256; /定時器T0的高8位重新賦初值TL0=(65536-46083)%256; /定時器T0的高8位重新賦初值 定時器T0工作于方式1時,最大可計脈沖數(shù)次數(shù)為65536,對

30、于11。0592MHz的時鐘頻率。一個脈沖的寬度為1.085s,則最大計時長度只有1.08565536=71107s即大約71ms,要想計時更長時間,采用 軟件計時的方法設(shè)置一個變量counter 來存儲定時器T0的中斷次數(shù),即每產(chǎn)生一次中斷,使變量counter自加1,如果T0每50ms中斷一次,那當(dāng)counter自加20次時,所及時間為1s。中斷一次就要重新賦值一次控制兩個LED燈以不同的周期閃爍,第一個LED亮滅時間為100ms,第二個LED亮滅時間為400ms,所以需要設(shè)置兩個變量counter1 和counter2來分別統(tǒng)計中斷次數(shù),且都為最小的整數(shù)倍。/實(shí)例47:用定時器T1中斷控

31、制兩個LED以不同周期閃爍#include / 包含51單片機(jī)寄存器定義的頭文件sbit D1=P20; /將D1位定義為P2.0引腳sbit D2=P21; /將D2位定義為P2.1引腳unsigned char Countor1; /設(shè)置全局變量,儲存定時器T1中斷次數(shù)unsigned char Countor2; /設(shè)置全局變量,儲存定時器T1中斷次數(shù)/*函數(shù)功能:主函數(shù)*/void main(void) EA=1; /開總中斷ET1=1; /定時器T1中斷允許 TMOD=0x10; /使用定時器T1的模式1TH1=(65536-46083)/256; /定時器T1的高8位賦初值TL1=

32、(65536-46083)%256; /定時器T1的高8位賦初值TR1=1; /啟動定時器T1Countor1=0; /從0開始累計中斷次數(shù)Countor2=0; /從0開始累計中斷次數(shù) while(1)/無限循環(huán)等待中斷 ; /*函數(shù)功能:定時器T1的中斷服務(wù)程序*/void Time1(void) interrupt 3 using 0 /“interrupt”聲明函數(shù)為中斷服務(wù)函數(shù) /其后的3為定時器T1的中斷編號;0表示使用第0組工作寄存器 7 Countor1+; /Countor1自加1Countor2+; /Countor2自加1if(Countor1=2) /若累計滿2次,即計

33、時滿100ms D1=D1; /按位取反操作,將P2.0引腳輸出電平取反Countor1=0; /將Countor1清0,重新從0開始計數(shù)if(Countor2=8) /若累計滿8次,即計時滿400ms D2=D2; /按位取反操作,將P2.1引腳輸出電平取反Countor2=0; /將Countor1清0,重新從0開始計數(shù) TH1=(65536-46083)/256; /定時器T1的高8位重新賦初值TL1=(65536-46083)%256; /定時器T1的高8位重新賦初值 實(shí)現(xiàn)方法 先開總中斷EA 分支中斷ET?,選擇方式,賦初值 ,啟動定時器T?,聲明音調(diào)與頻率的關(guān)系音調(diào)低1低2低3低4

34、低5低6低7頻率262294330349392440494音調(diào)中1中2中3中4中5中6中7頻率523 587659698784880988音調(diào)高1高2高3高4高5高6高7頻率1046117513181397156817601967由于單片機(jī)的輸入輸出口只有高電平1和低電平0,因此向蜂鳴器輸送的電平信號實(shí)際是就是該音頻的方波。例如中音頻率523Hz,他的周期為1523秒,即1。93ms只要向蜂鳴器輸送周期為1.91ms的脈沖方波電平信號就能發(fā)出523Hz的音調(diào),該方波的半周期為1.912=0.995ms。為此,需要利用定時器的中斷,讓輸送給蜂鳴器的電平信號每0。955ms取反一次即可,由于本書使

35、用的單片機(jī)晶振為11.0952mhz,他的機(jī)器周期為12(111。0592)=1.085s。因此需要的機(jī)器周期總數(shù)為995s1.085s=880定時器的定時常數(shù)為880C=106s除2f1.085s=頻率THO=(8192-C)32?每分鐘為72節(jié)拍,每節(jié)拍100060ms72=833ms/實(shí)例49:用定時器T0的中斷實(shí)現(xiàn)渴望主題曲的播放#include /包含51單片機(jī)寄存器定義的頭文件sbit sound=P37; /將sound位定義為P3.7unsigned int C; /儲存定時器的定時常數(shù)/以下是C調(diào)低音的音頻宏定義#define l_dao 262 /將“l(fā)_dao”宏定義為低

36、音“1”的頻率262Hz#define l_re 286 /將“l(fā)_re”宏定義為低音“2”的頻率286Hz#define l_mi 311 /將“l(fā)_mi”宏定義為低音“3”的頻率311Hz#define l_fa 349 /將“l(fā)_fa”宏定義為低音“4”的頻率349Hz#define l_sao 392 /將“l(fā)_sao”宏定義為低音“5”的頻率392Hz#define l_la 440 /將“l(fā)_a”宏定義為低音“6”的頻率440Hz#define l_xi 494 /將“l(fā)_xi”宏定義為低音“7”的頻率494Hz/以下是C調(diào)中音的音頻宏定義#define dao 523 /將“da

37、o”宏定義為中音“1”的頻率523Hz#define re 587 /將“re”宏定義為中音“2”的頻率587Hz#define mi 659 /將“mi”宏定義為中音“3”的頻率659Hz#define fa 698 /將“fa”宏定義為中音“4”的頻率698Hz#define sao 784 /將“sao”宏定義為中音“5”的頻率784Hz#define la 880 /將“l(fā)a”宏定義為中音“6”的頻率880Hz#define xi 987 /將“xi”宏定義為中音“7”的頻率523H /以下是C調(diào)高音的音頻宏定義#define h_dao 1046 /將“h_dao”宏定義為高音“1”

38、的頻率1046Hz#define h_re 1174 /將“h_re”宏定義為高音“2”的頻率1174Hz#define h_mi 1318 /將“h_mi”宏定義為高音“3”的頻率1318Hz#define h_fa 1396 /將“h_fa”宏定義為高音“4”的頻率1396Hz#define h_sao 1567 /將“h_sao”宏定義為高音“5”的頻率1567Hz#define h_la 1760 /將“h_la”宏定義為高音“6”的頻率1760Hz#define h_xi 1975 /將“h_xi”宏定義為高音“7”的頻率1975Hz/*函數(shù)功能:1個延時單位,延時200ms*/vo

39、id delay() unsigned char i,j; for(i=0;i250;i+) for(j=0;j250;j+) ; /*函數(shù)功能:主函數(shù)*/void main(void) unsigned char i,j; /以下是渴望片頭曲的一段簡譜 unsigned int code f=re,mi,re,dao,l_la,dao,l_la, /每行對應(yīng)一小節(jié)音符 l_sao,l_mi,l_sao,l_la,dao, l_la,dao,sao,la,mi,sao, re, mi,re,mi,sao,mi, l_sao,l_mi,l_sao,l_la,dao, l_la,l_la,dao,

40、l_la,l_sao,l_re,l_mi,l_sao,re,re,sao,la,sao,fa,mi,sao,mi,la,sao,mi,re,mi,l_la,dao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,re,l_la,dao,re,mi,re,l_la,dao,re,l_la,dao,re,mi,re,0xff; /以0xff作為音符的結(jié)束標(biāo)志/以下是簡譜中每個音符的節(jié)拍/4對應(yīng)4個延時單位,2對應(yīng)2個延時單位,1對應(yīng)1個延時單位 unsigned char code JP =4,1,1,4,1,1,2, 2,2,2,2,8

41、,4,2,3,1,2,2,10,4,2,2,4,4,2,2,2,2,4, 2,2,2,2,2,2,2,10,4,4,4,2,2,4,2,4,4,4,2,2,2,2,2,2,10,4,2,2,4,4,2,2,2,2,6,4,2,2,4,1,1,4,10,4,2,2,4,1,1,4,10; EA=1; /開總中斷 ET0=1; /定時器T0中斷允許 TMOD=0x00; / 使用定時器T0的模式1(13位計數(shù)器) while(1) /無限循環(huán) i=0; /從第1個音符f0開始播放 while(fi!=0xff) /只要沒有讀到結(jié)束標(biāo)志就繼續(xù)播放 C=/fi; TH0=(8192-C)/32; /可

42、證明這是13位計數(shù)器TH0高8位的賦初值方法 TL0=(8192-C)%32; /可證明這是13位計數(shù)器TL0低5位的賦初值方法 TR0=1; /啟動定時器T0 for(j=0;jJPi;j+) /控制節(jié)拍數(shù) delay(); /延時1個節(jié)拍單位 TR0=0; /關(guān)閉定時器T0 i+; /播放下一個音符 /*函數(shù)功能:定時器T0的中斷服務(wù)子程序,使P3.7引腳輸出音頻的方波*/ void Time0(void ) interrupt 1 using 1 sound=!sound; /將P3.7引腳輸出電平取反,形成方波 TH0=(8192-C)/32; /可證明這是13位計數(shù)器TH0高8位的賦初值方法 TL0=(8192-C)%32; /可證明這是13位計數(shù)器TL0低5位的賦初值方法 、實(shí)例51本例用單片機(jī)U1從P1。4引腳輸出正脈寬為250s的方波,再利用單片機(jī)U2的into引腳檢測,驗(yàn)證方波的正脈沖寬度,有點(diǎn)沒看懂/實(shí)例51-2:定時器T0的模式2測量正脈沖寬度#include /包含51單片機(jī)寄存器定義的頭文件sbit ui=P32; /將ui位定義為P3.0(INT0)引腳,表示輸入電壓/*函數(shù)功能:主函數(shù)*/void main(v

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論