單片機(jī)c語言編程_第1頁
單片機(jī)c語言編程_第2頁
單片機(jī)c語言編程_第3頁
單片機(jī)c語言編程_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

單片機(jī)c語言編程

一、系統(tǒng)的編寫程序許多學(xué)生認(rèn)為學(xué)習(xí)單詞很困難。這里將結(jié)合例文介紹怎樣編寫一個簡單的單片機(jī)C語言程序。(電路很簡單,已經(jīng)用文字描述了這里不再畫出了。)二、按一次摩擦法顯示數(shù)值用兩位數(shù)碼管顯示00~99十進(jìn)制數(shù),上電復(fù)位后顯示00;每按一次按鍵Key1顯示的數(shù)值加1;每按一次按鍵Key2顯示的數(shù)值減1;每按一次按鍵Key3顯示的數(shù)值清零;每按一次按鍵Key4數(shù)值在原來的基礎(chǔ)上每秒自動加1;再次按下按鍵Key4時,數(shù)值停止自動加1,保持原來的數(shù)值。三、控制鎖存器的使能端1是頭文件,內(nèi)部定義了單片機(jī)內(nèi)部的特殊功能寄存器和位寄存器。常用的有3個,Reg51.h、Reg52.h和Intrins.h。頭文件有兩種表示方法,#include<reg51.h>和#include”reg51.h”一般用前者。注意:(1)編寫程序時要將輸入法切換成英文半角狀態(tài)。(2)每次編譯前要先保存文件,避免編譯時,Keil錯誤運(yùn)行導(dǎo)致計算機(jī)死機(jī)而丟失文件。2和3為宏定義語句。格式為:#define新名稱原內(nèi)容。如例文中,宏定義的目的就是用unit來代替unsignedint,程序后面再定義變量numt0和num時寫成了ucharnumt0,unm,程序簡潔了。注意:(1)宏定義后沒有分號。(2)對于同一個內(nèi)容,宏定義只能定義一次。(3)在自定義新名稱時不能使用單片機(jī)默認(rèn)的關(guān)鍵詞和特殊寄存器的名稱。4至9Sbit----聲明某一個特殊功能寄存器的某一位。與頭文件中定義位的用法相同。自定義的地址要與硬件連接相對應(yīng)。例sbitkey1=P1^0,說明按鍵1連接的是單片機(jī)的P1^0口。8和9定義數(shù)碼管位鎖存器的使能控制端和數(shù)碼管段鎖存器的使能控制端。表明單片機(jī)的P1^5口和P1^6口分別連接兩個鎖存器的使能端,控制寄存器的鎖存功能,實現(xiàn)鎖存器對數(shù)據(jù)的保護(hù)。注意:(1)P口由用戶設(shè)計的硬件接線決定。(2)P口中的P要大寫。10一個顯示用的數(shù)組,與C語言的區(qū)別是數(shù)組類型后有Code關(guān)鍵字,Code表示編碼。例Uchar(Unsignedchar)表示數(shù)組中元素的類型。Table數(shù)組名,定義時不能和關(guān)鍵字相同,Table后的括號中要注明數(shù)組中元素的個數(shù)。一般不必寫;編譯器在編譯時會自動計算出元素個數(shù),以分配相應(yīng)的存儲空間。大括號中為數(shù)組中的元素,每個元素占用一個字符空間,送入數(shù)碼管就會顯示相應(yīng)的數(shù)字,0x3f至0x6f是數(shù)字0至9的ASCII碼。注意:數(shù)組中各元素之間用逗號隔開。14定義兩個字符型變量,之間用逗號隔開最后加分號。15顯示子函數(shù)的聲明,子函數(shù)可以寫在主函數(shù)的前面或后面;如子函數(shù)在主函數(shù)后面,必須在主函數(shù)前面加上子函數(shù)的聲明。如例文,將返回值特性,函數(shù)名及后面的小括號完全復(fù)制。若是無參函數(shù),小括號中為空;若是有參函數(shù),需要在小括號里依次寫上參數(shù)類型,參數(shù)可以省略。當(dāng)子函數(shù)在主函數(shù)前面時可以省去聲明,寫函數(shù)體的同時就已經(jīng)相當(dāng)于聲明了函數(shù)本身。注意:例文中函數(shù)voiddisplay(ucharaddnum)中調(diào)用了函數(shù)voiddelayms(uintxms),是子程序調(diào)用下一級子程序。16自定義顯示子函數(shù),void表示是個無返回值的子函數(shù)執(zhí)行后不返回任何的數(shù)據(jù)。Display子函數(shù)的名稱,定義時不要和關(guān)鍵字相同。括號中內(nèi)容是函數(shù)的參數(shù),如括號中沒有任何數(shù)據(jù)或符號,為一個無參數(shù)函數(shù)。例文中,括號內(nèi)有數(shù)據(jù)即此函數(shù)為有參數(shù)函數(shù),參數(shù)addnum的變量類型為uchar類型,又稱函數(shù)的形參。調(diào)用函數(shù)時用數(shù)據(jù)代替此形參,這個數(shù)據(jù)稱為實參,實參代替形參后,在子函數(shù)中所有和形參名相同的變量都將被實參所代替。18定義了分別存儲十位和個位數(shù)據(jù)的無符號字符型變量。19和20在函數(shù)定義的參數(shù)中分離出十位和個位數(shù)據(jù)?!?”算術(shù)運(yùn)算符,用來求模運(yùn)算;例11/3=3,即11中有多少個整數(shù)3。2位數(shù)求10的模有特殊意義是分離十位數(shù),同理“%”求余運(yùn)算符,例11%3=2,而2位數(shù)求10的余是分離個位數(shù)。22至29送數(shù)碼管個位數(shù)據(jù)。需要用兩個鎖存器74LS373起到對數(shù)據(jù)的鎖存,片選使能端分別和單片機(jī)的P1^4和P1^5口連接;一個鎖存器控制數(shù)碼管的位選信號,另一個寄存器控制數(shù)碼管的段選信號。兩寄存器數(shù)據(jù)輸入端都和單片機(jī)的P0口相連??刂贫芜x信號的寄存器數(shù)據(jù)輸出端和兩個數(shù)碼管的8個LED的引腳相連,控制位選信號的寄存器數(shù)據(jù)輸出端最低兩位分別和數(shù)碼管的的兩個公共端相連;這是由于采用數(shù)碼管的動態(tài)掃描方式。首先22送段選信號給段選鎖存器,當(dāng)鎖存器的使能端為高電平1時,打開鎖存器,通過單片機(jī)P0口向鎖存器寫入數(shù)據(jù)。23向鎖存器送個位數(shù)據(jù);上面定義數(shù)組中的數(shù)據(jù)為共陰極數(shù)碼管的顯示數(shù)據(jù),分離出的數(shù)據(jù)便與數(shù)組元素相對應(yīng)。51單片機(jī)的數(shù)據(jù)輸出端是P0口,P0口不僅可以作為普通的I/O口使用,還是單片機(jī)數(shù)據(jù)和低8位地址的輸出端。P2口是高8位地址的輸出端。24關(guān)閉段選信號送低電平0;否則,它會隨著P0口數(shù)據(jù)的改變而相應(yīng)改變。25是消隱程序,防止打開位選鎖存器時原來的段選鎖存器的數(shù)據(jù)通過位選鎖存器造成混亂。26送位選信號高電平1給位選鎖存器開啟鎖存器和段選鎖存器意義相同。27是選通顯示個位的數(shù)碼管,此時個位數(shù)碼管便顯示相應(yīng)的數(shù)據(jù),因為數(shù)據(jù)已經(jīng)儲存在段選鎖存器中。28送低電平0關(guān)閉位選鎖存器,使鎖存器保持當(dāng)前的數(shù)據(jù)而不會跟隨P0口的數(shù)據(jù)而變化。29為視覺延時,適當(dāng)?shù)难訒r可使顯示的數(shù)據(jù)更穩(wěn)定、清晰。31至38是送十位數(shù)碼管顯示的十位數(shù)據(jù)和送個位數(shù)據(jù)相同。注意:(1)送完段選信號和位選信號給鎖存器時要關(guān)閉鎖存器避免程序混亂。(2)送段選信號之后或位選信號之前要編寫消隱程序避免造成短暫的視覺混亂。(3)程序控制端的編寫要和單片機(jī)與周圍電氣元件的連接相對應(yīng)。23和32是軟件譯碼。(4)每個數(shù)碼管顯示之間要有適當(dāng)?shù)难訒r,時間過短或過長都會導(dǎo)致顯示混亂。注意:(1)當(dāng)for語句的內(nèi)部語句只有一句時,可省去大括號。(2)延時子函數(shù)延時為大概值,如果要精確的延時使用單片機(jī)內(nèi)部定時器延時。46至53初始化子函數(shù)。48設(shè)定單片機(jī)定時器T1的工作方式為1。TMOD是單片機(jī)定時器/計數(shù)器工作方式寄存器。這設(shè)為工作方式1,為16位定時器/計數(shù)器,按單片機(jī)外接12MHz的時鐘頻率,計算公式TH0=(65536-50000)/256分離高8位、TL0=(65536-50000)%256分離低8位。51和52開定時器1中斷,EA和ET1分別是單片機(jī)特殊功能寄存器中中斷允許控制寄存器中的第七位和第三位。當(dāng)EA=1時中斷總允許;當(dāng)ET1為1時開啟該中斷。注意:單片機(jī)中特殊功能寄存器每位的含義要知道。要先賦初值給定時器,然后開啟定時器,否則,誤差較大。58去抖動延時。有時按鍵會受到外部因素或自身機(jī)械特性的影響,按鍵在按下或釋放的瞬間會有抖動現(xiàn)象,一般為5到15ms。也有專門的去抖電路芯片,讀者可以通過示波器去觀察按鍵的抖動現(xiàn)象的波形。64等待按鍵釋放語句。當(dāng)按下按鍵,按鍵為低電平0,而!key1(取反符號)為高電平1;while語句后直接跟分號說明是個空語句,只要!key1始終為高電平1,while語句就始終執(zhí)行這個空語句,直到按鍵釋放后!key1變?yōu)榈碗娖?,跳出while循環(huán)語句。如去掉按鍵釋放語句,由于單片機(jī)執(zhí)行代碼的速度非???且是循環(huán)檢測按鍵,按下按鍵的時間比單片機(jī)的執(zhí)行速度大的多,單片機(jī)會多次檢測到按鍵被按下,從而造成結(jié)果的錯誤。按鍵2至4的程序與按鍵1相似。93開啟或停止定時器1。TR1是單片機(jī)特殊功能寄存器TCON中的一位,作用是當(dāng)TR1為高點(diǎn)平1時,開啟單片機(jī)內(nèi)部定時器/計數(shù)器1;當(dāng)為低電平0時,則關(guān)閉。符號“~”是取反的意思。和“!”的區(qū)別是“!”是關(guān)系運(yùn)算符,類似于“==”的用法,“~”是位運(yùn)算符,類似于賦值符號。注意:相似或意義相近的運(yùn)算符不要亂用。例如:“==”和“=”,“!”和“~”。97為主函數(shù)。主函數(shù)非常簡單,只調(diào)用三個函數(shù)就OK了。這是編程的一個習(xí)慣,把整個程序分成幾個相關(guān)聯(lián)的部分,如按鍵掃描部分、數(shù)據(jù)顯示部分、延時部分、初始化部分,每一部分看上去思路都非常清晰,也便于調(diào)試和查找錯誤,這同時也大大簡化了主函數(shù)的任務(wù),因此主函數(shù)只需直接調(diào)用這些子函數(shù)就可以了。注意:主函數(shù)調(diào)用子函數(shù)的前后順序要符合事物的前因后果。106定時器中斷的子函數(shù),每進(jìn)一次中斷都要重裝一次初值,以便下次進(jìn)入中斷使用。111判斷中斷次數(shù)是否為20次,因為例文設(shè)定的定時器中斷的時間是50ms,而功能需要1s的間隔,所以定時器中斷要滿足20次。40延時子函數(shù),是帶參數(shù)的函數(shù)。子函數(shù)中是兩個嵌套的for語句,兩個for語句是不同的。一個后面有分號而另一個沒有。第一個for語句后沒有分號,編譯器默認(rèn)第二個for語句是第一個for語句的內(nèi)部語句,而第二個for語句的內(nèi)部什么都沒有,即為空語句;程序在執(zhí)行時,第一個for語句中的i每減一次,第二個for語句執(zhí)行110次。如果需要更長的延時,可以進(jìn)行3層、4層的嵌套,或改變變量的類型和增大變量的初值都是可以的。54鍵盤掃描子函數(shù)。函數(shù)中的“==”符號與“=”符號不同,“==”是關(guān)系運(yùn)算符。用于比較兩個數(shù)值或表達(dá)式大小是否相等,在比較語句中做為判斷的條件是否成立而去執(zhí)行相應(yīng)的代碼。例文中,if(key1==0)判

溫馨提示

  • 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

提交評論