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

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

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

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

溫馨提示

  • 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)論