![電子教案-《MCS-51單片機技術項目驅動教程》_第1頁](http://file4.renrendoc.com/view11/M03/02/1D/wKhkGWedEDSAXKXOAACpVQP2WRQ896.jpg)
![電子教案-《MCS-51單片機技術項目驅動教程》_第2頁](http://file4.renrendoc.com/view11/M03/02/1D/wKhkGWedEDSAXKXOAACpVQP2WRQ8962.jpg)
![電子教案-《MCS-51單片機技術項目驅動教程》_第3頁](http://file4.renrendoc.com/view11/M03/02/1D/wKhkGWedEDSAXKXOAACpVQP2WRQ8963.jpg)
![電子教案-《MCS-51單片機技術項目驅動教程》_第4頁](http://file4.renrendoc.com/view11/M03/02/1D/wKhkGWedEDSAXKXOAACpVQP2WRQ8964.jpg)
![電子教案-《MCS-51單片機技術項目驅動教程》_第5頁](http://file4.renrendoc.com/view11/M03/02/1D/wKhkGWedEDSAXKXOAACpVQP2WRQ8965.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
MCS-51單片機技術項目驅動教程清華大學出版社第10章
項目七:LCD1602液晶
顯示的電子密碼鎖設計10.1LCD1602液晶顯示模塊10.2LCD1602液晶顯示設計實例10.3項目設計10.1LCD1602液晶顯示模塊 1602字符型LCD能夠同時顯示16×2(16列2行)即32個字符。其內置192種字符(160個5×7點陣字符和32個5×10點陣字符),具有64個字節(jié)的自定義字符RAM,可自定義8個5×8點陣字符或4個5×11點陣字符。16個引腳的功能分別為:VSS:電源地(GND)。VDD:電源電壓(5V)。VEE:LCD驅動電壓,液晶顯示器對比度調整端。RS:寄存器選擇輸入端,選擇模塊內部寄存器類型信號。R/W:讀/寫控制輸入端,選擇讀/寫模塊操作信號。E:使能信號輸入端。D0~D7:數(shù)據(jù)輸入/輸出口,單片機與模塊之間的數(shù)據(jù)傳送通道。BLA:背光的正端+5V。BLK:背光的負端0V。寄存器選擇組合LCD1602標準字符庫10.2LCD1602液晶顯示設計實例【例10-1】用單片機AT89C51控制LCD1602液晶顯示器顯示兩行字符,第一行內容“hello!”,第二行內容“nyist-dzx”。每一行都從最左邊開始顯示。解:
1)硬件電路設計
在Proteus中設計的LCD1602顯示電路如圖10-8所示,圖中省略了晶振和復位電路。單片機AT89C51的P3口接LCD1602的8位數(shù)據(jù)線,輸出數(shù)據(jù)控制LCD1602顯示不同的字符。P2.0~P2.2接LCD1602控制端,其中P2.2接使能端E,P2.1接讀寫控制端R/W,P2.0接寄存器選擇端RS。LCD1602的VSS接地,VDD接+5V電源電壓,VEE接地,此時的對比度最高。
2)程序設計
編寫程序時,先對LCD1602進行初始化,然后設置第一行的顯示位置,送第一行的顯示內容“hello!”。再接著設置第二行的顯示位置,送第二行的顯示內容“nyist-dzx”。程序流程圖如圖所示。3)Proteus仿真在Proteus中加載程序并運行仿真,可以看到LCD1602液晶的顯示結果,如圖所示。10.3項目設計10.3.1.設計內容及要求
利用矩陣鍵盤實現(xiàn)6位密碼的輸入;利用LCD1602液晶顯示工作狀態(tài),如待機、輸入密碼、開鎖、鍵盤鎖定、密碼是否正確等狀態(tài)信息;輸入密碼為數(shù)字0~9,具有輸入確定及取消功能;連續(xù)三次密碼錯誤將鎖定鍵盤10s并報警。10.3.22.硬件電路設計在Proteus中設計的電路原理圖如圖10-11所示。單片機AT89C51的P3口外接4×4矩陣鍵盤,提供數(shù)字鍵0~9,以及“確定”鍵和“取消”鍵。按鍵A、B、C、D暫時沒用。單片機的P0口接LCD1602的8位數(shù)據(jù)線,P2.0~P2.2引腳分別接LCD1602的RS、R/W和E控制端。P2.6引腳輸出控制蜂鳴器,在連續(xù)三次密碼錯誤時發(fā)出報警聲音。P2.3引腳輸出控制LED燈,當密碼正確時點亮,表明開鎖成功。10.3.3程序設計開機時系統(tǒng)進入待機狀態(tài),液晶屏顯示一些固定字符,第一行顯示“===CodedLock===”,第二行顯示“password:”提示輸入密碼。通過鍵盤輸入6位密碼后按“確定”鍵,系統(tǒng)對密碼進行判斷,根據(jù)結果分別顯示不同的提示字符:(1)如果密碼正確,屏幕先顯示pass,然后顯示open,表明解鎖成功,綠色LED燈點亮。(2)如果密碼錯誤,屏幕顯示error,并繼續(xù)提示輸入密碼。(3)如果連續(xù)輸錯三次,則屏幕顯示“KeypadLocked!”,鎖定鍵盤10s,同時通過蜂鳴器發(fā)出報警信號。10.3.4.運行結果在Proteus中加載程序并運行仿真,開機界面如圖下圖(a)所示。通過按鍵輸入6位密碼,如果密碼錯誤,則提示出錯,顯示界面如下圖(b)所示;連續(xù)三次密碼錯誤,鍵盤被鎖定,顯示界面如下圖(c)所示;密碼輸入正確,則提示密碼鎖打開,顯示界面如下圖(d)所示,同時P2.3引腳接的LED燈點亮。謝謝觀看!MCS-51單片機技術項目驅動教程清華大學出版社第11章
項目八:單片機與PC機互發(fā)數(shù)據(jù)11.1數(shù)據(jù)通信方式11.2AT89C51單片機串行口結構及工作原理11.3串行口工作方式及控制11.4串口應用實例11.5項目設計11.1數(shù)據(jù)通信方式數(shù)據(jù)通信,通常有并行通信和串行通信兩種方式。并行通信是指單位信息的多位數(shù)據(jù)同時傳送,如圖所示。其優(yōu)點是傳送速度快,效率高;缺點是數(shù)據(jù)有多少位,就需要多少根傳送線,當通信距離比較遠時硬件成本比較高。串行通信是指單位信息的各位數(shù)據(jù)按先后次序一位一位分時傳送。其優(yōu)點是只需一對傳輸線,如圖所示,大大降低了傳送成本,特別適用于遠距離通信;缺點是傳送速度較低。
并行通信
串行通信1.異步串行通信異步通信中,發(fā)送器和接收器以各自獨立的時鐘作為基準,即雙方不是共用同一個時鐘信號,如圖所示。在異步通信中,被傳送的數(shù)據(jù)先要進行打包處理,加上一個起始位、一個奇偶校驗位(可以不要)、一個停止位,組成的數(shù)據(jù)格式如圖所示,我們把這一組數(shù)據(jù)信息稱為一幀。每一個字節(jié)數(shù)據(jù)都要以幀信息的形式進行傳送。
異步通信的數(shù)據(jù)幀格式2.同步串行通信
同步通信中,發(fā)送器和接收器用同一個時鐘來協(xié)調收發(fā)工作,增加了硬件設備的復雜性,一般用于傳送數(shù)據(jù)塊。在數(shù)據(jù)塊發(fā)送開始,先發(fā)送一個或兩個同步字符,使發(fā)送方與接收方取得同步。然后開始發(fā)送數(shù)據(jù),數(shù)據(jù)塊的各個字符之間沒有起始位和停止位,這樣通信速度就得到了提高。
(a)時鐘方式
(b)數(shù)據(jù)格式串行通信中的數(shù)據(jù)傳送通常是在兩個端點之間進行,按照數(shù)據(jù)流動的方向可分成單工、半雙工、全雙工三種傳送模式。其中:單工模式:使用一根傳輸線,只允許單方向傳送數(shù)據(jù)。半雙工模式:使用一根傳輸線,允許向兩個方向中的任一方向傳送數(shù)據(jù),但不能同時進行。全雙工模式:使用兩根傳輸線,通信雙方的發(fā)送和接收能同時進行。11.2AT89C51單片機串行口結構及工作原理MCS-51單片機的串行口是一個通用全雙工異步通信接口,結構如圖所示。它有一個發(fā)送緩沖器和一個接收緩沖器,在物理上是獨立的。這兩個緩沖器具有相同的名字(SBUF)和地址(99H),但不會沖突。發(fā)送緩沖器只能寫入,不能讀出,用于存儲要發(fā)送的數(shù)據(jù);接收緩沖器只能讀出,不能寫入,用于存儲接收到的數(shù)據(jù)。這兩個緩沖器都和單片機內部總線相連,CPU可以隨時進行讀寫操作。1.數(shù)據(jù)接收過程當RXD引腳上有一幀串行數(shù)據(jù)到來時,如果串口設置為允許接收狀態(tài),且接收中斷標志位RI=0,那么在串口移位時鐘的同步下,數(shù)據(jù)會進入到串入并出移位寄存器。一幀信息接收完畢,系統(tǒng)硬件自動置位接收中斷標志位RI,向CPU發(fā)出中斷請求,同時把移位寄存器中的數(shù)據(jù)并行送入到接收SBUF中。要想讓單片機串口能夠接收到數(shù)據(jù),一定要保證兩點:串口允許接收;RI=0。串口收到數(shù)據(jù)后,CPU要及時將數(shù)據(jù)從接收SBUF中讀走,并將RI標志位清0,為下一次數(shù)據(jù)接收做好準備。讀取SBUF的語句很簡單,如ACC=SBUF。2.數(shù)據(jù)發(fā)送過程當要把一個數(shù)據(jù)通過串口向外發(fā)送時,只需要把這個數(shù)據(jù)寫入到發(fā)送SBUF中就可以了。例如,執(zhí)行語句:SBUF=ACC,ACC累加器中的數(shù)據(jù)就自動被打包成幀信息,并在移位時鐘的同步下開始一位一位發(fā)送。一幀信息發(fā)送完畢,系統(tǒng)會自動置位發(fā)送中斷標志位TI,以通知CPU數(shù)據(jù)發(fā)送完畢。需要注意的是:CPU往串口發(fā)送數(shù)據(jù),必須要在發(fā)送SBUF為空的情況下進行。如果是連續(xù)發(fā)送多個數(shù)據(jù),則必須要在上一個數(shù)據(jù)發(fā)送完畢,才能再開始發(fā)送下一個。因此編程時,啟動一次數(shù)據(jù)發(fā)送后,要等到TI置1后再啟動下一個發(fā)送操作,同時還要在程序中及時使TI清0。11.3串行口工作方式及控制11.3.1串口相關的特殊功能寄存器單片機對串行口的控制是通過相關的特殊功能寄存器來實現(xiàn)的,主要有兩個:控制狀態(tài)寄存器SCON和電源控制寄存器PCON。1.控制狀態(tài)寄存器SCONSCON是一個可位尋址的專用寄存器,用于定義串行通信口的工作方式和反映串行口狀態(tài),其字節(jié)地址為98H,復位值為00000000B,具體格式如圖所示。2.電源控制寄存器PCON電源控制寄存器PCON主要是對單片機的電壓進行控制管理的,但其最高位SMOD是串口波特率系數(shù)的控制位。其格式如圖所示。1.方式0
方式0是移位寄存器輸入/輸出方式,波特率固定為fosc/12。當單片機的并行I/O口不夠用時,可以通過在串口外接移位寄存器的方法實現(xiàn)外部并行數(shù)據(jù)的輸入/輸出。此方式下,串行數(shù)據(jù)從RXD線輸入/輸出,TXD線專用于輸出時鐘脈沖給外部移位寄存器。收發(fā)的數(shù)據(jù)為8位,低位在前,無起始位、奇偶校驗位及停止位。11.3.2串口工作方式2.方式1
方式1為10位通用異步接收/發(fā)送方式,一幀信息包含10位,格式為:1個起始位0,8個數(shù)據(jù)位,1個停止位1。此方式下的波特率可以編程改變。3.方式2
方式2為11位通用異步接收/發(fā)送方式,一幀信息包含11位,其幀格式為:1個起始位0,8個數(shù)據(jù)位,1個附加的第九位,1個停止位1。此方式下的波特率固定為fosc/32或fosc/64,取決于寄存器PCON中SMOD這一位的數(shù)值。4.方式3
方式3也是11位通用異步接收/發(fā)送方式,數(shù)據(jù)發(fā)送和接收過程同方式2一樣,但其波特率同方式1一樣可以編程改變。串行通信時,收發(fā)雙方必須使用完全相同的波特率才能保證數(shù)據(jù)被可靠接收。在工程應用中,通信波特率的選擇還與通信設備、傳輸距離、線路狀況等因素有關,需要根據(jù)實際情況正確選擇。8051串行口的四種工作方式中,方式0和方式2的波特率都是固定的,方式1和方式3的波特率可變,因此可按照實際需要來設計確定,具有更強的實用性。11.3.3波特率設計方式1、3的波特率是由定時器T1的溢出率決定的,同時受SMOD數(shù)值的影響,具體如圖所示。定時器1、3的波特率由下面的公式計算得到:方式1、3的波特率=(2SMOD/32)×(T1溢出率)(11.1)因為:
T1溢出率=(fosc/12)/(2n-初值)(11.2)所以:方式1、3的波特率=(2SMOD/32)×(fosc/12)/(2n-初值)(11.3)串口通信時要求波特率必須非常準確。因為定時器T1計滿溢出后需要重裝初值,在定時器模式0、1下需要在軟件中完成,這樣就會造成時間上的延遲,從而導致波特率不準確。模式2具有硬件自動重裝初值的功能,不存在時間延遲,所以用它來設計波特率最合適。在典型應用中,定時器T1選用定時器模式2,此時n=8,設定時器的初值為X,于是X=256–[fosc×(SMOD+1)]/(384×波特率)(11.4)【例11-1】AT89C51單片機的振蕩頻率為11.0592MHz,選用定時器T1工作模式2作為波特率發(fā)生器,波特率為2400b/s,求初值X。解:設置波特率控制為(SMOD)=0,由式(11.4)可得X=256–[11.0592×106×(0+1)]/(384×2400)=244所以,(TH1)=(TL1)=244。系統(tǒng)晶體振蕩頻率使用11.0592MHz是為了使初值計算結果為整數(shù),從而保證精確的波特率。11.4串口應用實例11.4.1串口編程初始化步驟串行口在使用之前需要先進行初始化編程,才能按要求輸入/輸出數(shù)據(jù)。一般的初始化步驟包括:(1)設定串口工作方式。設置SCON中的SM0、SM1。(2)如果采用中斷方式編程,則需要打開串行口中斷。設置中斷控制寄存器IE中的EA=1,ES=1。(3)設定SMOD的狀態(tài),以控制波特率是否加倍。(4)工作方式為1或3時進行波特率設計,設置定時器T1。T1一般設置為定時方式模式2,所以一般有TMOD=0x20。再利用式(11.4)計算計數(shù)初值,并賦值給TH1、TL1。最后啟動定時器T1,即TR1=1。
11.4.2方式0應用實例1.擴展并行輸出【例11-2】AT89C52的串行口外接74HC164擴展8位并行輸出口,在Proteus中的電路如圖11-13所示。P2口外接8個開關,74HC164的輸出外接8個LED燈。要求編程實現(xiàn)通過P2口8個開關的開/合對應控制8個LED燈的亮滅。#include<reg52.h>sbitP3_2=P3^2; unsignedchari;unsignedintj;voiddelay() //延時函數(shù){ for(i=100;i>0;i--) for(j=100;j>0;j--);}voidmain(){ P3_2=0; //關閉并行輸出
SCON=0x00; //串口方式0 SBUF=P2; //開關信息寫入串行口
while(1) { if(TI) //發(fā)送完畢
{ TI=0; //清發(fā)送中斷標志
P3_2=1; //打開并行輸出
delay(); SBUF=P2; //再次送入串行數(shù)據(jù)
} }}2.擴展并行輸入【例11-3】AT89C52的串行口外接74HC165擴展8位并行輸入口,在Proteus中的電路如圖11-14所示。P2口外接8個LED燈,74HC165的輸入端外接8個開關。要求編程實現(xiàn)通過8個開關的開/合對應控制8個LED燈的亮滅。#include<reg52.h>sbitSHLD=P3^3;unsignedchari;unsignedintj;voiddelay() //延時函數(shù){ for(i=100;i>0;i--) for(j=1000;j>0;j--);}voidmain(){ SCON=0x10; //串口方式0,允許接收
while(1) { SHLD=0; //載入并行數(shù)據(jù)
SHLD=1; //開始串行輸出
while(!RI); //等待接收完畢
RI=0; P2=SBUF; //用開關狀態(tài)控制LED燈
delay(); }}11.4.3方式1應用實例【例11-4】
在圖11-15所示的電路中,AT89C51單片機串口外接發(fā)送器和接收器,P1口接兩位BCD碼數(shù)碼管。串口工作于方式1,波特率為4800b/s。要求編寫全雙工異步通信程序,當單片機串口收到數(shù)據(jù)后在P1口顯示出來,同時將數(shù)據(jù)加1后回發(fā)給串口。#include<reg52.h>voidmain(){ SCON=0x50; //串行口初始化,允許接收
TMOD=0x20; //定時器初始化
TH1=0xfa; //賦初值
TL1=0xfa; TR1=1; //啟動定時器
ES=1; //串口中斷初始化
EA=1; P1=0; //P1口數(shù)據(jù)先清0 while(1); //等待中斷} voidintrr()interrupt4{ if(TI)TI=0; //發(fā)送引起,清TI else //否則,接收引起
{ RI=0; //清接收中斷標志
ACC=SBUF; //讀取接收的數(shù)據(jù)
P1=ACC; //送顯示
SBUF=ACC+1; //回發(fā)到串口
} } 11.4.4方式3應用實例【例11-5】將片內RAM50H~5FH中的數(shù)據(jù)串行發(fā)送,用第9個數(shù)據(jù)位作奇偶校驗位,設晶振為11.0592MHz,波特率為2400b/s,編制串行口的發(fā)送程序。解:工作于方式3,用TB8作奇偶校驗位,在數(shù)據(jù)寫入發(fā)送緩沖器之前,先將數(shù)據(jù)的奇偶位P寫入TB8,發(fā)送采用中斷方式。波特率為2400b/s,計算可得T1的計數(shù)初值為244。#include<reg52.h>unsignedchari=0;unsignedchararray[16]_at_0x50;//將數(shù)組變量絕對定位到50H單元voidmain(){ SCON=0xc0; //串行口初始化
TMOD=0x20; //定時器初始化
TH1=244; TL1=244; TR1=1; ES=1; EA=1; //中斷初始化
ACC=array[i]; //發(fā)送第一個數(shù)據(jù)送
TB8=P; //累加器,目的取P位
SBUF=ACC; //發(fā)送一個數(shù)據(jù)
while(1); //等待中斷}voidserver()interrupt4 //串行口中斷服務程序{ TI=0; //清發(fā)送中斷標志
ACC=array[++i]; //取下一個數(shù)據(jù)
TB8=P; SBUF=ACC; if(i==15) ES=0; //發(fā)送完畢,禁止串口中斷}仿真時,先在AT89C51片內RAM的50H~5FH單元中分別設置了字符“0~9,A~F”的ASCII碼數(shù)值。單片機從串口依次向外發(fā)送了這些數(shù)據(jù),當16個數(shù)據(jù)全部發(fā)送完畢后自動停止。11.5項目設計1.設計內容及要求單片機串行口以中斷方式同PC機進行通信,采用工作方式1,波特率設定為9600b/s。要求完成以下功能:基本功能:PC機串口發(fā)送字符串TEST,單片機串口收到后,回發(fā)字符串good給PC機。發(fā)揮部分:PC機串口發(fā)送一個十六進制數(shù)據(jù),單片機收到后將其轉換為對應的十進制數(shù),然后按字符方式回發(fā)給PC機。2.硬件電路設計單片機的串行口和PC機的異步串行接口(COM1、COM2)進行連接時采用最簡單的三線法,即只需連接TXD、RXD和GND三條線即可。由于單片機采用的是TTL電平標準,而PC機的異步串行口采用RS-232C電平標準,所以不能直接相連。單片機串口通過MAX232芯片同PC機串口連接的典型電路USB轉TTL的接口電路3.程序設計1)基本功能2)發(fā)揮部分4.運行結果基本功能運行結果如圖所示。在發(fā)送區(qū)輸入字符串TEST后,單擊“發(fā)送”按鈕。單片機收到該字符串,判斷無誤后向串口回發(fā)字符串good,good字符串被順利顯示在窗口的接收區(qū)。如果發(fā)送的字符串不是連續(xù)的TEST(如TEEST)或其他字符,則單片機不會回發(fā)good字符串。發(fā)揮部分運行結果如圖所示。在發(fā)送區(qū)輸入十六進制數(shù)據(jù)FE,選中“按16進制顯示或發(fā)送”復選框,然后單擊“發(fā)送”按鈕。單片機串口收到該數(shù)據(jù)后,先將其轉換為對應的十進制數(shù)254,再以字符串方式將254回發(fā)到PC機。謝謝觀看!MCS-51單片機技術項目驅動教程清華大學出版社第12章
項目九:單片機片外三總線擴展并行SRAM12.1MCS-51單片機并行擴展三總線結構12.2擴展片外并行RAM方法12.3項目設計12.1MCS-51單片機并行擴展三總線結構在并行總線擴展中,訪問片外設備的信號線采用三總線結構,即地址總線、數(shù)據(jù)總線和控制總線。MCS-51單片機片外三總線結構如圖所示。1)數(shù)據(jù)總線MCS-51單片機的數(shù)據(jù)總線由P0口提供,用于單片機對外訪問數(shù)據(jù)的輸入輸出。因為P0口只有8位,一次處理的并行數(shù)據(jù)最大只有8位,所以MCS-51單片機屬于8位單片機。2)地址總線MCS-51單片機的地址線一共有16根,因此可尋址的地址范圍為0000H~FFFFH,一共216即64KB存儲空間。這16根地址線分別由P2口提供高8位地址線,由P0口提供低8位地址線。P0口是數(shù)據(jù)/地址的復用口,在執(zhí)行總線操作時,P0口要先輸出低8位地址信息,然后再輸入/輸出數(shù)據(jù),所以低8位地址信息只是短暫出現(xiàn)的。為了使P0口在換為數(shù)據(jù)信息時,之前的低8位地址信息不會丟失,必須要在P0口出現(xiàn)地址的時候將其鎖存起來,并一直保持到總線操作結束。采用的方法是在P0口接一個地址鎖存器,如圖12-1所示。當P0口輸出地址信息的同時,ALE引腳會自動輸出一個脈沖信號,控制地址鎖存器把地址信息A0~A7鎖存到輸出端。3)控制總線單片機在對外部設備進行讀寫時,除了地址信息和數(shù)據(jù)信息外,必要的溝通聯(lián)絡也是決定成敗的關鍵。當單片機要寫一個數(shù)據(jù)給外部設備時,在送出地址信息和數(shù)據(jù)的同時,還要發(fā)出一個控制信號用來通知外部設備接收該數(shù)據(jù),我們稱之為寫選通信號。當單片機要從外部設備讀取一個數(shù)據(jù)時,同樣也需要發(fā)出一個控制信號用來通知外部設備把數(shù)據(jù)送到數(shù)據(jù)總線上,我們稱之為讀選通信號。這些控制信號共同組成了單片機的控制總線。12.2擴展片外并行RAM方法12.2.1常用靜態(tài)RAM芯片常用的RAM有靜態(tài)RAM(SRAM)和動態(tài)RAM(DRAM)。動態(tài)RAM采用位結構形式,具有集成度高、功耗低、價格低等特點,多用于構成大容量存儲系統(tǒng),如PC機的內存條。動態(tài)RAM需要專門的刷新電路來刷新存儲的數(shù)據(jù),因此在這里不多討論。靜態(tài)RAM有不同的規(guī)格型號,容量也有多種,如6264(8K×8位)、62256(32K×8位)、628128(128K×8位)等。靜態(tài)RAM的工作原理類似,下面以SRAM6264為例介紹其基本特性及與單片機的連接。單片機在擴展外部SRAM6264時的電路設計結構分為兩種情況:一是擴展單片6264,二是擴展多片6264。12.2.2單片機與6264的接口設計1.擴展單片6264擴展單片6264時的接口電路設計比較簡單,只要按照三總線結構將單片機的地址線、數(shù)據(jù)線、控制線同6264的地址線、數(shù)據(jù)線、控制線對應連接即可,如圖所示。1)單片機寫數(shù)據(jù)過程當單片機執(zhí)行寫片外RAM存儲單元的指令時,總線操作的過程分為以下幾個步驟:(1)
P0口先輸出片外存儲單元地址的低8位,P2口輸出地址的高8位。(2)
ALE引腳輸出脈沖信號,在脈沖的高電平階段,P0口的低8位地址從74HC573的D端輸入,從Q端輸出,加到6264的地址引腳A0~A7上。(3)在ALE脈沖的下降沿,74HC573進入鎖存狀態(tài),低8位地址鎖存在Q端。(4)
P0口輸出數(shù)據(jù)信息到6264的數(shù)據(jù)端口D0~D7。(5)單片機引腳向外輸出一負脈沖到6264的寫允許信號輸入端
。(6)
6264將數(shù)據(jù)存儲到地址A0~A12所對應的存儲單元中。2)單片機讀數(shù)據(jù)過程當單片機執(zhí)行一條讀片外RAM存儲單元的指令時,總線操作的過程分為以下幾個步驟。(1)P0口先輸出片外存儲單元地址的低8位,P2口輸出地址的高8位。(2)ALE引腳輸出脈沖信號,在脈沖的高電平階段,P0口的低8位地址從74HC573的D端輸入,從Q端輸出,加到6264的地址引腳A0~A7上。(3)在ALE脈沖的下降沿,74HC573進入鎖存狀態(tài),低8位地址鎖存在Q端。(4)單片機引腳向外輸出一負脈沖到6264的讀允許信號輸入端
。(5)6264將地址A0~A12對應存儲單元中的數(shù)據(jù)取出送到端口D0~D7,數(shù)據(jù)通過P0口進入到單片機內部總線。
單片機訪問片外RAM時的總線操作時序
2.擴展多片6264在單片機擴展多片6264時,要涉及如何實現(xiàn)存儲芯片片選的問題,這又直接關系到每個芯片存儲單元的地址編碼,一般分為線選法和譯碼法兩種。1)線選法所謂線選法,就是直接以單片機的地址線作為存儲器芯片的片選信號,只需把用到的地址線與存儲器芯片的片選端直接相連即可。2)譯碼法譯碼法是使用地址譯碼器對系統(tǒng)的片外地址進行譯碼,以其譯碼輸出作為存儲器芯片的片選信號。1.使用指針變量在程序文件開始,首先要定義一個指向外部數(shù)據(jù)存儲區(qū)的專用指針變量,然后針對指針變量進行讀寫操作。程序寫法為:unsignedcharxdata*xpt; //定義指向片外RAM的專用指針xpt=0x30; //存儲單元地址送指針變量*xpt=0x60; //將數(shù)據(jù)60H送入片外RAM的30H單元中xpt=0x7fff; //存儲單元地址送指針變量ACC=*xpt //將片外RAM的7FFFH單元中的數(shù)據(jù)送
到累加器A12.2.3訪問片外RAM的軟件編程
2.使用指針定義的宏C51編譯器提供了兩組用指針定義的絕對存儲器訪問的宏。這些宏定義原型放在absacc.h文件中,使用時需要用預處理命令把該頭文件包含到文件中。程序寫法為:#include<absacc.h> //添加頭文件XBYTE[0x30]=0x60; //將數(shù)據(jù)60H送入片外
RAM的30H單元中ACC=XBYTE[0x7fff]; //將片外RAM的7FFFH單元中的
數(shù)據(jù)送到累加器A
對比這兩種方法,使用指針定義的宏的方法更為簡便些。12.3項目設計1.設計內容與要求AT89C51單片機采用一片6264外擴8KBSRAM,并向6264的10H單元開始連續(xù)寫入11~20十個數(shù)據(jù)。請完成單片機同6264的接口電路設計并編寫程序。2.硬件電路設計3.程序設計根據(jù)任務要求,編寫的C語言源程序如下:#include<absacc.h>unsignedchari,m;unsignedintj,k;voiddelay(){ for(j=100;j>0;j--) for(k=100;k>0;k--);}voidmain(){while(1){ m=11; for(i=0;i<10;i++) //向10H單元開始寫入10個數(shù)據(jù)
{ XBYTE[0x10+i]=m; m++; delay(); }}}4.運行結果如圖所示。從6264的10H單元開始連續(xù)寫入了11~20對應的十六進制數(shù)據(jù)0BH~14H。謝謝觀看!MCS-51單片機技術項目驅動教程清華大學出版社第13章項目十:ADC0809多
通道電壓采集與顯示13.1ADC0809簡介13.2ADC0809與AT89C51的接口及編程方法13.3項目設計13.1ADC0809簡介ADC0809是美國國家半導體公司生產(chǎn)的CMOS工藝,逐次逼近式并行8位A/D轉換芯片。它具有8路模擬量輸入端,最多允許8路模擬量分時輸入,共用一個A/D轉換器進行轉換。圖13-1所示為ADC0809的內部邏輯結構圖。它由8路模擬量開關、8位A/D轉換器、三態(tài)輸出鎖存器以及地址鎖存與譯碼器等組成。IN0~IN7:8個通道的模擬信號輸入端。輸入電壓范圍為0~+5V。ADDC、ADDB、ADDA:通道地址輸入端。其中,C為高位,A為低位。ALE:地址鎖存信號輸入端。在脈沖上升沿鎖存ADDC、ADDB、ADDA引腳上的信號,并據(jù)此選通IN0~IN7中的一路。8路輸入通道的地址選擇關系如表13-1所示。1.ADC0809的引腳功能START:啟動信號輸入端。當START端輸入一個正脈沖時,立即啟動A/D轉換。EOC:轉換結束信號輸出端。在啟動轉換后為低電平,轉換結束后自動變?yōu)楦唠娖剑捎糜谙騿纹瑱C發(fā)出中斷請求。OE:輸出允許控制端。為高電平時,將三態(tài)輸出鎖存器中的數(shù)據(jù)輸出到D0~D7數(shù)據(jù)端。D0~D7:8位數(shù)字量輸出端。為三態(tài)緩沖輸出形式,能夠和AT89C51單片機的并行數(shù)據(jù)線直接相連。CLK:時鐘信號輸入端。時鐘頻率范圍為10~1280kHz,典型值為640kHz。當時鐘頻率為640kHz時,轉換時間為100μs。VREF+和VREF-:A/D轉換器的正負基準電壓輸入端。VCC:電源電壓輸入(+5V)。GND:電源地。2.單片機控制ADC0809的工作過程根據(jù)圖13-1所示的ADC0809內部結構,可以歸納單片機控制ADC0809進行A/D轉換的工作過程如下:(1)為ADC0809添加基準電壓和時鐘信號。(2)外部模擬電壓信號從通道IN0~IN7中的一路輸入到多路模擬開關。(3)將通道選擇字輸入到ADDC、ADDB、ADDA引腳。(4)在ALE引腳輸入高電平,選通并鎖存相應通道。(5)在START引腳輸入高電平,啟動A/D轉換。(6)當EOC引腳變?yōu)楦唠娖綍r,在OE引腳輸入高電平。(7)將D0~D7上的并行數(shù)據(jù)讀入單片機。13.2ADC0809與AT89C51的
接口及編程方法ADC0809同AT89C51的接口設計可采用總線操作方式,也可以采用I/O口控制方式。是否正確實現(xiàn)ADC0809與AT89C51的接口連接,關鍵在于看能否滿足以下要求:(1)能正確選擇輸入通道。(2)能順利啟動轉換。(3)能順利讀取轉換結果。ADC0809芯片的轉換時間在典型時鐘頻率下為100μs左右。對A/D轉換是否完成的判別既可采用查詢方式,也可采用中斷方式,在電路連接和程序編寫上會有所不同。13.2.1采用I/O口控制方式1.輸入通道固定的電路接法在圖中,外部模擬電壓信號從通道IN4輸入。ADC0809的ADDC、ADDB和ADDA三個引腳接到固定電位上,同時讓ALE信號固定為高電平。ADC0809的其他控制信號START、EOC、OE分別由單片機的P1.5、P1.6、P1.7端口控制。單片機利用內部定時器產(chǎn)生ADC0809所需的時鐘信號并從P1.4端口輸出,A/D轉換結果從單片機的P2口讀入。#include<reg51.h>sbitstart=P1^5;sbiteoc=P1^6;sbitoe=P1^7;unsignedcharadcbuf; //定義變量存放A/D轉換結果voidADC0809() //A/D轉換子程序{ start=0; start=1; //啟動AD轉換 while(!eoc); //等待轉換結束 start=0; oe=1; //打開三態(tài)輸出鎖存器 P2=0xff; //設置P2口輸入 adcbuf=P2; //讀P2口數(shù)據(jù)到存儲變量}2.選擇輸入通道的電路接法如果模擬電壓信號的來源不固定或有多個輸入通道,那么在進行接口電路設計時,必須由單片機控制ADC0809的ADDC、ADDB和ADDA以及ALE信號來選擇并鎖存通道,其接口電路如圖13-3所示。與圖13-2的區(qū)別在于,用單片機的P1.2、P1.1、P1.0端口分別控制ADDC、ADDB和ADDA,用P1.3口控制ALE信號。sbitstart=P1^5;sbiteoc=P1^6;sbitoe=P1^7;sbitadda=P1^0;sbitaddb=P1^1;sbitaddc=P1^2;sbitale=P1^3;sbitclock=P1^4;unsignedcharadcbuf;voidADC0809(){ start=0; ale=0; adda=0; addb=0; addc=1; ale=1; start=1; ale=0; while(!eoc); start=0; oe=1; P2=0xff; adcbuf=P2;}13.2.2采用總線操作方式圖13-4所示為一典型的ADC0809與AT89C51以總線操作方式設計的接口電路,采用中斷方式進行控制。單片機的數(shù)據(jù)總線同ADC0809的數(shù)據(jù)總線連接,ADC0809的ADDA、ADDB和ADDC數(shù)據(jù)由P0口的低三位送出。單片機的地址總線只使用了P2.7,其他地址線的數(shù)據(jù)與ADC0809無關。P2.7和寫選通信號
通過或非門輸出接到ADC0809的ALE和START引腳,和讀選通信號
通過或非門輸出接到ADC0809的OE引腳。以中斷方式編寫的單通道A/D轉換例程如下:#include<reg51.h>#include<absacc.h>unsignedcharadcbuf;voidmain(){ IT1=1; //邊沿觸發(fā) EA=1; EX1=1; XBYTE[0x7fff]=0x04; while(1); }voidint_1()interrupt2{ adcbuf=BYTE[0x7fff]; //讀數(shù)存放XBYTE[0x7fff]=0x04;}8個通道巡回轉換的程序如下:#include<reg51.h>#include<absacc.h>unsignedchari=0,adcbuf[8];voidmain(){ IT1=1; //邊沿觸發(fā) EA=1; EX1=1; XBYTE[0x7fff]=i; //啟動0通道轉換
while(1); }voidint_1()interrupt2{ adcbuf[i]=BYTE[0x7fff]; //通道i讀數(shù)存放 if(++i!=8) //最后一個通道沒結束 BYTE[0x7fff]=i; //啟動下一個通道轉換}13.3項目設計1.設計內容及要求單片機AT89C52擴展一片并行A/D轉換器ADC0809同時采集三路外部電壓信號,外部電壓信號范圍為0~5V。采集的三路電壓值使用四位LED數(shù)碼管輪流顯示,時間間隔自定,電壓單位為mV。同時用一位數(shù)碼管顯示外部電壓對應的通道號。#include<reg52.h>#include<absacc.h>#defineADC0809XBYTE[0x7fff]sbitCLK=P3^0;unsignedchari=0,j=1,k=0;unsignedintvalue;unsignedcharadcbuf[3],dispbuf[6];unsignedcharcodesegcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //數(shù)字“0~9”及“滅”狀態(tài)的共陽七段碼表voiddelay(unsignedcharx) //延時程序,約1ms{unsignedcharm,n;for(m=x;m>0;m--)for(n=120;n<0;n--);}voiddisplay() //顯示程序{value=adcbuf[j-1]*(float)5000/255; //轉換結果換算為電壓值,單位為mVdispbuf[0]=value%10; //分離個、十、百、千位dispbuf[1]=value/10%10;dispbuf[2]=value/100%10;dispbuf[3]=value/1000;dispbuf[4]=10; //第5位數(shù)碼管對應“滅”狀態(tài)dispbuf[5]=j; //第6位數(shù)碼管顯示通道號for(i=0;i<6;i++){P2=(0x20>>i); //P2口送位選信號P1=segcode[dispbuf[i]]; //P1口送7段碼值delay(5); //延時5msP1=0xff; //消隱 }}voidmain(){TMOD=0x12; //定時器1模式1,定時器0模式2TH0=0xFE; //定時器0初值,產(chǎn)生時鐘信號TL0=0xFE;TL1=(65536-10000)%256; //設置定時器1初值,定時10msTH1=(65536-10000)/256; TR0=1; //啟動定時器TR1=1; PT1=1; //設置定時器1中斷為高優(yōu)先級PX1=1; //設置外部中斷1為高優(yōu)先級ET0=1; //開定時器中斷ET1=1; IT1=1; //外部中斷1邊沿觸發(fā)EX1=1; //開外部中斷1EA=1; //開總中斷while(1){ADC0809=j; //寫通道號,啟動A/D轉換display(); //顯示通道電壓值,單位為mV}}voidint_1()interrupt2{ adcbuf[j-1]=ADC0809; //讀通道j數(shù)據(jù)并存放}voidTimer1_Serve()interrupt3{ TL1=(65536-10000)%256; //重裝定時初值 TH1=(65536-10000)/256; if(++k==100) //定時夠1s{ k=0; j++; //通道號加1 if(j==4)j=1; //通道3結束,回到通道1 ADC0809=j; //啟動下一個通道轉換
}}voidTimer0_Serve()interrupt1 //定時器0中斷,輸出方波{ CLK=~CLK;}謝謝觀看!MCS-51單片機技術項目驅動教程清華大學出版社第14章
項目十一:基于DAC0832的數(shù)字波形發(fā)生器14.1Proteus單片機系統(tǒng)仿真基礎14.251單片機的串行接口通信14.351單片機的I2C通信14.4單片機擴展多片并行RAM14.1DAC0832簡介 DAC0832是美國國家半導體公司的8位單片D/A轉換器芯片,內部具有兩級輸入數(shù)據(jù)寄存器,使DAC0832適于各種電路的需要。它能直接與單片機AT89C52相連接,采用二次緩沖方式,可以在輸出的同時,采集下一個數(shù)據(jù),從而提高轉換速度。還可以在多個轉換器同時工作時,實現(xiàn)多通道D/A的同步轉換輸出。D/A轉換結果采用電流形式輸出,可通過一個高輸入阻抗的線性運算放大器得到相應的模擬電壓信號。DAC0832主要的特性參數(shù)如下:分辨率為8位。只需要在滿量程下調整其線度。電流輸出,轉換時間為1μs;可雙緩沖、單緩沖或者直接數(shù)字輸入。功耗低,芯片功耗約為20mW。單電源供電,供電電壓為+5~+15V。工作溫度范圍為-40~+85℃。3.工作方式在應用時,DAC0832通常有三種工作方式:直通方式、單緩沖方式、雙緩沖方式。(1)直通方式:將兩個寄存器的五個控制端預先置為有效信號,兩個寄存器都開通,只要有數(shù)字信號輸入就立即進行D/A轉換。(2)單緩沖方式:使DAC0832的兩個輸入寄存器中有一個處于直通方式,另一個處于受控方式,或者控制兩個寄存器同時導通和鎖存。(3)雙緩沖方式:DAC0832的輸入寄存器和DAC寄存器分別受控。三種工作方式的區(qū)別是:直通方式不需要選通,直接進行D/A轉換;單緩沖方式一次選通;雙緩沖方式二次選通。14.2DAC0832與AT89C51的
接口及編程方法14.2.1直通方式DAC0832輸出模擬電壓時,是通過一個運算發(fā)送器實現(xiàn)單極性輸出。IOUT1引腳外接運算放大器的反相端(-),IOUT2外接運算放大器的同相端(+),并且接模擬地AGND。RFB引腳接運放的輸出端。輸出電壓VOUT=-VREF×DIN/256。當VREF=-5V時,VOUT的輸出范圍為0~5V。2.程序設計D/A轉換子程序的功能是將任意給定的數(shù)字量轉換成對應的模擬電壓,函數(shù)的入口參數(shù)為要轉換的8位數(shù)字量,無返回值。編程方法如下:#include<reg51.h>voidDAC0832(unsignedcharx) //輸出固定電壓程序{ P0=x;}14.2.2單緩沖方式#include<absacc.h> //添加訪問存儲器宏定義的頭文件voidDAC0832(x) //參量x為轉換的數(shù)字量{XBYTE[0x7FFF]=x; //DAC0832的地址使用0x7FFF}14.2.3雙緩沖方式主要在以下兩種情況下需要用雙緩沖方式的D/A轉換:①需要先把待轉換的數(shù)據(jù)送到輸入緩存器,然后在某個時刻再啟動D/A轉換;②在需要同步進行D/A轉換的多路DAC系統(tǒng)中,采用雙緩沖方式,可以在不同的時刻把要轉換的數(shù)據(jù)分別送入每個DAC0832的輸入寄存器,然后由一個轉換指令同時啟動多個DAC0832同步進行D/A轉換。1.硬件電路假設有兩片DAC0832要實現(xiàn)同步轉換,接口電路如圖14-5所示。分別用P2.5和P2.6引腳連接兩片DAC0832的片選信號CS,控制選通兩路輸入寄存器;P2.7連到兩路D/A轉換器的XFER端控制同步轉換輸出;WR同時與兩片DAC0832的WR1和WR2端相連。2.程序設計#include<absacc.h>#defineDAC0832XBYTE[0xefff]//設置兩個DAC寄存器的同步控制地址#defineDAC1XBYTE[0xfeff] //設置1#DAC0832輸入寄存器的訪問地址#defineDAC2XBYTE[0xfdff]//設置2#DAC0832輸入寄存器的訪問地址unsignedchari,data1=100,data2=50;voidmain(){ while(1) { DAC1=data1; DAC2=data2; DAC0832=data1; //此處的data1無意義,只為使兩片的XFER同時有效 }}14.3項目設計1.設計內容及要求 AT89C51單片機的P0口接DAC0832的8個輸入端。請用單緩沖的方式,設計硬件電路并編寫程序,實現(xiàn)用中斷方式控制示波器分別顯示方波、三角波、鋸齒波和正弦波,頻率任意。2.硬件電路設計3.程序設計#include<reg51.h>#include<absacc.h>#include<math.h>#defineDAC0832XBYTE[0xfeff]unsignedcharflag=1;voiddelay(unsignedintt) /*延時函數(shù)*/{ while(t--);}voidsaw(void) /*鋸齒波發(fā)生函數(shù)*/{
unsignedchari;for(i=0;i<250;i++)
{ DAC0832=i; //進行D/A轉換 delay(200); //延時一段時間 }}voidsquare(void) /*方波發(fā)生函數(shù)*/{DAC0832=0x00; //輸出低電平delay(40000); //延時一段時間DAC0832=0xfe; //輸出高電平delay(40000); //延時一段時間}voidsanjiao(void) /*三角波發(fā)生函數(shù)*/{
unsignedchari;for(i=0;i<250;i++)
{ DAC0832=i; //進行D/A轉換
delay(100); //延時一段時間 }for(i=250;i>0;i--) { DAC0832=i; delay(100); }}voidzhengxian(void) /*正弦波發(fā)生函數(shù)*/{
unsignedchari; for(i=0;i<200;i++)DAC0832=125*sin(0.0314*i)+125; //計算函數(shù)值并進行轉換}voidmain(){ EX0=1; //開外部中斷0 IT0=1; //邊沿觸發(fā) EA=1; while(1) //根據(jù)按鍵次數(shù)控制波形輸出
{ if(flag==1) square(); if(flag==2) saw(); if(flag==3) sanjiao(); if(flag==4) zhengxian(); }}voidint0()interrupt0 //外部中斷0中斷函數(shù){ flag++; if(flag==5) flag=1;}4.運行結果謝謝觀看!MCS-51單片機技術項目驅動教程清華大學出版社第15章項目十二:AT89C51
擴展串行E2PROMAT24C0215.1I2C總線簡介15.2AT89C51擴展I2C總線方法15.3AT89C51擴展I2C總線編程
15.4項目設計
15.1I2C總線簡介
I2C總線是Philips公司開發(fā)的二線式串行總線,由SDA、SCL兩根線構成,其中SDA是數(shù)據(jù)線,SCL是時鐘線。
SDA、SCL這兩根線都是開漏或者集電極開路輸出結構,因此在硬件連接時要接上拉電阻。15.1I2C總線簡介 I2C總線的主要特點是接口線少、通信速率高等。總線長度最高可達6.35m,最大傳輸速率為100Kb/s。 I2C總線用于連接各種微控制器、集成電路芯片和其他外圍設備,它們可以是單片機,A/D、D/A轉換器,靜態(tài)RAM或ROM,LCD顯示器,以及專用集成電路等。
I2C總線上的器件分為主器件和從器件,二者都既可以作發(fā)送器,也可以作接收器。總線狀態(tài)必須由主器件(通常為單片機)來控制,由主器件產(chǎn)生串行時鐘、控制總線方向、產(chǎn)生起始位和停止位信號。15.1I2C總線簡介
I2C總線在通信過程中共有五種類型信號,分別是:起始信號、停止信號、應答信號、非應答信號和數(shù)據(jù)信號。
起始信號S:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。
停止信號P:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數(shù)據(jù)。15.1.1I2C總線信號邏輯15.1I2C總線簡介應答信號:接收器接收到8bit數(shù)據(jù)后,向發(fā)送器發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù);非應答信號:當全部數(shù)據(jù)接收完畢后,接收器向發(fā)送器發(fā)出特定的高電平脈沖,隨后發(fā)停止位,結束接收數(shù)據(jù)過程。15.1I2C總線簡介數(shù)據(jù):當SCL為高電平時,SDA上信號有效。因此,當SCL為高電平時,數(shù)據(jù)線必須保持穩(wěn)定,如有變化,就會被當做起始或停止信號。
要更新每一位數(shù)據(jù)時,必須在SCL為低電平時進行。15.1I2C總線簡介例如:發(fā)送數(shù)據(jù)1011時的總線邏輯為:
每傳輸一位數(shù)據(jù),都有一個時鐘脈沖相對應。時鐘脈沖由主機提供,不必是周期性的,其時鐘間隔可以不同。
I2C總線上傳輸?shù)臄?shù)據(jù)和地址字節(jié)均為8位,且高位在前,低位在后。15.1I2C總線簡介
總線上每一個器件都有一個器件地址(就像電話線網(wǎng)絡上,每一個話機都有一個特定的號碼),主機通過發(fā)地址信息來和需要通信的從機建立聯(lián)系。 (1)數(shù)據(jù)傳輸時
主機先發(fā)送啟動信號和時鐘信號,隨后發(fā)送地址信息來尋址被控器件,并規(guī)定數(shù)據(jù)傳送方向。15.1.2I2C總線數(shù)據(jù)傳輸過程15.1I2C總線簡介(2)從機對地址的響應
當主機發(fā)送尋址字節(jié)時,總線上所有從機都將其中的高7位地址與自己的地址比較,若相同,再根據(jù)讀/寫位確定自己是作為發(fā)送器還是作為接收器。
作為接收器:在尋址字節(jié)之后,主機將通過SDA線向從機發(fā)送數(shù)據(jù),從機每收到一個數(shù)據(jù)就回一個應答信號。主機數(shù)據(jù)發(fā)送完畢后發(fā)送終止信號,結束傳送過程。
作為發(fā)送器:在尋址字節(jié)之后,從機通過SDA線發(fā)送數(shù)據(jù),主機接收并回應答信號。當主機不愿再接收數(shù)據(jù)時就回一個非應答信號。并發(fā)送終止信號,結束傳送過程。15.1I2C總線簡介器件類型D7-D4:是I2C總線委員會分配好的,例如:E2PROM是1010;片選地址D3-D1:由器件的外部引腳A2、A1、A0的接線來確定(總線上同一類型的器件最多只能接8片);最后一位D0:是數(shù)據(jù)方向位,1:讀;0:寫。
這里所說的“讀”和“寫”是站在主機立場上的,讀:主機從從機讀取數(shù)據(jù);寫:主機向從機發(fā)送數(shù)據(jù)。器件地址的構成:15.1I2C總線簡介
因此,每一個I2C器件實際上有兩個地址,一個是寫地址,一個是讀地址。
器件內部子地址:當器件內部有連續(xù)的子地址空間時,對這些空間進行連續(xù)讀寫,子地址會自動加1。15.1I2C總線簡介15.2AT89C51擴展I2C總線方法
對于AT89C51來說,芯片本身無I2C總線接口,如果需要和I2C器件通信,則可以利用I/O口,通過編程,軟件模擬I2C通信數(shù)據(jù)傳輸過程,如圖15-5所示。由于總線狀態(tài)是由單片機控制的,因此I2C上的信號邏輯都需要通過單片機編程實現(xiàn),方法如下:發(fā)起始信號S:SCL=0→SDA=1→SCL=1 →SDA=0
→SCL=0發(fā)停止位P: SCL=0→SDA=0→SCL=1 →SDA=1
→SCL=015.2AT89C51擴展I2C總線方法發(fā)送1位數(shù)據(jù):SCL=0→SDA置1或0→ SCL=1 →SCL=0接收1位數(shù)據(jù):SDA置1(為讀線上數(shù)據(jù)做準備) →SCL=1并讀取SDA線上數(shù)據(jù) →SCL=015.2AT89C51擴展I2C總線方法單片機與串行E2PROM進行I2C通信流程
(1)單片機從AT24C02讀數(shù)據(jù)流程
發(fā)起始位→發(fā)器件寫地址→檢查應答位→發(fā)存儲單元地址→檢查應答位→重發(fā)起始位→發(fā)器件讀地址→檢查應答位→接收數(shù)據(jù)→發(fā)應答位→……→接收完畢,發(fā)非應答位→發(fā)停止位。15.2AT89C51擴展I2C總線方法(2)單片機向AT24C02寫數(shù)據(jù)流程
發(fā)起始位→發(fā)器件寫地址→檢查應答位→發(fā)存儲單元地址→檢查應答位→發(fā)數(shù)據(jù)→檢查應答位→……→數(shù)據(jù)發(fā)送完畢,發(fā)停止位。
15.2AT89C51擴展I2C總線方法15.3AT89C51擴展I2C總線編程
單片機用I/O口模擬I2C總線通信時,需要通過編程先產(chǎn)生I2C總線所需的各種邏輯信號和時鐘信號,然后按照I2C總線上數(shù)據(jù)的讀寫流程組織程序就可以了。1)起始信號voidStart(){ SDA=1; SCL=1; SDA=0; SCL=0;}2)停止信號voidStop(){ SCL=0; SDA=0; SCL=1; SDA=1;}15.3AT89C51擴展I2C總線編程3)應答信號voidYEAck(){ SDA=0; SCL=1; SCL=0;}4)非應答信號voidNoAck(){ SDA=1; SCL=1; SCL=0;}幾個邏輯信號的編程產(chǎn)生方法。5)測試應答信號bitTestAck(){ bitErrorBit; SDA=1; SCL=1; ErrorBit=SDA; SCL=0; return(ErrorBit);}
15.3AT89C51擴展I2C總線編程6)寫一個字節(jié)數(shù)據(jù)Write8Bit(unsignedcharinput){ unsignedchartemp; for(temp=8;temp!=0;temp--) { SDA=(bit)(input&0x80); SCL=1; SCL=0; input=input<<1; }}15.3AT89C51擴展I2C總線編程7)接收一個字節(jié)數(shù)據(jù)ucharRead8Bit(){ unsignedchartemp,rbyte=0;
for(temp=8;temp!=0;temp--) { SDA=1; SCL=1; rbyte=rbyte<<1;
rbyte=rbyte|((unsignedchar)(SDA)); SCL=0; } return(rbyte);}15.3AT89C51擴展I2C總線編程15.4項目設計
1.設計內容及要求 設計單片機AT89C51同E2PROMAT24C02的接口電路,并編寫程序,要求單片機先寫入8個字節(jié)數(shù)據(jù)到AT24C02從0x30開始的單元中,然后再從0x32單元開始逐個讀出5個數(shù)據(jù)并送數(shù)碼管顯示。
15.4項目設計2.硬件電路設計
15.4項目設計3.程序設計程序采用模塊化設計,先建立每一個基本邏輯信號的子程序,然后根據(jù)項目任務在主程序中按流程調用即可。
謝謝觀看!MCS-51單片機技術項目驅動教程清華大學出版社第16章項目十三:單片機擴展SPI總線接口
16.1SPI總線簡介16.2AT89C51擴展SPI總線接口方法
16.3AT89C51擴展SPI總線程序編寫方法16.4項目設計1: AT89C52擴展串行A/D轉換器TLC254316.5項目設計2: AT89C52擴展串行D/A轉換器TLC5615
16.1SPI總線簡介
SPI(serialperipheralinterface,串行外圍設備接口)是Motorola公司推出的一種三線同步總線。它以主從方式工作,通常有一個主設備和一個或多個從設備。 SPI通信的三根線包括:串行數(shù)據(jù)輸出線SDO(serialdataout):主設備數(shù)據(jù)輸出,從設備數(shù)據(jù)輸入。串行數(shù)據(jù)輸入線SDI(serialdatain):主設備數(shù)據(jù)輸入,從設備數(shù)據(jù)輸出。串行時鐘線SCK(serialclock):時鐘信號由主設備產(chǎn)生。 此外,每個掛接在SPI總線上的從設備都有一根片選線。 SPI總線系統(tǒng)結構如圖16-1所示。系統(tǒng)有一臺主機,通常是單片機,從機是具有SPI接口的外圍器件。主機可向一個或多個外圍器件傳送數(shù)據(jù),也可控制外圍器件向主機傳送數(shù)據(jù)。16.1SPI總線簡介圖16-1SPI總線系統(tǒng)結構圖16.2AT89C51擴展SPI總線接口方法 MCS-51單片機在與SPI器件進行連接通信時,由于其內部沒有集成的SPI總線接口,所以通常利用其I/O口,按照SPI總線的通信協(xié)議來控制完成數(shù)據(jù)的輸入/輸出。如圖16-2所示。圖16-2AT89C51擴展SPI接口示意圖16.3AT89C51擴展SPI總線編程方法
在SPI總線通信時,主機負責產(chǎn)生時鐘信號,在時鐘上升沿和下降沿的同步下,控制數(shù)據(jù)的輸入和輸出。數(shù)據(jù)的傳送格式是高位在前,低位在后。1位數(shù)據(jù)的輸入/輸出過程如圖16-3所示。圖16-3SPI總線數(shù)據(jù)輸入/輸出過程在一個時鐘脈沖中,下降沿主機從SDI輸入數(shù)據(jù),上升沿主機從SDO輸出數(shù)據(jù)。但對于不同的外圍器件,也有的剛好反過來。當主機產(chǎn)生8個時鐘脈沖后,就完成了一個字節(jié)數(shù)據(jù)的輸入和輸出。當AT89C51單片機作為主機時,由于是利用I/O線來模擬SPI接口通信,所以在編程時,只要按照上述通信規(guī)則對I/O口進行讀寫操作即可。16.3AT89C51擴展SPI總線編程方法16.3.1數(shù)據(jù)輸出 以單片機發(fā)送四位二進制數(shù)據(jù)1101B為例,發(fā)送時高位在前。16.3AT89C51擴展SPI總線編程方法【例16-1】如圖16-5所示,編寫AT89C51的串行輸出子程序SPIOUT,將AT89C51中的unsignedchar型變量databuf中的數(shù)據(jù)發(fā)送到E2PROMMCM2814的SPISI線上。16.3AT89C51擴展SPI總線編程方法解:C語言程序清單如下:#inclued<reg51.h>#include<intrins.h>sbitSCK=P1^1; //P1.1模擬SCKsbitSS=P1^2; //P1.2控制片選信號SSsbitSDO=P1^0; //P1.0模擬SDOvoidSPIOUT(unsignedchardatabuf)//發(fā)送子程序 { unsignedchari; SCK=1; SS=0;//片選有效
for(i=0;i<8;i++) { SCK=0;//時鐘輸出低電平 _nop_();//等待一段時間 _nop_(); if(databuf&0x80) //判斷databuf最高位 SDO=1; //為1,SDO發(fā)送1 else SDO=0; //為0,SDO發(fā)送0 SCK=1; //時鐘輸出高電平,產(chǎn)生脈沖上升沿 databuf=databuf<<1;//databuf左移1位,準備發(fā)送次高位
}}16.3AT89C51擴展SPI總線編程方法16.3.2數(shù)據(jù)輸入 以單片機發(fā)送四位二進制數(shù)據(jù)1101B為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人抵押貸款合同季度范本
- 臨街店鋪購買合同范本
- 二次供水設備采購合同
- 專業(yè)服裝管理軟件經(jīng)銷合同書
- 上海市股權轉讓合同標準范本
- 二手房銷售代理合同協(xié)議
- 中外合作種植戰(zhàn)略合作合同
- 云計算服務提供商數(shù)據(jù)保密合同
- 返聘人員協(xié)議書
- IT行業(yè)員工培訓勞動合同范本
- (2024)甘肅省公務員考試《行測》真題及答案解析
- 醫(yī)院醫(yī)務人員醫(yī)德考評標準
- 小紅書種草營銷師(初級)認證考試真題試題庫(含答案)
- 癲癇病人的護理(課件)
- 企業(yè)資產(chǎn)管理培訓
- 2024年WPS計算機二級考試題庫350題(含答案)
- 2024年4月27日浙江省事業(yè)單位招聘《職業(yè)能力傾向測驗》試題
- 2024年6月浙江省高考地理試卷真題(含答案逐題解析)
- 醫(yī)院培訓課件:《如何撰寫護理科研標書》
- 河南省鄭州市2023-2024學年高二上學期期末考試 數(shù)學 含答案
- 2024年山東省濟南市中考英語試題卷(含答案)
評論
0/150
提交評論