《單片機C語言程序設計》課件第四部分 單片機實驗基礎篇_第1頁
《單片機C語言程序設計》課件第四部分 單片機實驗基礎篇_第2頁
《單片機C語言程序設計》課件第四部分 單片機實驗基礎篇_第3頁
《單片機C語言程序設計》課件第四部分 單片機實驗基礎篇_第4頁
《單片機C語言程序設計》課件第四部分 單片機實驗基礎篇_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四部分單片機實驗基礎篇前

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

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

由于按鍵接觸采用物理接觸,所以在鍵按下時會出現(xiàn)抖動問題如圖4.2.2。單片機在讀取按鍵狀態(tài)時應采用延時法做防抖處理:當判斷按鍵按下時延時10ms左右,等到鍵穩(wěn)定后再一次判斷鍵是否按下再做相關處理。圖4.2.2圖4.2.14.2獨立按鍵【例4.2.1】硬件電路如圖4.2.3所示,設計一個程序:采用單片機的P3.0讀取獨立按鍵的邏輯狀態(tài),通過P2.7的控制LED:當按鍵按下時讓LED亮,否則不亮(按鍵在Proteus庫中的元件名為:BUTTON)。圖4.2.34.2獨立按鍵#include<REGX51.H>sbitkey=P3^0; //定義硬件的接口sbitled=P2^7;#definekey_on0//定義相關常量#definekey_off1#defineled_on0#defineled_off1voiddelay()//延時函數(shù){unsignedinti=10000;while(i--);}voidmain(){while(1) //死循環(huán){key=key_off; //將P3.0電平拉高,以方便檢測期是否為低電平。if(key==key_on)//判斷P3.0是否為低電平。{delay(); //延時程序,防抖等待鍵穩(wěn)定。if(key==key_on) { led=led_on;//當有鍵按下時,讓LED亮。 } while(key==key_on);//松手檢測,等待手放開按鍵彈起。}elseled=led_off;//當無鍵按下時,LED滅。}}說明:上訴程序中while(key==key_on)是對按鍵按下的等待:當有鍵按下時,LED燈亮后執(zhí)行到該語句,此時key的值為0也就是key_on,此時該語句相當于while(1),程序?qū)⒁恢蓖S谠撎帲划旀I無按下時,key的值不為1,while(key==key_on)不成立,程序繼續(xù)往下執(zhí)行。4.3靜態(tài)數(shù)碼管顯示數(shù)碼管是將LED按一定的排列封裝起來,如圖4.3.0所示數(shù)碼為8段數(shù)碼管(由8個LED組成,分別為a,b,c,d,e,f,g,DP)。按公共端結(jié)構可將其分為兩類:共陰數(shù)碼管和共陽數(shù)碼管。共陰數(shù)碼管是將LED的陰極連接在一起,共陽數(shù)碼管是將LED的陽極連接在一起。圖4.3.04.3靜態(tài)數(shù)碼管顯示【例4.3.1】硬件電路如圖4.3.2所示,設計一個共陰數(shù)碼管顯示程序:讓數(shù)碼管從0顯示到9并以此循環(huán)。如表格4.3.1所示,只要單片機I/O引腳給適合的值,數(shù)碼管就會顯示相對的數(shù)字。比如要顯示0:讓數(shù)碼管的a、b、c、d、e、f段為高電平,g、DP為低電平,數(shù)碼管將會顯示0;對應的單片機I/O引腳只需讓P1.0~P1.5為高電平,P1.6、P1.7為低電平,P1的值為0x3f。由此,就可以推出顯示其他數(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ù){unsignedinti=50000;while(i--);}voidmain(){unsignedchart;while(1){P1=num[t++];if(t>9)t=0;//當t大于9時將t清零。delay();}}////////////////////////////////////////////////////////////////////4.3靜態(tài)數(shù)碼管顯示【例4.3.2】硬件電路如圖4.3.2所示,采用獨立按鍵和數(shù)碼管設計一個程序?qū)崿F(xiàn)以下功能:按鍵每按一次,數(shù)碼管加1;當數(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()//延時程序,用于按鍵防抖。{unsignedinta=10000;while(a--);}voidmain(){unsignedchari;//定義i,用于計算按鍵按下次數(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動態(tài)數(shù)碼管顯示將2位及以上數(shù)碼管的數(shù)據(jù)端分別接在一起,即第一個數(shù)碼管的a段與第二個數(shù)碼管的a段接起來(可以多個數(shù)碼管),以此接完所有LED,并留出每位數(shù)碼管的公共端如圖4.4.0。動態(tài)方式顯示時,各數(shù)碼管分時輪流選通,在某一時刻只選通一位數(shù)碼管,并送出相應的字型碼(如表4.3.1),在另一時刻選通另一位數(shù)碼管,并送出相應的字型碼,依此規(guī)律循環(huán),即可使各位數(shù)碼管顯示將要顯示的不同字符。但由于人眼存在視覺暫留效應,只要每位顯示間隔足夠短就可以給人同時顯示的感覺。一般的,每位數(shù)碼管顯示周期20ms即可,周期太短會有重影,周期太長會有閃爍現(xiàn)象。圖4.4.04.4動態(tài)數(shù)碼管顯示【例4.4.1】硬件電路如圖4.4.1所示,采用動態(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語句判斷:當i大于99時讓i等于0,從而限制i的區(qū)間。當P3_0等于0時選通數(shù)碼管的十位,顯示的內(nèi)容為i的十位,即:i/10。當P3_1等于0時選通數(shù)碼管的個位,顯示的內(nèi)容為i的個位,即:i%10。4.5矩陣鍵盤與獨立鍵盤不同,矩陣鍵盤如圖4.5.0所示為4*4矩陣鍵盤。按鍵開關位于行與列的交叉點上,且每個開關的兩端均分別與行、列線相連。圖4.5.0矩陣鍵盤的程序一般采用逐行掃描的形式:首先:讓P3值為0xff,讓P30值為0。第二:查詢P34、P35、P36、P37的值,確定第一列4個按鍵是否按下。第三:讓P3值為0xff,讓P31值為0。第四:查詢P34、P35、P36、P37的值,確定第二列4個按鍵是否按下。第五:重復以上步驟至到查詢完所有列。4.5矩陣鍵盤【例4.5.1】硬件電路如圖4.5.1所示,設計一個矩陣鍵盤程序并將按鍵值顯示在數(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()//延時程序,用于按鍵防抖。{unsignedinta=10000;while(a--);}voidmain(){unsignedchari;//定義i,用于計算按鍵值。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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論