




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
單片機接口與應用第一章單片機基本組成第二章C51程序設計第三章片內接口1.1單片機的基本概念1.1.1單片機的定義單片機是把CPU、存儲器、定時器/計數器、中斷系統和多種I/O接口電路與總線控制電路制作在一塊芯片上的超大規模集成電路。單片機使用時,通常是處于測控系統的核心地位并嵌入其中,所以國際上通常把單片機稱為嵌入式控制器(EmbeddedMicrocontrollerUnit,EMCU),或微控制器(MicrocontrollerUnit,MCU)。我國習慣于使用“單片機”這一名稱。1.1.251系列單片機出現較早也是最成熟的單片機為Intel公司的MCS-51系列,如Intel8031、Intel8051、Intel8751等型號,該系列單片機字長為8位,具有完善的結構和優越的性能、較高的性價比和要求較低的開發環境。STC系列單片機為宏晶科技公司生產的增強型51單片機,具有多種型號。本書在介紹經典MCS-51單片機的同時,也介紹了STC增強型單片機。1.1.3單片機應用1.智能儀器儀表2.機電一體化產品3.實時控制4.分布式控制系統5.家居生活1.2單片機基本組成圖1-1單片機內部組成框圖1.2.1內部總線總線(BUS)是傳輸信息的公共導線。在單片機內部使用的總線稱為內部總線。地址總線(AddressBus,AB)用于傳輸地址信息。數據總線(DataBus,DB)是用于CPU與存儲器之間或CPU與I/O接口之間進行數據傳送的一組信號線。控制總線(ControlBus,CB)是一組控制命令信號線,是CPU決定對外部器件作什么操作的命令線。1.2.2中央處理器中央處理器是單片機的核心,簡稱CPU,其作用是讀入和分析每條指令,根據每條指令的功能要求,完成運算和控制操作。單片機應用程序經編譯器編譯,將生成可執行代碼。把PC和單片機系統連接好后,運行程序下載軟件,例如STC單片機的STC_ISP軟件,就能夠把程序代碼下載到單片機片內ROM中。單片機在復位后,CPU自動從ROM中逐條取出程序代碼并執行。1.2.3~1.2.4程序存儲器存儲器(Memory)用來存放程序和數據。分為只讀存儲器(ROM)和隨機存儲器(RAM)兩大類。ROM對數據只能讀出不能寫入,斷電后其中的數據不會丟失。因此一般用來存放程序代碼和常數。RAM對數據既能讀出也能寫入,斷電后其中的內容全部丟失。單片機中的RAM常用于存放變量和中間計算結果。1.2.5I/O接口I/O接口是連接CPU與外設的中間電路。I/O接口與外部設備間交換的信號,通常有以下4種類型:
數字量:二進制表示的數據,如:字節數據、ASCII碼。
模擬量:隨時間連續變化的物理量,如:電壓、電流、濕度、壓力、流量。
開關量:二進制“0”和“1”描述的狀態,如:開/關、啟/停、通/斷。
脈沖量:上下沿跳變的信號。MCS-51片內集成有P0~P3共4個并行接I/O口1.2.6~1.2.9串行通信接口,簡稱串口,其特征是用單根導線傳輸數據。MCS-51片內集成有一個全雙工的串行異步通信接口(UART)。定時器/計數器,具有完成硬件定時、對外部脈沖信號進行捕捉與計數、產生周期脈沖信號輸出等功能。MCS-51片內集成有2個16位定時器/計數器T0、T1。中斷控制系統,實現單片機對異步事件的處理機制。MCS-51有5個中斷源。時鐘發生器,用來產生單片機工作所需要的時鐘信號。1.3.1數制十進制數:十進制數的每一位有0~9十種數碼,基數為10,高位權是低位權的10倍,加減運算的法則為“逢十進一,借一當十”,后綴為D,可省略。二進制數:二進制數的每一位有0和1兩種數碼,基數為2,高位權是低位權的2倍,加減運算的法則為“逢二進一,借一當二”,后綴為B。十六進制數:十六進制數的每一位有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F十六種數碼,其中A、B、C、D、E、F所代表的數分別相當于十進制的10、11、12、13、14、15。基數為16,高位權是低位權的16倍,加減運算的法則為“逢十六進一,借一當十六”,后綴為H。1.3.2數制轉換二進制數轉換為十六進制數
二進制數轉換為十六進制數采用“合四為一法”,即從右向左,每四位二進制數轉換為一位十六進制數,最高位不足四位用0補齊,就可得到十六進制數。例如,把二進制數1011010110010011111B轉換為十六進制數: 01011010110010011111B=5AC9FH十六進制數轉換為二進制數
十六進制數轉換為二進制數采用“一分為四法”,即從左向右,每一位十六進制數轉換為四位二進制數。例如,把十六進制數6C7BH轉換為二進制數: 6C7BH=0110110001111011B1.3.3無符號數和有符號數無符號數:如果一個數的所有數位都是數值位,沒有符號位,則該數就是無符號數。例如,8位無符號數的8個位都是數值位,表示的數的范圍為00000000B~11111111B,即0~255。同樣,16位無符號數的16個位都是數值位,所以它可表示的數的范圍為0000H~FFFFH,即0~65535。有符號數:有符號數就是有符號位的數。有符號數以其二進制數的最高位作為符號位,且0表示“﹢”,1表示“﹣”。例如,對于8位二進制數,00000001B表示+1,11111111B表示-1。對于16位二進制數,0001H表示+1,FFFFH表示-1。1.4MCS-51的CPU圖1-2MCS-51CPU的組成1.4.1控制器1.程序計數器PC:PC用來存放下一條指令的地址,具有自動加1的功能。應用程序通過編譯軟件編譯后,生成單片機指令碼,并預先寫入程序存儲器ROM中。單片機運行后,CPU逐條從ROM中取出指令碼并執行。2.指令寄存器IR:CPU從ROM取出指令后,就將指令碼暫存于IR中,等待譯碼。3.指令譯碼器ID:ID是對指令寄存器IR中的指令進行譯碼,將指令碼變為執行此指令所需要的電信號。4.數據指針DPTR:指針是存放地址的寄存器。數據指針DPTR,用于存放數據的地址。5.堆棧指針SP:SP用于指示出堆棧頂部在內部RAM塊中的位置。1.4.2運算器1.算術邏輯單元ALU:由加法器和其它邏輯電路等組成,完成數據的算術邏輯運算、循環移位、位操作等,參加運算的兩個操作數,一個由ACC通過暫存器2提供,另外一個由暫存器1提供,運算結果送回ACC,狀態送PSW。2.累加器ACC:是一個8位寄存器,簡記為A,它通過暫存器與ALU傳送信息,用來存放一個操作數或中間結果。3.程序狀態字PSW:也是一個8位寄存器,用于存儲程序運行過程中的各種狀態信息。4.其他部件:暫存器用來存放中間結果,B寄存器用于乘法和除法時,提供一個操作數,對于其他指令,只用作暫存器。5.位處理器
在MCS-51的ALU中,與字節處理器相對應,還特別設置了一個結構完整、功能極強的位處理器。MCS-51指令系統中的位處理指令集(17條位操作指令)、存儲器中的位地址空間,以及借用程序狀態寄存器PSW中的進位標志位CY作為位操作的累加器,構成了MCS-51的為處理器。位處理器可對直接尋址的位變量進行位處理,如置位、清零、取反、測試轉移以及邏輯與、邏輯或等位操作,使用戶在編程時可以利用指令完成原來要用硬件電路來完成的功能,并可方便地設置標志位等,給面向控制的實際應用帶來了方便。1.5MCS-51存儲器1.MCS-51的RAM分區1.低128字節RAM區低128字節RAM也稱通用RAM區。通用RAM區又可分為工作寄存器組區,位尋址區和用戶RAM區。工作寄存器組區:該區地址為00H~1FH,共32字節,分為4組,每組稱為一個工作組。每個工作組都包含8個8位工作寄存器,編號都是R0~R7。工作組0是最常用的寄存器組。通過切換工作組,可以提高程序運行效率。C51編程時,一般不需要指定工作組,編譯器會自動為程序和函數分配它們。位尋址區:該區地址為20H~2FH,共16個字節。這個區域的存儲單元既可以按字節存取,也可以按位存取。用戶RAM區:該區地址為30H~FFH,用于暫存各種變量和臨時數據,也能用作函數調用時所使用的堆棧區。2.高128字節RAM區MCS-52擴展有高128字節RAM,地址范圍是80H~FFH。高128字節RAM只能間接尋址。C51編程時,存儲于該區的變量需要使用idata存儲器類型進行變量聲明。3.特殊功能寄存器區特殊功能寄存器SFR是用來對片內各功能模塊進行管理、控制、監視的控制寄存器和狀態寄存器。MCS-52的SFR區與內部高128字節RAM區的地址范圍重合,但二者在物理上是獨立的。2.STC90C516RD+片內集成的ROM和RAM地址空間1.6MCS-51單片機外部引腳在at89x52.h頭文件中,把P0、P1、P2、P3的位寄存器分別定義為P0_0~P0_7、P1_0~P1_7、P2_0~P2_7、P3_0~P3_7,見表1-6。1.7MCS-51最小系統最小系統是單片機可以運行程序的基本電路,包括單片機、電源、振蕩電路、復位電路四部分。MCS-51的最小系統如圖1-8所示MCS-51單片機的時序MCS-51的時序單位共有4個,從小到大依次是:節拍、狀態、機器周期和指令周期。晶體振蕩信號的一個周期稱為節拍,用P表示。該周期是單片機時鐘脈沖頻率的倒數,是最基本、最小的定時信號,又稱為振蕩周期或單片機的時鐘周期。狀態周期由振蕩脈沖二分頻后得到,用S表示。這樣,一個狀態包含兩個節拍,前半周期對應的節拍叫節拍1,記作P1;后半周期對應的節拍叫節拍2,記作P2,如圖1-12所示。CPU以時鐘P1、P2為基本節拍,指揮單片機的各個部分協調工作。CPU完成一個基本操作所需要的時間稱為機器周期。CPU的基本操作指的是讀取指令、存儲器讀/寫、對數據進行處理等操作。MCS-51采用定時控制方式,具有固定的機器周期。一個機器周期的寬度為6個狀態,依次記作S1~S6。由于一個狀態又包括兩個節拍,因此,一個機器周期總共有12個節拍,分別記作S1P1、S1P2、…、S6P1、S6P2,見圖1-12。由于一個機器周期共有12個振蕩脈沖周期,因此機器周期就是振蕩脈沖的12分頻。單片機執行一條指令所需要的時間稱為指令周期。MCS-51大多數指令的指令周期由一個機器周期或兩個機器周期組成,只有乘法、除法指令需要4機器周期。以兩個機器周期的指令周期為例,各時序單位之間的關系見圖1-12。MCS-51單片機復位電路51單片機的復位電路如圖1-13、1-14所示第二章C51程序設計C51是面向51系列單片機的C語言。與匯編語言相比,C51有如下優點:對單片機指令系統不要求了解,就可以直接編程操作單片機;寄存器分配、存儲器的尋址以及數據類型等細節完全由編譯器自動管理;有多種結構化控制語句,滿足結構化設計要求;庫中提供許多標準子程序,具有較強的數據處理能力,使用方便;具有方便的模塊化編程技術,使已編好的程序很容易移植。2.1C51的基本數據類型2.1.1位類型(bit,sbit)位類型是C51擴充的數據類型,用于訪問51單片機中的可尋址的位單元。C51支持兩種位類型:bit型和sbit型。bit用于在可位尋址的RAM區定義位變量,位地址范圍是00H~7FH,共128個可尋址位。例如: bitaflag;
定義了一個名為aflag的位變量,編譯時編譯器會把aflag定位于20H~2FH的RAM區sbit用于在SFR區定義位變量,位地址范圍是80H~F7H。SFR區的字節地址范圍是80H~FFH,但只有若干個字節單元可以位尋址,見圖2-2。例如:字節地址為80H的SFR單元的位地址為80H~87H。例如: sbitP0_0=0x80;
定義了一個名為P0_0的sbit型位變量,P0_0的位地址為80H,即sfr中P0寄存器的第0位。使用sbit型位變量能夠方便地對單片機并口的某一單個位進行操作。在“at89x52.h”文件中,已經包含了對P0~P3口所有單個位的定義。C51編程時,若在程序開頭使用“#include<atmel\at89x52.h>”語句,就可以直接引用P0_0、P0_1、……、P3_7這些位變量,而不必再進行定義。例如,要向P1.1引腳輸出0,可編程如下:#include<atmel\at89x52.h> //#include為C51編譯器的包含命令//其它語句P1_1=0;
2.1.2特殊功能寄存器型(sfr,sfr16)sfr用于定義位于SFR區的字節單元,利用它可以訪問SFR區所有的單字節特殊功能寄存器。sfr16用于定義SFR區的雙字節單元,利用它可以訪問SFR區所有兩個字節的特殊功能寄存器。由于在“at89x52.h”、“reg52.h”這樣的頭文件中,已經包含了51、52子系列單片機所有sfr型變量的定義,所以,應用程序在包含了這樣的頭文件后,就可以直接引用所有sfr型變量的名稱,如P0、T0、SBUF,等等,而不需再去定義它們。例如,要向P0端口輸出75H,可編程如下:#include<atmel\at89x52.h> //#include為C51編譯器的包含命令//其它語句P0=0x75; //向P0端口寫入數據75H并輸出到P0.0~P0.72.1.3~2.1.7字符型……指針型字符型數據的長度為一個字節,用于存放一個單字節數據。整型數據的長度為兩個字節,用于存放一個雙字節數據。長整型數據的長度為四個字節,用于存放一個四字節數據。浮點型數據(float)是長度為四字節的實數指針型(*),與之對應的是指針變量。指針變量中存放的是數據的地址。2.2.1數組與字符串相同類型的數據排列形成的有限集合就是數組。在信息處理時常常用到以ASCII字符或擴展ASCII字符組成的字符串。C語言規定字符串以'\0'作為結束符,'\0'的ASCII碼值為00H。數值、字符串定義舉例inta[10];//定義整型數組a,所有10個元素的初值都為0intb[10]={1,2,3,4};//定義整型數組b,前4個元素的值為1,2,3,4,余下的為0charc[]={1,2,3,4}; //定義字符型數組c,賦值了全部元素,數組長度可以省略chard[2][5]; //定義2行5列字符型數組d,所有10個元素的初值都為0chars[]={'a','b','c','d'}; //定義字符型數組s,元素為'a','b','c','d'charstr="abcd";//定義字符串str,元素為'a','b','c','d','\0'2.3常量、變量常量:是在程序運行時其值不能改變的量變量:是在程序運行時其值可以改變的量存儲種類:是指變量在程序中的作用域數據類型說明符用于聲明變量的數據類型存儲器類型用于聲明變量的存儲單元應定位于單片機的哪一個存儲區,如圖2-42.4C51的運算符C51支持的算術運算符有+、-、*、/、%、++、--,見圖2-5。C51支持的關系運算符與邏輯運算符有>、<、>=、<=、==、!=、||、&&、!。這些運算符及示例語句見圖2-6。位操作運算符對操作對象按位進行運算,包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種,如圖2-7所示。特殊運算符包括各種賦值運算符,問號運算符,逗號運算符,地址及指針運算符等,其類型及示例如圖2-8所示。2.5C51的表達式和語句1.if語句C51的if語句有if、if-else、if-else-if三種形式。見圖2-92.switch語句switch語句的一般形式和執行流程如下圖所示3.while語句一般形式為: while(表達式){語句體;}do-while語句的形式為: do{
語句體; }while(表達式);兩種while語句的執行流程如下圖4.for語句一般形式為: for(exp1;exp2;exp3) {
語句體; }for語句執行流程如下圖5.轉移語句包括:(1)goto語句:使程序無條件轉移到標號語句處(2)break語句:作用是跳出switch語句或跳出本層循環,轉去執行后續的程序(3)continue語句:作用是結束本次循環,轉入下一次循環條件的判斷與執行(4)return語句:return語句只能出現在被調函數中,用于返回主調函數,其格式是: return(表達式);
其中,表達式為函數的返回值2.6函數C51函數定義的形式如下:類型說明符函數名(形式參數表){
類型說明;
語句;}函數調用的一般形式為:函數名(實際參數表);函數的編寫與調試示例1.編寫程序在KeiluV4中輸入以下程序,保存為類型名為c的文件,如123.c#include<atmel\at89x52.h>intn; //定義int型全程變量n/*延時函數*/voiddelay(intn){ inti; for(i=0;i<n;i++);}/*主函數*/main(){ n=20000; while(1){ //主循環
P1_1=1; //向P1.1引腳輸出高電平
delay(n); //延時
P1_1=0; //向P1.1引腳輸出低電平
delay(n); //延時
delay(n); //延時
}}2.編譯程序(1)創建項目。在KeiluV4中創建一個項目,確定項目名稱,如abc(2)為項目選擇單片機型號。這里選擇Atmel公司的AT89S52(3)為項目添加C51文件,即把123.c添加到項目abc中(4)設置編譯后輸出HEX文件(5)按F7編譯程序3.調試程序在KeiluV4的Debug菜單中,包含了多個用于調試源程序的選項。如:Ctrl+F5用于啟動和終止調試,F5用于運行程序,F10為單步運行程序,Ctrl+F10為運行到光標所在行,F9為設置/清除斷點。KeiluV4還具有查看單片機片內各種寄存器、I/O端口狀態、程序中的各變量值,其邏輯分析器能夠顯示來自I/O引腳的信號波形。4.下載到單片機(1)首先在PC上安裝STC單片機自動編程器的USB驅動程序,如CH340驅動程序。(2)將編程器與PC通過USB線連接,連接后PC將為該設備分配一個虛擬串口。(3)把編程器的GND、RXD、TXD、5V0分別與單片機芯片的GND、P3.1、P3.0、VCC連接,運行STC-ISP程序,選擇單片機芯片型號。(4)打開程序文件,如abc.HEX。(5)選擇串口,下載。(6)下載成功后,程序即自動運行。若用杜邦線把P1.1引腳與一只LED連接,可以觀察到LED閃爍第三章單片機片內接口3.1并行接口MCS-51單片機有P0、P1、P2、P3共4組并行I/O端口,每組端口都是8位準雙向口,共32根引腳。并口要點:并行接口可以同時輸入/輸出8位數據。準雙向口:CPU在讀取準雙向口輸入的數據前,應向該接口輸出高電平。但由于單片機復位時已經置P0、P1、P2、P3為高電平,所以把它們作為輸入接口時,CPU就不需要再進行輸出高電平的操作了。3.1.1P0口P0口要點:P0口主要用作普通I/O接口,在一些應用中,需要對P0口的引腳外接上拉電阻。CPU訪問P0的C51例句:bitb;charc;c=P0; //字節訪問:CPU讀P0口引腳(P0.7~P0.0)狀態并存入字符型變量cP0=~P0; //字節訪問:CPU讀P0口各引腳鎖存器,取反后輸出到P0.7~P0.0引腳b=P0_0; //位訪問:CPU讀P0.0引腳狀態并存入位變量bP0_0=~P0_0; //位訪問:CPU讀P0.0鎖存器狀態,取反后,輸出到P0.0引腳3.1.2P1口P1口要點P1是一個8位準雙向口,它只作通用的I/O口使用,其訪問方式與P0口相同訪問P1口的例句:charc1,c2;bitb1,b2;c1=P1;//字節訪問:讀P1口引腳(P1.7~P1.0)狀態并送入變量c1c2=~P1;//字節訪問:讀P1口引腳(P1.7~P1.0)狀態,位取反后送入變量c2P1=~P1;//字節訪問:讀P1口各鎖存器,各位取反后輸出到P1各引腳P1&=0x01;//字節訪問:讀P1口各鎖存器,同0x01按位與后輸出到P1各引腳P1_1=~P1_1; //位訪問:讀P1.1鎖存器,取反后,輸出到P1.1引腳b1=P1_5; //位訪問:讀P1.5引腳狀態并送入變量b1b2=~P1_7; //位訪問:讀P1.7引腳狀態,取反后送入變量b23.1.3P2口P2口要點:P2主要作為準雙向通用I/O口使用3.1.4P3口P3口要點:P3的第二功能很重要,但對于不使用第二功能的引腳,仍可作為準雙向通用I/O口使用3.1.5并口應用舉例【例3-1】用P0.6、P0.7引腳分別控制2只發光二極管LED1、LED2。控制方式為:LED1點亮、LED2熄滅;延時;LED1熄滅、LED2點亮;如此循環。【例3-2】
用P1.0、P1.1引腳連接按鈕S1、S2輸入,用P2.7控制一只晶體管的導通與截止,該晶體管驅動一只小型直流繼電器K1。控制要求是:按下S1后,K1通電;按下S2后,K1斷電。C51程序如下。#include<atmel\at89x52.h>main(){ while(1){ bitrun; //定義位變量,指示K1狀態
if(P1_0==0)run=1; //按下S1,run=1 if(P1_1==0)run=0; //按下S2,run=0 if(run==1)P2_7=0; //run=1,P2.7輸出低電平,K1通電
elseP2_7=1; //run=0,P2.7輸出高電平,K1斷電
}}【例3-3】
用P2口通過ULN2003驅動芯片控制一只小型步進電機運行,且通過軟件延時實現電機通電相序的變換。試繪出控制電路并編寫C51程序。C51程序如下。#include<atmel\at89x52.h>main(){ while(1){ inti; //定義變量i,用于延時
for(P2=0x80,P0=~0x80,i=0;i<1000;i++); //A通電,LED顯示,延時
for(P2=0x40,P0=~0x40,i=0;i<1000;i++); //B通電,LED顯示,延時
for(P2=0x20,P0=~0x20,i=0;i<1000;i++); //C通電,LED顯示,延時
for(P2=0x10,P0=~0x10,i=0;i<1000;i++); //D通電,LED顯示,延時}}3.2中斷3.2.1中斷源2.中斷信號的產生下面是MCS-52各中斷信號的產生方式。(1)INT0中斷:若預置IT0=0,當P3.2/引腳出現低電平時向CPU請求INT0中斷;若預置IT0=1,當P3.2/引腳出現下降沿時向CPU請求INT0中斷。(2)INT1中斷:若預置IT1=0,當P3.3/引腳出現低電平時向CPU請求INT1中斷;若預置IT1=1,當P3.3/引腳出現下降沿時向CPU請求INT1中斷。(3)T0中斷:當T0溢出標志TF0=1時,向CPU請求T0中斷。(4)T1中斷:當T1溢出標志TF1=1時,向CPU請求T1中斷。(5)串口中斷:當串口發送中斷標志TI=1、或串口接收中斷標志RI=1時,向CPU請求串口中斷。(6)T2中斷:當T2溢出標志TF2=1、或T2外部標志EXF2=1時,向CPU請求T2中斷。3.中斷允許的設置下面是C51設置開中斷和關中斷的語句。EX0=1;/*開INT0中斷 */ EX0=0; /*關INT0中斷 */EX1=1;/*開INT1中斷 */ EX1=0; /*關INT1中斷 */ET0=1;/*開T0中斷 */ ET0=0; /*關T0中斷 */ET1=1;/*開T1中斷 */ ET1=0; /*關T1中斷 */ES=1;/*開串口中斷 */ ES=0; /*關串口中斷 */ET2=1; /*開T2中斷 */ ET0=0; /*關T2中斷 */EA=1; /*開CPU中斷 */ EA=0; /*關CPU中斷 */3.2.2中斷優先級MCS-52所有的中斷都具有2個中斷優先級:0為低優先級,1為高優先級。每個中斷的優先級均可用軟件設置。例如:PX0=1;/*設INT0中斷為高優先級*/PX0=0; /*設INT0中斷為低優先級 */PX1=1;/*設INT1中斷為高優先級*/ PX1=0; /*設INT1中斷為低優先級 */PT0=1;/*設T0中斷為高優先級*/PT0=0; /*設T0中斷為低優先級 */PT1=1;/*設T1中斷為高優先級*/ PT1=0; /*設T1中斷為低優先級 */PT2=1;/*設T2中斷為高優先級*/PT2=0; /*設T2中斷為低優先級 */PS=1;/*設串口中斷為高優先級*/ PS=0; /*設串口中斷為低優先級 */中斷查詢次序由高到低排列:INT0,T0,INT1,T1,UART,T23.2.3中斷服務函數在C51中,中斷服務程序是用中斷服務函數來實現的,它的常用形式如下:void函數名(void)interrupt中斷號{
語句;}3.2.4中斷應用舉例【例3-4】
用單片機自測INT0、INT1中斷優先順序。方法是把P3.2/與P1.0連接,把P3.3/與P1.1連接,P0與一只七段數碼管7-Seg連接,主程序使7-Seg顯示字型P,INT0中斷服務程序使7-Seg顯示字型0,INT1中斷服務程序使7-Seg顯示字型1。試繪出電路圖、編寫C51程序并進行測試。#include<atmel\at89x52.h>#include<intrins.h>volatileunsignedinti1,i2;//編譯器不對volatile型變量進行優化main(){ IT0=IT1=1;//置INT0、INT1下降沿觸發中斷
EX0=1; //開INT0中斷,刪除此句禁止INT0中斷請求
EX1=1; //開INT1中斷,刪除此句禁止INT1中斷請求
EA=1; //開CPU中斷,刪除此句禁止CPU響應中斷
while(1){ //主循環
unsignedinti; //用于延時
P0=0x8c; //7-Seg顯示P for(i=0;i<65535;i++);//延時
P1=0xFC;//同時拉低P1.0、P1.1,輸出到P3.2、P3.3,以觸發中斷
_nop_();_nop_();_nop_();_nop_();//維持低電平4個機器周期
P1=0xFF; //同時拉高P1.0,P1.1,輸出到P3.2、P3.3 }}/*INT0中斷服務程序*/voidINT0_isr()interrupt0 /*INT0中斷號為0*/{ P0=0xc0; //7-SEG顯示0 for(i2=0;i2<50000;i2++); //延時}/*INT1中斷服務程序*/voidINT1_isr()interrupt2 /*INT0中斷號為2*/{ P0=0xf9; //7-SEG顯示1 for(i1=0;i1<50000;i1++); //延時}3.3定時器/計數器3.3.1定時器/計數器的結構1.TCON寄存器TCON是定時器控制寄存器,它的高4位用于控制T0、T1。TCON的格式為:TF1:T1溢出標志位。T1被允許計數以后,從初值開始加1計數。當最高位產生溢出時由硬件置位TF1,向CPU請求中斷;TF1一直保持到CPU響應中斷時,才由硬件清零(TF1也可由程序查詢清零)。TR1:T1運行控制位。該位由軟件置位和清零。當TR1=1時,啟動T1開始計數;當TR1=0時,停止T1計數。TF0:T0溢出標志位,功能和TF1類似。TR0:T0運行控制位,功能和TR1類似。2.TMOD寄存器GATE:門控位。GATE=0時,T0、T1只分別由TR0、TR1來控制運行與停止;GATE=1時,用程序設置TR0或TR1為1,并且外部中斷引腳(P3.2/INT0引腳與T0配合,P3.3/INT1引腳與T1配合)也為高電平時,才能啟動T0或T1計數。C/T:定時/計數模式選擇位。C/T=0為定時模式,即定時器對CPU內部的機器周期脈沖信號計數;C/=1為計數模式,即定時器對外部引腳(P3.4/T0、P3.5/T1)脈沖信號計數。M1、M0:工作方式設置位。M1M0=00:方式0,13位定時器/計數器;M1M0=01:方式1,16位定時器/計數器;M1M0=10:方式2,8位自動重裝定時器/計數器;M1M0=11:方式3,T0分成兩個8位的定時器/計數器。3.3.2定時器/計數器的工作方式1.方式1方式1為16位計數方式。T0的16位計數器由TL0和TH0組成。TL0溢出時,向TH0進位,TH0溢出時,置位TF0標志,向CPU發出中斷請求。圖3-16是T0工作在方式1的邏輯結構圖,T1與之類似2.方式2方式2為8位自動重裝計數方式,各控制信號的作用與方式1相同。方式2下,TL0作8位計數器使用,TH0作為8位常數緩沖器,保存計數初值。當TL0計數產生溢出時,在把TF0置1的同時,將保存在TH0中的計數初值自動裝入TL0,使TL0再次從該初值加1計數,如此循環。由于是8位的計數器,所以計數值達到28=256就產生溢出。圖3-17是T0工作在方式2的邏輯結構圖,T1與之類似。3.方式3方式3只適用于T0。此時,T0被分為兩個獨立的8位計數器TL0和TH0。其中,TL0占用T0的控制位、引腳和中斷源。除計數位數不同于方式1外,其功能和操作與方式1完全相同,可定時也可計數。TH0占用T1的控制位TF1和TR1,同時還占用了T1的中斷源,其啟/停僅受TR1控制。TH0只能用作8位定時器,不能對外部脈沖計數。在這種情況下,T1一般用作串口波特率發生器。3.3.3T0、T1應用舉例【例3-5】
設單片機晶振頻率為12MHz,編寫C51程序,用T0定時中斷使P1.0引腳輸出1kHz的脈沖方波,再用T1定時中斷使P1.1引腳輸出10kHz的脈沖方波。1.定時器計數初值計算T0、T1用作定時器時,計數脈沖頻率為fosc/12。設定時器的溢出頻率為f,則定時器的計數次數n=fosc/12/f。定時器的計數初值就等于256(對于8位計數器)或65536(對于16位計數)減去分頻數,即:2.程序框圖3.程序#include<atmel\at89x52.h>#defineFOSC12000000L //晶體振蕩頻率#defineN_T20KHZ(256-FOSC/12/20000) //T1初值#defineN_TH2KHZ(65536-FOSC/12/2000)/256 //TH0初值#defineN_TL2KHZ(65536-FOSC/12/2000)%256 //TL0初值main(){ TMOD=0x01; //T0方式1:□□□□□□□■
TMOD|=0x20; //T1方式2:□□■□□□□□
TH1=N_T20KHZ; //裝T1計數初值
EA=ET0=ET1=1; //開CPU、T0、T1中斷TR0=TR1=1; //啟動定時器T0、T1 while(1){ }}voidt0_isr()interrupt1{ TH0=N_TH2KHZ; //裝計數初值高8位 TL0=N_TL2KHZ; //裝計數初值低8位 P1_0=~P1_0; //P1.0取反后輸出}voidt1_isr()interrupt3{ P1_1=~P1_1; //P1.1取反后輸出}【例3-6】
設單片機晶振頻率為12MHz,用T0定時產生1秒鐘的定時間隔,并通過P0控制一只共陽極七段數碼管,顯示秒鐘的個位數。試繪出硬件電路并編寫C51程序。1.硬件電路2.程序設計#include<atmel\at89x52.h>#defineFOSC12000000L //晶體振蕩頻率#defineN_TH50ms(65536-FOSC/12*50/1000)/256 //50ms(20Hz)TH0初值#defineN_TL50ms(65536-FOSC/12*50/1000)%256 //50ms(20Hz)TL0初值#defineN_1sec1000/50 //1secT0中斷次數main(){ TMOD=0x01; //T0方式1:□□□□□□□■ TR0=1; //啟動定時器
EA=ET0=1; //開CPU、T0中斷
while(1){}}codeunsignedcharSegDat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9voidt0_isr()interrupt1{ staticintn_t0,n_sec; TH0=N_TH50ms; //裝計數初值高8位
TL0=N_TL50ms; //裝計數初值低8位
if(++n_t0==N_1sec){ n_t0=0; P0=SegDat[n_sec]; //P0輸出,顯示
if(++n_sec==10)n_sec=0; }}【例3-7】用單片機的P3.4/T0引腳對一只NPN型光電開關的輸出脈沖進行計數,并通過P0控制一只七段數碼管,顯示脈沖數的個位數。試繪出硬件電路并編寫C51程序。1.光電開關工作原理2.硬件電路3.程序設計#include<atmel\at89x52.h>codeunsignedcharSegDat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9main(){ TMOD=0x05; //T0方式1,對外部脈沖計數:□□□□□■□■ TR0=1; //啟動T0 while(1){unsignedinti;i=TH0*256+TL0;//讀取TH0、TL0并合成為無符號16位整數
i%=10; //i對10取余數,得到i的個位數
P0=SegDat[i]; //P0輸出,顯示i的字型
for(i=0;i<30000;i++);//為顯示延時一段時間
/*如果沒有光電開關,可以把P1.0與P3.4連接,并加入以下語句
P1_0=0; for(i=0;i<10;i++); P1_0=1; */ }}【例3-8】
用單片機的P2.7引腳通過ULN2003的一個通道控制一只直流電機的運行,并用T0定時器使P2.7引腳輸出周期為2ms的PWM波形,設每個波形的前1.5ms為高電平,后0.5ms為低電平。試設計硬件電路并編寫C51程序。1.直流電機的驅動2.控制電路3.程序設計#include<atmel\at89x52.h>#defineFOSC12000000L //晶體振蕩頻率#defineN_T0d1ms(256-FOSC/12/10000) //0.1ms(10000Hz)TH0初值main(){ TMOD=0x02; //T0方式2:□□□□□□■□ TH0=N_T0d1ms; //裝T0計數初值預存于TH0 TR0=1; //啟動T0 EA=ET0=1; //開CPU、T0中斷
while(1){ }}voidt0_isr()interrupt1 //T0中斷號=1{ staticcharn_t0; //T0中斷次數
P2_7=(n_t0<15)?1:0; //向P2.7輸出PWM波形
if(++n_t0==20)n_t0=0; //PWM周期=20次×0.1ms=2ms}3.4串行接口3.4.1串行通信基本概念1.并行通信與串行通信2.異步通信方式3.異步通信幀格式異步通信的字符幀由起始位、數據位、校驗位和停止位組成,見圖3-29。起始位:位于字符幀開頭,只占一位,為邏輯0低電平,用于向接收設備表示發送端開始發送一幀信息。數據位:緊跟起始位之后,根據通信約定可取5~8位,低位在前、高位在后。奇偶校驗位:位于數據位之后,用于數據位的奇偶校驗。奇偶校驗有奇校驗、偶校驗和無校驗三種方式,若選擇無校驗方式,則通信時不發送該位。停止位:位于字符幀的最后,為邏輯1的高電平,根據通信約定可取1位、1.5位或2位。用于向接收端表示一幀字符信息已經發送完,也為發送下一幀做準備。從起始位開始到停止位結束的全部內容稱之為一幀。兩相鄰幀之間可以沒有空閑位,也可以有若干空閑位3.4.251單片機串口結構及串口寄存器1.SBUF寄存器SBUF是串口寄存器,包括發送寄存器和接收寄存器。它們有相同名字和地址,但不會出現沖突,因為它們當中一個只能被CPU讀出數據,另一個只能被CPU寫入數據。當CPU向SBUF寫入時,數據進入發送SBUF,同時啟動串行發送;當CPU讀SBUF時,實際上是讀接收SBUF中的數據2.SCON寄存器串口控制寄存器SCON的格式為:SM2:多機通信控制位。在方式0時,SM2應為0。在方式1中,如果SM2位為1,則只有接收到有效停止位時,RI才置1。在方式2或方式3時,當SM2=1且接收到的第9位數據RB8=1時,置位RI;否則不置位RIREN:接收允許控制位。由軟件置位以允許串口接收,又由軟件清0來禁止串口接收。TB8:是要發送數據的第9位。在方式2或方式3中,TB8為要發送的第9位數據,根據需要由軟件置1或清0。例如,可以約定TB8作為奇偶校驗位,或者在多機通信中用它作為區別地址幀或數據幀的標志位。RB8:接收到的數據的第9位。在方式0中不使用RB8。在方式1中,若SM2=0,RB8為接收到的停止位。在方式2或方式3中,RB8為接收到的第9位數據。TI:發送中斷標志。在方式0中,當第8位發送結束時,由硬件置位。在其它方式的發送停止位前,由硬件置位。TI置位既表示一幀信息發送結束,同時也請求串口中斷,可根據需要,用程序查詢的方式獲得數據已經發送完畢的信息,或者用中斷的方式來發送下一個數據。TI必須用軟件清0。RI:接收中斷標志位。在方式0,當接收完第8位數據后,由硬件置位。在其它方式中,在接收到停止位的中間時刻由硬件置位(例外情況見于SM2的說明)。RI置位表示一幀數據接收完畢,可以用程序查詢的方式獲知或者用中斷的辦法獲知。RI必須用軟件清0。3.PCON寄存器中的SMOD位SMOD是電源控制寄存器PCON中的最高位,用于設置串口方式1、方式2、方式3的波特率是否加倍:SMOD=1,波特率加倍;SMOD=0,波特率不加倍。3.4.3串口工作方式方式0當SM0=SM1=0時,串口工作于方式0,為移位寄存器輸入/輸出方式。這種方式常用于外接移位寄存器擴展并行I/O接口。方式1當SM0=0、SM1=1時,串口工作于方式1,為波特率可變的10位異步串行通信方式。一幀信息包括1個起始位,8個數據位和1個停止位。通常單片機與單片機串口通信,單片機與計算機串口通信,都選擇方式1。方式2當SM0=1、SM1=0時,串口工作于方式2,為固定波特率的11位UART方式。它比方式1增加了一位可程控為1或0的第9位數據。方式3當SM0=SM1=1時,串口工作于方式3,為波特率可變的11位UART方式。除波特率外,其余與方式2相同。3.4.4串口接收/發送編程舉例【例3-9】
在直流電機的PWM控制中,用單片機的串口接收PWM波形中高電平的時間值,以改變PWM脈沖的占空比。已知單片機晶振頻率為11.0592MHz,串口通信參數為:波特率=9600,數據位=8,無奇偶校驗,停止位=1。試編寫C51程序。1.PWM調速的實現例3-8的程序設計實現了用T0定時中斷輸出PWM波形,但要實現電機的速度調節,還需要適時地改變PWM波形中高電平或低電平所占的時間值。本例中單片機通過串口接收的方法獲得PWM波形中高電平所占的時間值,并把它存儲于全程變量PWM_ON中,以供T0中斷服務函數使用。2.程序設計#include<atmel\at89x52.h>#defineFOSC11059200L //晶體振蕩頻率#defineN_T0d1ms(256-FOSC/12/10000)//0.1ms(10000Hz)TH0初值charPWN_ON=10; //全程變量,PWM高電平時間值main(){ /*設置T0方式2,0.1ms定時*/ TMOD=0x02; //T0方式2:□□□□□□■□ TH0=N_T0d1ms; //裝T0計數初值預存于TH0 TR0=1; //啟動T0 EA=ET0=1; //開CPU、T0中斷/*設置串口:波特率=9600,數據位=8,無奇偶校驗,停止位=1*/ TMOD|=0x20; //T1方式2,8位自動重裝□□■□□□□□ TH1=0xFD; //9600bps,T1定時初值 SM0=0,SM1=1; //設定串口方式1:□■ REN=1; //允許串口接收 TR1=1; //啟動定時器1 while(1){ charc; /*串口接收一個字符*/ while(RI==0); //等待串口接收完成 RI=0; //RI清零 c=SBUF; //從串口讀取一個字符 if(c>0&&c<20)PWN_ON=c;//PWN_ON裝入新值 SBUF=PWN_ON; //串口發送PWN_ON的值 }}voidt0_isr()interrupt1 //T0中斷號=1{ staticcharn_t0; //T0中斷次數 P2_7=(n_t0<PWN_ON)?1:0; //向P2.7輸出PWM波形 if(++n_t0==20)n_t0=0; //PWM周期=20次×0.1ms=2ms}【例3-10】在對光電開關輸出脈沖計數的應用中,利用單片機串口發送脈沖計數值。試用串口接收查詢和串口接收中斷兩種方式實現:當單片機串口接收到字符‘P’時,就通過串口發送T0的16位計數值。已知單片機晶振頻率為11.0592MHz,串口通信參數為:波特率=9600,數據位=8,無奇偶校驗,停止位=1。1.串口接收查詢編程所謂串口接收查詢就是在程序中不斷查詢串口的RI標志,當串口接收了一個字符后,RI被硬件置位,此后CPU從串口讀取字符并將RI清零。在通過串口發送一個字符后,也需要不斷查詢TI標志,待字符發送完成、TI被硬件置位后,將TI清零。程序設計#include<atmel\at89x52.h>main(){ TMOD=0x05; //T0方式1,對外部脈沖計數:□□□□□■□■ TR0=1; //啟動T0 /*設置串口:波特率=9600,數據位=8,無奇偶校驗,停止位=1*/ TMOD|=0x20; //T1方式2,8位自動重裝:□□■□□□□□ TH1=0xFD; //9600bps,T1定時初值 TR1=1; //啟動定時器1 SM0=0,SM1=1; //設定串口方式1:□■ REN=1; //允許串口接收 while(1){ //主循環 charc; /*串口接收一個字符*/ while(RI==0); //等待串口接收完成 RI=0; //RI清零 c=SBUF; //從串口讀取一個字符 if(c!='P')continue;//接收的不是字符P,跳到 //循環開頭 /*接收到字符P,串口發送TH0、TL0*/ SBUF=TH0; //通過串口發送TH0 while(TI==0); //等待串口發送完成 TI=0; //TI清零 SBUF=TL0; //通過串口發送TL0 while(TI==0); //等待串口發送完成 TI=0; //TI清零 }}2.串口接收中斷編程在設置允許串口中斷后,單片機串口在接收到一個字符或發送完一個字符后都會請求串口中斷。所以在串口中斷服務函數中要進行判斷:如果RI等于1,則是串口接收中斷;如果TI等于1,則是串口發送中斷。在串口接收中斷中,如果檢測到串口接收了字符'P',就通過串口發送TH0、TL0的存儲值。程序設計#include<atmel\at89x52.h>main(){TMOD=0x05; //T0方式1,對外部脈沖計數:□□□□□■□■ TR0=1; //啟動T0 /*設置串口:波特率=9600,數據位=8,無奇偶校驗,停止位=1*/ TMOD|=0x20; //T1方式2,8位自動重裝□□■□□□□□ TH1=0xFD; //9600bps,T1定時初值 TR1=1; //啟動定時器1 SM0=0,SM1=1; //設定串口方式1:□■ REN=1; //允許串口接收 EA=ES=1; //開CPU、串口中斷 while(1){ //主循環 }}voiduart_isr()interrupt4/*串口中斷序號為4*/{ if(RI){ /*如果是接收中斷*/ RI=0;/*RI清零*/ if(SBUF=='P'){/*接收到字符P,串口發送TH0、 TL0*/ SBUF=TH0; //通過串口發送TH0 while(TI==0); //等待串口發送完成 TI=0; //TI清零 SBUF=TL0; //通過串口發送TL0 while(TI==0); //等待串口發送完成 TI=0; //TI清零 } } if(TI)TI=0;/*如果是發送中斷,TI清零*/}單片機接口與應用第四章
數字量控制應用第五章
擴展接口第六章片內增強功能4.1單相電機正反轉控制4.1.1單相電機簡介單相電機一般是指用單相交流電源(AC220V)供電的小功率單相異步電動機。單相異步電動機通常在定子上有兩相繞組,轉子是普通鼠籠型的。兩相繞組在定子上的分布以及供電情況的不同,可以產生不同的起動特性和運行特性。圖4-1是帶正反轉倒順開關的接線圖。圖中電機的A繞組與B繞組是線徑與線圈數完全一致。手動開關S的上通和下通就能實現電機的正轉和反轉。4.1.2硬件電路在控制單相電機正反轉時,需要自動地控制圖4-1中開關S的倒順。單片機控制單相電機的硬件電路如圖4-2所示。S1、S2、S3分別為正轉按鈕、反轉和停止按鈕;P0.6~P0.7控制2只LED,用來指示電機的正轉和反轉。P2口經ULN2003控制2只繼電器K1、K2,用于實現單相電機正反轉。當K1通電、K2斷電時,電機M的右側接線端子接交流電源;當K1斷電、K2通電時,電機M的左側接線端子接交流電源;當K1、K2都斷電時,電機M停止。4.1.3程序設計#include<Atmel\AT89X52.h>charMotorState;main(){P2_7=P2_6=0;//電機停止MotorState=0; //電機停止標志while(1){//主循環
if(P1_0==0)MotorState=1;//按下S1, //正轉
if(P1_1==0)MotorState=-1;//按下S2, //反轉
if(P1_2==0)MotorState=0;//按下S3, //停止
/*根據標志控制輸出*/ switch(MotorState){ case1:P2_7=1;P2_1=6; //電機正轉
P0_6=0;P0_7=1; //LED顯示輸出
break; case-1:P2_7=0;P2_6=1; //電機反轉
P0_6=1;P0_7=0; //LED顯示輸出
break; case0:P2_7=0;P2_6=0; //電機停止
P0_6=1;P0_7=1; //LED顯示輸出
break; default: break; } }}4.2電磁閥的單片機控制4.2.1電磁閥簡介電磁閥通過線圈通電產生的磁力吸引閥芯移動來開啟/關閉管路,從而控制流體的流通與斷開。直動式電磁閥的工作原理如圖4-4所示4.2.2液體攪拌機控制要求攪拌機的控制要求為:電磁閥YV1開啟,將未攪拌的液體注入容器;當液體注滿后,液位傳感器SQ1動作,這時YV1關閉,攪拌機開始攪拌;攪拌的方法是:使單相電機每10秒交替正轉和反轉;10分鐘后,攪拌完成,YV2開啟,排放液體;當液位下降到液位傳感器SQ2動作時,YV2關閉,一個攪拌過程結束4.2.3硬件電路圖中,S1、S2分別為啟動按鈕和停止按鈕;SQ1、SQ2為兩個液位傳感器的觸點。P0.4~P0.7控制4只LED,以指示機器工作狀態。P2口經ULN2003控制4只繼電器,其中K1、K2用于實現單相電機正反轉,K3、K4用于控制電磁閥YV1、YV2的開啟和關閉4.2.4程序設計#include<Atmel\AT89X52.h>volatilecharRunState=0; //運行狀態=停機main(){ TMOD|=0x01;//T0方式1 EA=ET0=TR0=1; //開放CPU中斷?開放T0中斷?啟動T0 while(1){//主循環
switch(RunState){ case1://注入
P2_2=1;P0=0xEF;/*YV1開啟,LED顯示
輸出*/
if(!P1_2){ //如果SQ1動作
P2_2=0; //YV1關閉
RunState=2; //進行狀態轉換
} break; case2://攪拌
P0=0xDF;/*LED顯示輸出,攪拌控制由T0定
時中斷執行*/
break; case3://排放
P2_1=1;P0=0xBF;//YV2開啟,LED顯示輸出
if(!P1_3){ //如果SQ2動作
P2_1=0; //YV2關閉
RunState=0; //進行狀態轉換
} break; case0://停機
P2=0;P0=0x7F;/*電機停止,閥門關閉;LED顯
示輸出*/ if(P1_2&&P1_3&&!P1_0)RunState=1;/*SQ1、 SQ2常態?按下S1*/ break; default:break; } if(!P1_1)RunState=0; /*按下S2,置停機狀態*/ }}voidT0isr()interrupt1{ staticunsignedintn50ms=0; TH0=(65536-46080)/256;//分頻數=Fosc/12*50/1000=46080 TL0=(65536-46080)%256; if(RunState==2){ //攪拌
if(((n50ms/200)&0x0001)==0){/*10秒的偶數倍*/ P2_7=1;P2_6=0; //電機正轉
} else{/*10秒的奇數倍*/ P2_7=0;P2_6=1; //電機反轉
} if(++n50ms>=12000){ //10分鐘到
P2_7=0;P2_6=0; //停止攪拌
n50ms=0; RunState=3;//置運行狀態=排放
} }}4.3步進電機轉速控制4.3.1硬件電路圖4-8為單片機控制微型步進電機的硬件電路圖。按鈕S1、S2、S3分別為電機正轉、反轉、停止按鈕,S4為電機運行頻率設定按鈕,每按一次S4,會改變一次電機的運行頻率。P0.7~P0.4控制4只LED,用于顯示步進電機各繞組的通電狀態。這里把具有中間抽頭的兩相電機按四相電機處理。4.3.2程序設計#include<intrins.h>#defineFOSC11059200LcharMotorState;codeunsignedintfreqs[]={100,200,300,500,800,1000,1500,2000};//T2計數數組voidmain(void){ C_T2=0;//T2asTimer T2MOD=0x00;//T2OE=0,CDEN=0 EA=ET2=TR2=1; while(1){//主循環
unsignedchari; unsignedintn; if(!P1_0)MotorState=1; //按下S1,正轉
if(!P1_1)MotorState=-1; //按下S2,反轉
if(!P1_2)MotorState=0; //按下S3,停止
if(!P1_3){ //按下S4 for(n=0;n<5000;n++); //延時,避開按鍵抖動
if(!P1_3){ while(!P1_3);//等待S4彈起
/*電機頻率調整*/ if(i>7)i=0; TR2=0; //停止T2 n=FOSC/12/freqs[i++]; //計算分頻數
RCAP2H=TH2=(65536-n)/256;//T2定時初值,自動重裝
RCAP2L=TL2=(65536-n)%256; TR2=1; //啟動t2 } } }}voidt2_isr()interrupt5{ staticunsignedcharc=0xcc; //0xcc為P2輸出初值
TF2=0; //TF2清零
if(MotorState==1)c=_cror_(c,1); //循環右移1位
elseif(MotorState==-1)c=_crol_(c,1); //循環左移1位
P2=c&0xF0; //輸出相序:P2.7~P2.4=A~D,1=ON P0=~(c&0xF0); //LED輸出,0=ON}4.4直流電機控制4.4.1直流電機PWM調速在一個PWM周期(TP)中,用一部分時間(TH)把電源電壓全部加在電樞兩端,另一部分時間(TL)把電源電壓關斷。4.4.2硬件電路電路說明:按鈕S1、S2、S3分別為電機正轉、反轉、停止按鈕,S4為PWM設定按鈕,每按一次S4,會改變一次PWM_ON的數值,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋租賃合同和房屋買賣合同
- 人工養豬場租賃合同書
- 停車車庫買賣合同
- 劇組管理人員勞動合同
- 租賃農村房屋租賃合同標準(2025年版)
- 道路土方測繪合同范本
- 英文資產評估合同范本
- (14)-專題14 口語交際
- 工人干活協議合同范本
- 油漆材料供貨合同范本
- 2024年4月自考《市場營銷學試題》真題完整試卷
- 中國近現代史綱要-第七章
- 2024年湖北省中考地理·生物試卷(含答案解析)
- DL-T+5759-2017配電系統電氣裝置安裝工程施工及驗收規范
- 2024年共青團入團積極分子考試題庫及答案
- 2024年《動漫藝術概論》自考復習題庫(附答案)
- 2024年職業技能“大數據考試”專業技術人員繼續教育考試題庫與答案
- 中醫類新技術新項目
- 國家高新技術企業評定打分表
- 臺球俱樂部股份轉讓協議
- 一例精神分裂癥患者的護理查房
評論
0/150
提交評論