《單片機(jī)C語言程序設(shè)計(jì)》課件第四部分 單片機(jī)實(shí)驗(yàn)基礎(chǔ)篇_第1頁
《單片機(jī)C語言程序設(shè)計(jì)》課件第四部分 單片機(jī)實(shí)驗(yàn)基礎(chǔ)篇_第2頁
《單片機(jī)C語言程序設(shè)計(jì)》課件第四部分 單片機(jī)實(shí)驗(yàn)基礎(chǔ)篇_第3頁
《單片機(jī)C語言程序設(shè)計(jì)》課件第四部分 單片機(jī)實(shí)驗(yàn)基礎(chǔ)篇_第4頁
《單片機(jī)C語言程序設(shè)計(jì)》課件第四部分 單片機(jī)實(shí)驗(yàn)基礎(chǔ)篇_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第四部分單片機(jī)實(shí)驗(yàn)基礎(chǔ)篇前

C語言主要有三種結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。不管哪幾種結(jié)構(gòu),所有的程序都是從main函數(shù)開始的。本章節(jié)通過五個(gè)項(xiàng)目的實(shí)例講解,復(fù)習(xí)第三部分中C語言基礎(chǔ):常量和變量;運(yùn)算符與表達(dá)式;分支語句,包括:if、if-else、switch;循環(huán)語句,包括:while、do-while、for;函數(shù)的調(diào)用等。4.1LED顯示LED是日常生活中運(yùn)用廣泛的顯示器件之一,包括LED燈、數(shù)碼管等。本小節(jié)我們通過LED燈程序,學(xué)習(xí)IO口的位控制、并行操作?!纠?.1.1】硬件電路如圖4.1.1所示,參數(shù)如表4.1.1。設(shè)計(jì)一個(gè)LED閃爍燈:讓P1.0為高電平,延時(shí)一段時(shí)間后,讓P1.0為低電平。以此循環(huán)就可以讓D1閃爍。表4.1.1序號(hào)元件元件參數(shù)Proteus中元件名1電阻R1:10K;R2:300歐RES2電容C1:10uF;C2、C3:30PCAP3LEDD1:紅色LED-RED4晶振X1:12MCRYSTAL5單片機(jī)AT89C51AT89C51圖1.1.2上拉電阻4.1LED顯示#include<REGX52.H>//單片機(jī)頭文件,包含相關(guān)特殊寄存器物理映射。voiddelay()//延時(shí)程序{unsignedinti=50000;//局部變量i。while(i--);}voidmain(void){while(1)//死循環(huán){P1_0=1;//讓P1.0輸出高電平,LED滅。delay();//延時(shí)函數(shù)的調(diào)用P1_0=0;//讓P1.0輸出低電平,LED亮。delay();//延時(shí)函數(shù)的調(diào)用}}//////////////////////////////////////////////////////////////////////////////此后,雙擊Proteus中AT89C51,將ProgramFile路徑指向KeiluVision4生成的HEX文件,即可在Proteus中看到仿真結(jié)果。圖4.1.1中單片機(jī)18、19腳的晶振電路和9腳的復(fù)位電路在仿真中可以不用畫出。4.1LED顯示【例4.1.2】為了更好的描述程序與硬件的關(guān)系,例4.1.1的程序經(jīng)常使用sbit、define等語句讓程序通俗易懂、方便修改。#include<REGX52.H>#defineon0//用define定義on為0,以下所有on都表示為0。#defineoff1//用define定義off為0,以下所有off都表示為1。sbitLED1=P1^0;//用sbit定義LED1為單片機(jī)的P1.0引腳voiddelay(void)//延時(shí)程序{unsignedinti=50000;//局部變量i。while(i--);}voidmain(void){while(1)//死循環(huán){LED1=off;//讓P1.0輸出高電平,LED滅。delay();//延時(shí)函數(shù)的調(diào)用LED1=on;//讓P1.0輸出低電平,LED亮。delay();//延時(shí)函數(shù)的調(diào)用}}4.1LED顯示【例4.1.3】硬件電路如圖4.1.3所示,設(shè)計(jì)一個(gè)流水燈程序:讓LED從上往下做流水動(dòng)作,如表格4.1.3所示,用于練習(xí)并行口的程序編寫。首先讓P1值為0xfe,延時(shí)一段時(shí)間后讓P1值為0xfd,以此類推到P1值為0x7f,并以此循環(huán)。(圖4.1.3中R1是排阻,在Proteus中的元件名為:respack-8。單片機(jī)的外部晶振電路、復(fù)位電路在仿真中都可省略。)LEDD7D6D5D4D3D2D1D0P1值P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.00xfe111111100xfd111111010xfb111110110xf7111101110xef111011110xdf110111110xbf101111110x7f01111111表格4.1.3圖4.1.3#include<REGX51.H>voiddelay(void)//延時(shí)函數(shù){unsignedinti=50000;//局部變量i。while(i--);}voidmain(){while(1){P1=0xfe;delay();P1=0xfd;delay();P1=0xfb;delay();P1=0xf7;delay();P1=0xef;delay();P1=0xdf;delay();P1=0xbf;delay();P1=0x7f;delay();}}4.1LED顯示【例4.1.4】上例4.1.3中程序可以采用調(diào)用數(shù)組的方法來實(shí)現(xiàn)。只要將P1的值存放于數(shù)組numtab[]中,并按順序調(diào)用即可。此時(shí)可聲明一個(gè)變量t,讓t自加并調(diào)用numtab[]依次傳輸給P1。#include<REGX51.H>unsignedcharnumtab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};voiddelay(void)//延時(shí)函數(shù){unsignedinti=50000;//局部變量i。while(i--);}voidmain(void){unsignedchart;//局部變量t。while(1){P1=numtab[t];//將數(shù)組numtab[t]的值傳輸給P1。//P1=numtab[3];相當(dāng)于P1=0xf7;delay();//延時(shí)函數(shù)的調(diào)用t++;//t自加。if(t>=8)i=0;//由于數(shù)組的值僅有8個(gè),所以t的值不得大于等于8,//否則P1的值將是不確定值。}}////////////////////////////////////////////////////////////////////4.2獨(dú)立按鍵

按鍵在電路設(shè)計(jì)中經(jīng)常使用到,比如:時(shí)鐘時(shí)間的調(diào)整、某種狀態(tài)的確定或切換?,F(xiàn)實(shí)中按鍵的各類很多,現(xiàn)的實(shí)物圖如圖4.2.1所示。

由于按鍵接觸采用物理接觸,所以在鍵按下時(shí)會(huì)出現(xiàn)抖動(dòng)問題如圖4.2.2。單片機(jī)在讀取按鍵狀態(tài)時(shí)應(yīng)采用延時(shí)法做防抖處理:當(dāng)判斷按鍵按下時(shí)延時(shí)10ms左右,等到鍵穩(wěn)定后再一次判斷鍵是否按下再做相關(guān)處理。圖4.2.2圖4.2.14.2獨(dú)立按鍵【例4.2.1】硬件電路如圖4.2.3所示,設(shè)計(jì)一個(gè)程序:采用單片機(jī)的P3.0讀取獨(dú)立按鍵的邏輯狀態(tài),通過P2.7的控制LED:當(dāng)按鍵按下時(shí)讓LED亮,否則不亮(按鍵在Proteus庫中的元件名為:BUTTON)。圖4.2.34.2獨(dú)立按鍵#include<REGX51.H>sbitkey=P3^0; //定義硬件的接口sbitled=P2^7;#definekey_on0//定義相關(guān)常量#definekey_off1#defineled_on0#defineled_off1voiddelay()//延時(shí)函數(shù){unsignedinti=10000;while(i--);}voidmain(){while(1) //死循環(huán){key=key_off; //將P3.0電平拉高,以方便檢測期是否為低電平。if(key==key_on)//判斷P3.0是否為低電平。{delay(); //延時(shí)程序,防抖等待鍵穩(wěn)定。if(key==key_on) { led=led_on;//當(dāng)有鍵按下時(shí),讓LED亮。 } while(key==key_on);//松手檢測,等待手放開按鍵彈起。}elseled=led_off;//當(dāng)無鍵按下時(shí),LED滅。}}說明:上訴程序中while(key==key_on)是對(duì)按鍵按下的等待:當(dāng)有鍵按下時(shí),LED燈亮后執(zhí)行到該語句,此時(shí)key的值為0也就是key_on,此時(shí)該語句相當(dāng)于while(1),程序?qū)⒁恢蓖S谠撎?;?dāng)鍵無按下時(shí),key的值不為1,while(key==key_on)不成立,程序繼續(xù)往下執(zhí)行。4.3靜態(tài)數(shù)碼管顯示數(shù)碼管是將LED按一定的排列封裝起來,如圖4.3.0所示數(shù)碼為8段數(shù)碼管(由8個(gè)LED組成,分別為a,b,c,d,e,f,g,DP)。按公共端結(jié)構(gòu)可將其分為兩類:共陰數(shù)碼管和共陽數(shù)碼管。共陰數(shù)碼管是將LED的陰極連接在一起,共陽數(shù)碼管是將LED的陽極連接在一起。圖4.3.04.3靜態(tài)數(shù)碼管顯示【例4.3.1】硬件電路如圖4.3.2所示,設(shè)計(jì)一個(gè)共陰數(shù)碼管顯示程序:讓數(shù)碼管從0顯示到9并以此循環(huán)。如表格4.3.1所示,只要單片機(jī)I/O引腳給適合的值,數(shù)碼管就會(huì)顯示相對(duì)的數(shù)字。比如要顯示0:讓數(shù)碼管的a、b、c、d、e、f段為高電平,g、DP為低電平,數(shù)碼管將會(huì)顯示0;對(duì)應(yīng)的單片機(jī)I/O引腳只需讓P1.0~P1.5為高電平,P1.6、P1.7為低電平,P1的值為0x3f。由此,就可以推出顯示其他數(shù)字時(shí)P1的值。(共陰數(shù)碼管在Proteus庫中的元件名為:7SEG-COM-CAT-GRN)。表4.3.1數(shù)碼管DPgfedcba

顯示內(nèi)容P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0P1值0001111110x3f1000001100x062010110110x5b3010011110x4f4011001100x665011011010x6d6011111010x7d7000001110x078011111110x7f9011011110x6f圖4.3.14.3靜態(tài)數(shù)碼管顯示#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管代碼表voiddelay()//延時(shí)函數(shù){unsignedinti=50000;while(i--);}voidmain(){unsignedchart;while(1){P1=num[t++];if(t>9)t=0;//當(dāng)t大于9時(shí)將t清零。delay();}}////////////////////////////////////////////////////////////////////4.3靜態(tài)數(shù)碼管顯示【例4.3.2】硬件電路如圖4.3.2所示,采用獨(dú)立按鍵和數(shù)碼管設(shè)計(jì)一個(gè)程序?qū)崿F(xiàn)以下功能:按鍵每按一次,數(shù)碼管加1;當(dāng)數(shù)碼管加到9后又從0開始。圖4.3.1#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管代碼表sbitkey=P2^0; //定義硬件的接口#definekey_on0#definekey_off1voiddelay()//延時(shí)程序,用于按鍵防抖。{unsignedinta=10000;while(a--);}voidmain(){unsignedchari;//定義i,用于計(jì)算按鍵按下次數(shù)。while(1){P1=num[i];//用P1顯示按鍵按下的次數(shù)。if(key==key_on)//檢測按鍵是否按下。{ delay();//防抖 if(key==key_on) { i++;if(i>9)i=0;//每次按鍵按下i加1;如果i等于10,i變?yōu)?。 } while(key==key_on);//檢測按鍵是否松手放開。}}}///////////////////////////////////////////////////////////////////////////4.4動(dòng)態(tài)數(shù)碼管顯示將2位及以上數(shù)碼管的數(shù)據(jù)端分別接在一起,即第一個(gè)數(shù)碼管的a段與第二個(gè)數(shù)碼管的a段接起來(可以多個(gè)數(shù)碼管),以此接完所有LED,并留出每位數(shù)碼管的公共端如圖4.4.0。動(dòng)態(tài)方式顯示時(shí),各數(shù)碼管分時(shí)輪流選通,在某一時(shí)刻只選通一位數(shù)碼管,并送出相應(yīng)的字型碼(如表4.3.1),在另一時(shí)刻選通另一位數(shù)碼管,并送出相應(yīng)的字型碼,依此規(guī)律循環(huán),即可使各位數(shù)碼管顯示將要顯示的不同字符。但由于人眼存在視覺暫留效應(yīng),只要每位顯示間隔足夠短就可以給人同時(shí)顯示的感覺。一般的,每位數(shù)碼管顯示周期20ms即可,周期太短會(huì)有重影,周期太長會(huì)有閃爍現(xiàn)象。圖4.4.04.4動(dòng)態(tài)數(shù)碼管顯示【例4.4.1】硬件電路如圖4.4.1所示,采用動(dòng)態(tài)顯示的方式讓數(shù)碼管從0顯示到99,并以循環(huán)。2位數(shù)碼管在Proteus中為:7SEG-MPX2-CC-BLUE。圖4.4.1#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//數(shù)碼管代碼表voiddelay(){unsignedinta=500;while(a--);}voidmain(){unsignedchari,j;//定義i,j;while(1){j++;if(j>100){j=0;i++;if(i>99)i=0;}P1=num[i/10];P3_0=0;P3_1=1;delay();P3_0=1;P3_1=1;//消影處理;P1=num[i%10];P3_0=1;P3_1=0;delay(); P3_0=1;P3_1=1;//消影處理;}}////////////////////////////////////////////////////////////////////////////以上程序定義i,讓i自加。通過if語句判斷:當(dāng)i大于99時(shí)讓i等于0,從而限制i的區(qū)間。當(dāng)P3_0等于0時(shí)選通數(shù)碼管的十位,顯示的內(nèi)容為i的十位,即:i/10。當(dāng)P3_1等于0時(shí)選通數(shù)碼管的個(gè)位,顯示的內(nèi)容為i的個(gè)位,即:i%10。4.5矩陣鍵盤與獨(dú)立鍵盤不同,矩陣鍵盤如圖4.5.0所示為4*4矩陣鍵盤。按鍵開關(guān)位于行與列的交叉點(diǎn)上,且每個(gè)開關(guān)的兩端均分別與行、列線相連。圖4.5.0矩陣鍵盤的程序一般采用逐行掃描的形式:首先:讓P3值為0xff,讓P30值為0。第二:查詢P34、P35、P36、P37的值,確定第一列4個(gè)按鍵是否按下。第三:讓P3值為0xff,讓P31值為0。第四:查詢P34、P35、P36、P37的值,確定第二列4個(gè)按鍵是否按下。第五:重復(fù)以上步驟至到查詢完所有列。4.5矩陣鍵盤【例4.5.1】硬件電路如圖4.5.1所示,設(shè)計(jì)一個(gè)矩陣鍵盤程序并將按鍵值顯示在數(shù)碼管上。圖4.5.14.5矩陣鍵盤#include<REGX51.H>unsignedcharnum[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數(shù)碼管代碼表voiddelay()//延時(shí)程序,用于按鍵防抖。{unsignedinta=10000;while(a--);}voidmain(){unsignedchari;//定義i,用于計(jì)算按鍵值。while(1) {P1=num[i];//用P1顯示按鍵值。 P3=0xff;P3_0=0;//掃描第一列; if(P3_4==0){delay();if(P3_4==0)i=0;while(P3_4==0);}//掃描第一列第一行 if(P3_5==0){delay();if(P3_5==0)i=4;while(P3_5==0);}//掃描第一列第二行 if(P3_6==0){delay();if(P3_6==0)i=8;while(P3_6==0);}//掃描第一列第三行 if(P3_7==0){delay();if(P3_7==0)i=12;while(P3_7==0);}//掃描第一列第四行 P3=0xff;P3_1=0;//掃描第二列; if(P3_4==0){delay();if(P3_4==0)i=1;while(P3_4==0);} if(P3_5==0){delay();if(P3_5==0)i=5;while(P3_5==0);} if(P3_6==0){delay();if(P3_6==0)i=9;while(P3_6==0);} if(P3_7==0){delay();if(P3_7==0)i=13;while(P3_7==0);} P3=0xff;P3_2=0;//掃描第三列; if(P3_4==0){delay();if(P3_4==0)i=2;while(P3_4==0);} if(P3_5==0){delay();if(P3_5==0)i=6;while(P3_5==0);} if(P3_6==0){delay();if(P3_6==0)i=10;while(P3_6==0);} if(P3_7==0){delay();if(P3_7==0)i=14;while(P3_7==0);} P3=0xff;P3_3=0;//掃描第四列; if(P3_4==0){delay();if(P3_4==0)i=3;while(P3_4==0);} if(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論