51單片機(jī)C語言編程基礎(chǔ)及實(shí)例_第1頁
51單片機(jī)C語言編程基礎(chǔ)及實(shí)例_第2頁
51單片機(jī)C語言編程基礎(chǔ)及實(shí)例_第3頁
51單片機(jī)C語言編程基礎(chǔ)及實(shí)例_第4頁
51單片機(jī)C語言編程基礎(chǔ)及實(shí)例_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

51單片機(jī)C語言編程基礎(chǔ)及實(shí)例單片機(jī)的外部結(jié)構(gòu):DIP40雙列直插;P0,P1,P2,P3四個8位準(zhǔn)雙向I/O引腳;(作為I/O輸入時,要先輸出高電平)電源VCC(PIN40)和地線GND(PIN20);高電平復(fù)位RESET(PIN9);(10uF電容接VCC與RESET,即可實(shí)現(xiàn)上電復(fù)位)內(nèi)置振蕩電路,外部只要接晶體至X1(PIN18)和X0(PIN19);(頻率為主頻的12倍)程序配置EA(PIN31)接高電平VCC;(運(yùn)行單片機(jī)內(nèi)部ROM中的程序)P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1單片機(jī)內(nèi)部I/O部件:(所為學(xué)習(xí)單片機(jī),實(shí)際上就是編程控制以下I/O部件,完成指定任務(wù))四個8位通用I/O端口,對應(yīng)引腳P0、P1、P2和P3;兩個16位定時計數(shù)器;(TMOD,TCON,TL0,TH0,TL1,TH1)一個串行通信接口;(SCON,SBUF)一個中斷控制器;(IE,IP)針對AT89C52單片機(jī),頭文件AT89x52.h給出了SFR特殊功能寄存器所有端口的定義。C語言編程基礎(chǔ):十六進(jìn)制表示字節(jié)0x5a:二進(jìn)制為01011010B;0x6E為01101110。如果將一個16位二進(jìn)數(shù)賦給一個8位的字節(jié)變量,則自動截斷為低8位,而丟掉高8位。++var表示對變量var先增一;var―表示對變量后減一。x|=0x0f;表示為x=x|0x0f;TMOD=(TMOD&0xf0)|0x05;表示給變量TMOD的低四位賦值0x5,而不改變TMOD的高四位。While(1);表示無限執(zhí)行該語句,即死循環(huán)。語句后的分號表示空循環(huán)體,也就是{;}在某引腳輸出高電平的編程方法:(比如P1.3(PIN4)引腳)代碼#include//該頭文檔中有單片機(jī)內(nèi)部資源的符號化定義,其中包含P1.3voidmain(void)//void表示沒有輸入?yún)?shù),也沒有函數(shù)返值,這入單片機(jī)運(yùn)行的復(fù)位入口{P1_3=1;//給P1_3賦值1,引腳P1.3就能輸出高電平VCCWhile(1);//死循環(huán),相當(dāng)LOOP:gotoLOOP;}注意:P0的每個引腳要輸出高電平時,必須外接上拉電阻(如4K7)至VCC電源。在某引腳輸出低電平的編程方法:(比如P2.7引腳)代碼#include//該頭文檔中有單片機(jī)內(nèi)部資源的符號化定義,其中包含P2.7voidmain(void)//void表示沒有輸入?yún)?shù),也沒有函數(shù)返值,這入單片機(jī)運(yùn)行的復(fù)位入口{P2_7=0;//給P2_7賦值0,引腳P2.7就能輸出低電平GNDWhile(1);//死循環(huán),相當(dāng)LOOP:gotoLOOP;}在某引腳輸出方波編程方法:(比如P3.1引腳)代碼#include//該頭文檔中有單片機(jī)內(nèi)部資源的符號化定義,其中包含P3.1voidmain(void)//void表示沒有輸入?yún)?shù),也沒有函數(shù)返值,這入單片機(jī)運(yùn)行的復(fù)位入口{While(1)//非零表示真,如果為真則執(zhí)行下面循環(huán)體的語句{P3_1=1;//給P3_1賦值1,引腳P3.1就能輸出高電平VCCP3_1=0;//給P3_1賦值0,引腳P3.1就能輸出低電平GND}//由于一直為真,所以不斷輸出高、低、高、低……,從而形成方波}將某引腳的輸入電平取反后,從另一個引腳輸出:(比如P0.4=NOT(P1.1))代碼#include//該頭文檔中有單片機(jī)內(nèi)部資源的符號化定義,其中包含P0.4和P1.1voidmain(void)//void表示沒有輸入?yún)?shù),也沒有函數(shù)返值,這入單片機(jī)運(yùn)行的復(fù)位入口{P1_1=1;//初始化。P1.1作為輸入,必須輸出高電平While(1)//非零表示真,如果為真則執(zhí)行下面循環(huán)體的語句{if(P1_1==1)//讀取P1.1,就是認(rèn)為P1.1為輸入,如果P1.1輸入高電平VCC{P0_4=0;}//給P0_4賦值0,引腳P0.4就能輸出低電平GNDelse//否則P1.1輸入為低電平GND//{P0_4=0;}//給P0_4賦值0,引腳P0.4就能輸出低電平GND{P0_4=1;}//給P0_4賦值1,引腳P0.4就能輸出高電平VCC}//由于一直為真,所以不斷根據(jù)P1.1的輸入情況,改變P0.4的輸出電平}將某端口8個引腳輸入電平,低四位取反后,從另一個端口8個引腳輸出:(比如P2=NOT(P3))代碼#include//該頭文檔中有單片機(jī)內(nèi)部資源的符號化定義,其中包含P2和P3voidmain(void)//void表示沒有輸入?yún)?shù),也沒有函數(shù)返值,這入單片機(jī)運(yùn)行的復(fù)位入口{P3=0xff;//初始化。P3作為輸入,必須輸出高電平,同時給P3口的8個引腳輸出高電平While(1)//非零表示真,如果為真則執(zhí)行下面循環(huán)體的語句{//取反的方法是異或1,而不取反的方法則是異或0P2=P3^0x0f//讀取P3,就是認(rèn)為P3為輸入,低四位異或者1,即取反,然后輸出}//由于一直為真,所以不斷將P3取反輸出到P2}注意:一個字節(jié)的8位D7、D6至D0,分別輸出到P3.7、P3.6至P3.0,比如P3=0x0f,則P3.7、P3.6、P3.5、P3.4四個引腳都輸出低電平,而P3.3、P3.2、P3.1、P3.0四個引腳都輸出高電平。同樣,輸入一個端口P2,即是將P2.7、P2.6至P2.0,讀入到一個字節(jié)的8位D7、D6至D0。第一節(jié):單數(shù)碼管按鍵顯示單片機(jī)最小系統(tǒng)的硬件原理接線圖:接電源:VCC(PIN40)、GND(PIN20)。加接退耦電容0.1uF接晶體:X1(PIN18)、X2(PIN19)。注意標(biāo)出晶體頻率(選用12MHz),還有輔助電容30pF接復(fù)位:RES(PIN9)。接上電復(fù)位電路,以及手動復(fù)位電路,分析復(fù)位工作原理接配置:EA(PIN31)。說明原因。發(fā)光二極的控制:單片機(jī)I/O輸出將一發(fā)光二極管LED的`正極(陽極)接P1.1,LED的負(fù)極(陰極)接地GND。只要P1.1輸出高電平VCC,LED就正向?qū)?導(dǎo)通時LED上的壓降大于1V),有電流流過LED,至發(fā)LED發(fā)亮。實(shí)際上由于P1.1高電平輸出電阻為10K,起到輸出限流的作用,所以流過LED的電流小于(5V-1V)/10K=0.4mA。只要P1.1輸出低電平GND,實(shí)際小于0.3V,LED就不能導(dǎo)通,結(jié)果LED不亮。開關(guān)雙鍵的輸入:輸入先輸出高一個按鍵KEY_ON接在P1.6與GND之間,另一個按鍵KEY_OFF接P1.7與GND之間,按KEY_ON后LED亮,按KEY_OFF后LED滅。同時按下LED半亮,LED保持后松開鍵的狀態(tài),即ON亮OFF滅。代碼#include#defineLEDP1^1//用符號LED代替P1_1#defineKEY_ONP1^6//用符號KEY_ON代替P1_6#defineKEY_OFFP1^7//用符號KEY_OFF代替P1_7voidmain(void)//單片機(jī)復(fù)位后的執(zhí)行入口,void表示空,無輸入?yún)?shù),無返回值{KEY_ON=1;//作為輸入,首先輸出高,接下KEY_ON,P1.6則接地為0,否則輸入為1KEY_OFF=1;//作為輸入,首先輸出高,接下KEY_OFF,P1.7則接地為0,否則輸入為1While(1)//永遠(yuǎn)為真,所以永遠(yuǎn)循環(huán)執(zhí)行如下括號內(nèi)所有語句{if(KEY_ON==0)LED=1;//是KEY_ON接下,所示P1.1輸出高,LED亮if(KEY_OFF==0)LED=0;//是KEY_OFF接下,所示P1.1輸出低,LED滅}//松開鍵后,都不給LED賦值,所以LED保持最后按鍵狀態(tài)。//同時按下時,LED不斷亮滅,各占一半時間,交替頻率很快,由于人眼慣性,看上去為半亮態(tài)}數(shù)碼管的接法和驅(qū)動原理一支七段數(shù)碼管實(shí)際由8個發(fā)光二極管構(gòu)成,其中7個組形構(gòu)成數(shù)字8的七段筆畫,所以稱為七段數(shù)碼管,而余下的1個發(fā)光二極管作為小數(shù)點(diǎn)。作為習(xí)慣,分別給8個發(fā)光二極管標(biāo)上記號:a,b,c,d,e,f,g,h。對應(yīng)8的頂上一畫,按順時針方向排,中間一畫為g,小數(shù)點(diǎn)為h。我們通常又將各二極與一個字節(jié)的8位對應(yīng),a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7),相應(yīng)8個發(fā)光二極管正好與單片機(jī)一個端口Pn的8個引腳連接,這樣單片機(jī)就可以通過引腳輸出高低電平控制8個發(fā)光二極的亮與滅,從而顯示各種數(shù)字和符號;對應(yīng)字節(jié),引腳接法為:a(Pn.0),b(Pn.1),c(Pn.2),d(Pn.3),e(Pn.4),f(Pn.5),g(Pn.6),h(Pn.7)。如果將8個發(fā)光二極管的負(fù)極(陰極)內(nèi)接在一起,作為數(shù)碼管的一個引腳,這種數(shù)碼管則被稱為共陰數(shù)碼管,共同的引腳則稱為共陰極,8個正極則為段極。否則,如果是將正極(陽極)內(nèi)接在一起引出的,則稱為共陽數(shù)碼管,共同的引腳則稱為共陽極,8個負(fù)極則為段極。以單支共陰數(shù)碼管為例,可將段極接到某端口Pn,共陰極接GND,則可編寫出對應(yīng)十六進(jìn)制碼的七段碼表字節(jié)數(shù)據(jù)如右圖:16鍵碼顯示的程序我們在P1端口接一支共陰數(shù)碼管SLED,在P2、P3端口接16個按鍵,分別編號為KEY_0、KEY_1到KEY_F,操作時只能按一個鍵,按鍵后SLED顯示對應(yīng)鍵編號。代碼#include#defineSLEDP1#defineKEY_0P2^0#defineKEY_1P2^1#defineKEY_2P2^2#defineKEY_3P2^3#defineKEY_4P2^4#defineKEY_5P2^5#defineKEY_6P2^6#defineKEY_7P2^7#defineKEY_8P3^0#defineKEY_9P3^1#defineKEY_AP3^2#defineKEY_BP3^3#defineKEY_CP3^4#defineKEY_DP3^5#defineKEY_EP3^6#defineKEY_FP3^7CodeunsignedcharSeg7Code[16]=//用十六進(jìn)數(shù)作為數(shù)組下標(biāo),可直接取得對應(yīng)的七段編碼字節(jié)//0123456789AbCdEF{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidmain(void){unsignedchari=0;//作為數(shù)組下標(biāo)P2=0xff;//P2作為輸入,初始化輸出高P3=0xff;//P3作為輸入,初始化輸出高While(1){if(KEY_0==0)i=0;if(KEY_1==0)i=1;if(KEY_2==0)i=2;if(KEY_3==0)i=3;if(KEY_4==0)i=4;if(KEY_5==0)i=5;if(KEY_6==0)i=6;if(KEY_7==0)i=7;if(KEY_8==0)i=8;if(KEY_9==0)i=9;if(KEY_A==0)i=0xA;if(KEY_B==0)i=0xB;if(KEY_C==0)i=0xC;if(KEY_D==0)i=0xD;if(KEY_E==0)i=0xE;if(KEY_F==0)i=0xF;SLED=Seg7Code[i];//開始時顯示0,根據(jù)i取應(yīng)七段編碼}}第二節(jié):雙數(shù)碼管可調(diào)秒表解:只要滿足題目要求,方法越簡單越好。由于單片機(jī)I/O資源足夠,所以雙數(shù)碼管可接成靜態(tài)顯示方式,兩個共陰數(shù)碼管分別接在P1(秒十位)和P2(秒個位)口,它們的共陰極都接地,安排兩個按鍵接在P3.2(十位數(shù)調(diào)整)和P3.3(個位數(shù)調(diào)整)上,為了方便計時,選用12MHz的晶體。為了達(dá)到精確計時,選用定時器方式2,每計數(shù)250重載一次,即250us,定義一整數(shù)變量計數(shù)重載次數(shù),這樣計數(shù)4000次即為一秒。定義兩個字節(jié)變量S10和S1分別計算秒十位和秒個位。編得如下程序:代碼#includeCodeunsignedcharSeg7Code[16]=//用十六進(jìn)數(shù)作為數(shù)組下標(biāo),可直接取得對應(yīng)的七段編碼字節(jié)//0123456789AbCdEF{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voidmain(void){unsignedintus250=0;unsignedchars10=0;unsignedchars1=0;unsignedcharkey10=0;//記憶按鍵狀態(tài),為1按下unsignedcharkey1=0;//記憶按鍵狀態(tài),為1按下//初始化定時器Timer0TMOD=(TMOD&0xF0)|0x02;TH1=-250;//對于8位二進(jìn)數(shù)來說,-250=6,也就是加250次1時為256,即為0TR1=1;while(1){//----------循環(huán)1P1=Seg7Code[s10];//顯示秒十位P2=Seg7Code[s1];//顯示秒個位while(1){//----------循環(huán)2//計時處理if(TF0==1){TF0=0;if(++us250>=4000){us250=0;if(++s1>=10){s1=0;if(++s10>=6)s10=0;}break;//結(jié)束“循環(huán)2”,修改顯示}}//按十位鍵處理P3.2=1;//P3.2作為輸入,先要輸出高電平if(key10==1){//等松鍵if(P3.2==1)key10=0;}else{//未按鍵if(P3.2==0){key10=1;if(++s10>=6)s10=0;break;//結(jié)束“循環(huán)2”,修改顯示}}//按個位鍵處理P3.3=1;//P3.3作為輸入,先要輸出高電平if(key1==1)//等松鍵{if(P3.3==1)key1=0;}else{//未按鍵if(P3.3==0){key1=1;if(++s1>=10)s1=0;break;//結(jié)束“循環(huán)2”,修改顯示}}}//循環(huán)2’end}//循環(huán)1’end}//main’end第三節(jié):十字路口交通燈如果一個單位時間為1秒,這里設(shè)定的十字路口交通燈按如下方式四個步驟循環(huán)工作:60個單位時間,南北紅,東西綠;10個單位時間,南北紅,東西黃;60個單位時間,南北綠,東西紅;10個單位時間,南北黃,東西紅;解:用P1端口的6個引腳控制交通燈,高電平燈亮,低電平燈滅。代碼#include//sbit用來定義一個符號位地址,方便編程,提高可讀性,和可移植性sbitSNRed=P1^0;//南北方向紅燈sbitSNYellow=P1^1;//南北方向黃燈sbitSNGreen=P1^2;//南北方向綠燈sbitEWRed=P1^3;//東西方向紅燈sbitEWYellow=P1^4;//東西方向黃燈sbitEWGreen=P1^5;//東西方向綠燈/*用軟件產(chǎn)生延時一個單位時間*/voidDelay1Unit(void){unsignedinti,j;for(i=0;i<1000;i++)for(j<0;j<1000;j++);//通過實(shí)測,調(diào)整j循環(huán)次數(shù),產(chǎn)生1ms延時//還可以通過生成匯編程序來計算指令周期數(shù),結(jié)合晶體頻率來調(diào)整j循環(huán)次數(shù),接近1ms}/*延時n個單位時間*/voidDelay(unsignedintn){for(;n!=0;n--)Delay1Unit();}voidmain(void){while(1){SNRed=0;SNYellow=0;SNGreen=1;EWRed=1;EWYellow=0;EWGreen=0;Delay(60);SNRed=0;SNYellow=1;SNGreen=0;EWRed=1;EWYellow=0;EWGreen=0;Delay(10);SNRed=1;SNYellow=0;SNGreen=0;EWRed=0;EWYellow=0;EWGreen=1;Delay(60);SNRed=1;SNYellow=0;SNGreen=0;EWRed=0;EWYellow=1;EWGreen=0;Delay(10);}}第四節(jié):數(shù)碼管驅(qū)動顯示“12345678”P1端口接8聯(lián)共陰數(shù)碼管SLED8的段極:P1.7接段h,…,P1.0接段aP2端口接8聯(lián)共陰數(shù)碼管SLED8的段極:P2.7接左邊的共陰極,…,P2.0接右邊的共陰極方案說明:晶振頻率fosc=12MHz,數(shù)碼管采用動態(tài)刷新方式顯示,在1ms定時斷服務(wù)程序中實(shí)現(xiàn)代碼#includeunsignedcharDisBuf[8];//全局顯示緩沖區(qū),DisBuf[0]對應(yīng)右SLED,DisBuf[7]對應(yīng)左SLED,voidDisplayBrush(void){codeunsignedcharcathode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//陰極控制碼CodeunsignedcharSeg7Code[16]=//用十六進(jìn)數(shù)作為數(shù)組下標(biāo),可直接

溫馨提示

  • 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

提交評論