基于單片機(jī)的雙路信號檢測系統(tǒng)綜合設(shè)計說明_第1頁
基于單片機(jī)的雙路信號檢測系統(tǒng)綜合設(shè)計說明_第2頁
基于單片機(jī)的雙路信號檢測系統(tǒng)綜合設(shè)計說明_第3頁
基于單片機(jī)的雙路信號檢測系統(tǒng)綜合設(shè)計說明_第4頁
基于單片機(jī)的雙路信號檢測系統(tǒng)綜合設(shè)計說明_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、基于單片機(jī)的雙路信號檢測系統(tǒng)綜合設(shè)計一設(shè)計任務(wù):設(shè)計一個能同時對環(huán)境溫度和0V2.5V直流電壓進(jìn)行檢測的系統(tǒng),電壓的檢測采用TLC549串行ADC器件;對溫度的檢測采用LM75A數(shù)字溫度傳感器;檢測結(jié)果以動態(tài)掃描方式顯示在一個8位LED數(shù)碼顯示器上(可以同時顯示,也可以輪流顯示)。結(jié)合Quick51核心板和SmartSOPC教學(xué)實驗開發(fā)平臺的有關(guān)實驗電路完成系統(tǒng)原理圖設(shè)計與程序設(shè)計;程序的調(diào)試在實驗箱上完成。完成設(shè)計報告的撰寫,設(shè)計報告應(yīng)包括系統(tǒng)原理圖、設(shè)計原理、設(shè)計過程以與程序調(diào)試情況等容。擴(kuò)展要求:加入鍵盤的應(yīng)用:程序運行后,LED顯示器顯示“P”,表示處于“待命”狀態(tài),按下“1”鍵進(jìn)行電

2、壓測量并顯示;按下“2”鍵進(jìn)行溫度測量并顯示;按下“3”鍵電壓與溫度交替測量并顯示;按下“8”鍵返回“待命”狀態(tài)。二硬件電路設(shè)計SCLSDALM75AP0口74HC573Q1Q8D1D8鍵盤P2.0P2.1P2.2P2.7KEY1KEY2KEY3KEY8數(shù)碼管位選端口COM6數(shù)碼管段選端口COM3P1口CLKDATnCSTLC549AT89C51P3.4P3.5P3.6P3.7P3.81系統(tǒng)組成框圖2單元電路(1) 微控制器AT89C51組成:AT89C51控制芯片,晶振電路,按鍵復(fù)位電路 作用:裝載程序,為外界電路提供I/O接口,對外界送來的數(shù)據(jù)進(jìn)行處理,提供控制信號,時鐘信號,對電路進(jìn)行復(fù)

3、位等。 工作原理:AT89C51主要由中央處理器(CPU),部RAM,部ROM,4個8位的并行雙向I/O端口,2個定時/計數(shù)器,一個串行接口電路,部時鐘產(chǎn)生電路等構(gòu)成。以上各部分通過部數(shù)據(jù)總線相連接。與外設(shè)相連時為三總線方式:數(shù)據(jù)總線、地址總線、控制總線。其中CPU在單片機(jī)部協(xié)調(diào)各功能部件之間的數(shù)據(jù)傳送,數(shù)據(jù)運算等操作,并對單片機(jī)外發(fā)出若干控制信息;RAM用于存儲程序運行中產(chǎn)生的數(shù)據(jù);ROM用于存儲程序;P1口只能用做I/O口,P0口可用做I/O口或在訪問外部存儲器時分時用做低8位地址線和8為數(shù)據(jù)線,P0口可用做I/O口或在訪問外部存儲器時輸出高8位地址,在編程和檢驗時用做高位地址和控制信號。

4、 將程序拷入微控制器的部ROM之后,根據(jù)程序?qū)ξ⒖刂破鞯墓苣_進(jìn)行分配,利用中央處理器發(fā)出控制信號控制數(shù)據(jù)的輸入輸出,并對輸入的數(shù)據(jù)進(jìn)行處理,且將處理后的數(shù)據(jù)發(fā)送到相應(yīng)的外部電路中。電原理圖:見圖1。 圖1.AT89C51控制電路原理圖(2) 溫度測量電路(LM75A)組成:LM75A芯片。 作用:測量環(huán)境溫度并將測量值通過單片機(jī)送到數(shù)碼管顯示。 工作原理:LM75A 是一個使用了置帶隙溫度傳感器和-模數(shù)轉(zhuǎn)換技術(shù)的溫度-數(shù)字轉(zhuǎn)換器。LM75A 利用置的分辨率為0.125的帶隙傳感器來測量器件的溫度,并將模數(shù)轉(zhuǎn)換得到的11 位的二進(jìn)制數(shù)的補(bǔ)碼數(shù)據(jù)存放到器件Temp 寄存器中。Temp 寄存器的數(shù)據(jù)

5、可隨時被I2C 總線上的控制器讀出。LM75A 可配置成不同的工作條件,它可設(shè)置成在正常工作模式下周期性地對環(huán)境溫度進(jìn)行監(jiān)控或進(jìn)入關(guān)斷模式來將器件功耗降至最低。本實驗中只需設(shè)置成正常模式即可。在正常工作模式中,每隔100ms 執(zhí)行一次溫度-數(shù)字的轉(zhuǎn)換,Temp 寄存器的容在每次轉(zhuǎn)換后更新。溫度寄存器通常存放著一個 11 位的二進(jìn)制數(shù)的補(bǔ)碼,用來實現(xiàn)0.125的精度。 在單片機(jī)的控制下,利用兩個端口 SCL和SDA,LM75A 可以作為從器件連接到兼容2 線串行接口的I2C 總線上,在本實驗中,SCL連接單片機(jī)P3.3接口,SDA連接P3.4接口。單片機(jī)提供SCL 時鐘信號,并通過SDA 端讀出

6、器件的數(shù)據(jù)。 電原理圖:見圖2。圖2. 溫度測量電路原理圖(3) 數(shù)字電壓表電路(TLC549)組成:模擬信號產(chǎn)生電路,TLC549芯片。作用:TLC549將輸入的模擬信號轉(zhuǎn)換成8位數(shù)字信號,然后將轉(zhuǎn)換后的數(shù)據(jù)通過單片機(jī)送入數(shù)碼管顯示。工作原理:模擬信號產(chǎn)生電路通過滑動變阻器來產(chǎn)生02.5V的電壓,送入TLC549的模擬信號入口。TLC549具有4MHz片系統(tǒng)時鐘和軟、硬件控制電路,轉(zhuǎn)換時間最長17s,總失調(diào)誤差最大為±0.5LSB,典型功耗值為6mW。采用差分參考電壓高阻輸入,抗干擾,可按比例量程校準(zhǔn)轉(zhuǎn)換圍。 當(dāng)CS為高時,數(shù)據(jù)輸出(DATA OUT)端處于高阻狀態(tài),此時I/O C

7、LOCK不起作用。將CS置低,部電路在測得CS下降沿后,再等待兩個部時鐘上升沿和一個下降沿后,確認(rèn)這一變化,最后自動將前一次轉(zhuǎn)換結(jié)果的最高位(D7)位輸出到DATA OUT端上,前四個I/O CLOCK周期的下降沿依次移出D6、D5、D4、D3,采樣保持電路在第4個I/O CLOCK下降沿開始采樣下一個模擬輸入,接下來的3個I/O CLOCK周期的下降沿移出第D2、D1、D0,最后,采樣保持電路在第8個I/O CLOCK周期的下降沿起作用,保持功能將持續(xù)4個部時鐘周期,然后開始進(jìn)行32個部時鐘周期的A/D轉(zhuǎn)換。第8個I/O CLOCK后,CS必須為高,或I/O CLOCK保持低電平,這種狀態(tài)需

8、要維持36個部系統(tǒng)時鐘周期以等待保持和轉(zhuǎn)換工作的完成。電原理圖:見圖3。圖3. 數(shù)字電壓表電路原理圖(4) 鍵盤組成:按鍵(只需4個:KEY1,KEY2,KEY3,KEY8)。作用:產(chǎn)生顯示部分的選擇信號。工作原理:當(dāng)按鍵未按下時,按鍵輸出為高電平,當(dāng)按鍵按下時,按鍵輸出為低電平。單片機(jī)對按鍵進(jìn)行掃描,當(dāng)掃描到某個按鍵按下(即為低電平)時,判斷該信號有效,則該按鍵對應(yīng)的數(shù)據(jù)顯示在數(shù)碼管上。在本實驗中,KEY1對應(yīng)電壓顯示,KEY2對應(yīng)溫度顯示,KEY3對應(yīng)電壓溫度交替顯示,KEY8對應(yīng)待命,顯示“P”。電原理圖:見圖4。圖4. 按鍵電路原理圖(5) 數(shù)碼管掃描顯示電路組成:8個七段數(shù)碼管,鎖存

9、器74HC573。作用:將單片機(jī)送來的數(shù)據(jù)通過數(shù)碼管顯示出來,74HC573用于鎖存要顯示的數(shù)據(jù)。工作原理:數(shù)碼管的連接方式分為共陰極和共陽極數(shù)碼管。共陽極接法,把數(shù)碼管的陽極連在一起,使用時公共陽極接+5V,這時陰極接低電平的段數(shù)碼管就導(dǎo)通點亮,而接高電平的則不點亮。共陰極接法,把數(shù)碼管的陰極接在一起,使用時公共陰極接地,這時陽極接高電平的段數(shù)碼管就導(dǎo)通點亮,而接低電平的則不亮。 數(shù)碼管動態(tài)顯示方式采用掃描法輪流點亮各個LED數(shù)碼管:某時刻段選控制端口輸出一個字符的顯示碼,同時位選控制端口選中其中的一個數(shù)碼管進(jìn)行顯示,這樣周而復(fù)始,將各顯示碼依次送到被選中的數(shù)碼管,當(dāng)顯示頻率達(dá)到幾百赫茲時,

10、由于人眼的視覺暫留原理,就好像數(shù)碼管將需要顯示的數(shù)據(jù)“同時”顯示了出來。在本實驗中,P1端口用做位選,P0端口用做段選。電原理圖:見圖5。圖5. 數(shù)碼管掃描電路原理圖2系統(tǒng)完整的原理圖見圖6。三程序設(shè)計1模塊化程序設(shè)計模塊化程序設(shè)計方法的基本思路是:把一個復(fù)雜問題的求解過程分階段進(jìn)行,每個階段處理的問題都控制在人們?nèi)菀桌斫夂吞幚淼膰?。具體說,可采取以下方法來保證得到結(jié)構(gòu)化的程序:自頂向下;逐步細(xì)化;模塊化設(shè)計;結(jié)構(gòu)化編碼。利用模塊化的設(shè)計方法,考慮周全,結(jié)構(gòu)清晰,層次分明,作者容易寫,讀者容易看。開始2總的程序流程框圖否否否否是是是是顯示當(dāng)前輸出讀取電壓值讀取溫度值待命讀取電壓值和溫度值定義外

11、部變量k系統(tǒng)初始化顯示“P”k=”3”k=”2”?k=”1”?k=”8”?k變化?KeyScan,得到k值輸出“P”輸出溫度值輸出電壓值輸出電壓和溫度3各部分程序設(shè)計(1)電壓讀取與輸出顯示部分該模塊的主要功能是讀取A/D轉(zhuǎn)換后的電壓值,并將電壓值通過顯示程序送到數(shù)碼管顯示出來。主要包含的函數(shù)有:ReadAdc(),Delay(),DispVol(),AdcInit()。各函數(shù)功能如下所示:ReadAdc():讀取A/D轉(zhuǎn)換結(jié)果并返回8位ADC代碼;Delay():電壓顯示部分的延時函數(shù);DispVol():將ADC值轉(zhuǎn)換成電壓值,并顯示出來;AdcInit():初始化ADC接口。(2) Vo

12、lTab.H8位A/D轉(zhuǎn)換結(jié)果對應(yīng)的電壓數(shù)據(jù)表,可直接用于顯示。(3)溫度讀取與輸出顯示部分 該模塊的主要功能是讀取LM75A溫度寄存器中的溫度值,并將溫度值通過顯示程序送到數(shù)碼管顯示出來。主要包含的函數(shù)有:LM75A_GetTemp(),Delay75(),ByteToStr(),DispTemp()。各函數(shù)功能如下所示:LM75A_GetTemp():讀出LM75A的溫度值并返回LM75A溫度寄存器的數(shù)值;Delay75():溫度顯示部分的延時函數(shù);DispTemp():在數(shù)碼管上顯示出溫度值;ByteToStr():將字節(jié)型變量c轉(zhuǎn)換為十進(jìn)制字符串。(4)顯示模塊該模塊的主要功能是為各種

13、需要在數(shù)碼管上顯示數(shù)據(jù)的程序提供顯示功能。主要包含的函數(shù)有:T1INTSVC(),DispClear(),DispChar(),DispStr(),DispDotOn(),DispInit()。各函數(shù)功能如下所示:T1INTSVC():定時器T1的中斷服務(wù)函數(shù);DispClear():清除數(shù)碼管的所有顯示;DispChar():在數(shù)碼管上顯示字符;DispStr():在數(shù)碼管上顯示字符串;DispDotOn():顯示指定位的小數(shù)點;DispInit():數(shù)碼管掃描顯示初始化。(5)模擬I2C總線模塊該模塊是標(biāo)準(zhǔn)80C51單片機(jī)模擬I2C總線的主機(jī)程序。主要包含的函數(shù)有:I2C_Delay(),

14、I2C_Init(),I2C_Start(),I2C_Write(),I2C_Read(),I2C_GetAck(),I2C_PutAck(),I2C_Stop(),I2C_Puts(),I2C_Put(),I2C_Gets(),I2C_Get()。各函數(shù)功能如下所示:I2C_Delay():延時,模擬I2C總線專用;I2C_Init():I2C總線初始化,使總線處于空閑狀態(tài);I2C_Start():產(chǎn)生I2C總線的起始狀態(tài);I2C_Write():向I2C總線寫1個字節(jié)的數(shù)據(jù);I2C_Read():從從機(jī)讀取1個字節(jié)的數(shù)據(jù);I2C_GetAck():讀取從機(jī)應(yīng)答位。返回0從機(jī)應(yīng)答,返回1從機(jī)

15、非應(yīng)答;I2C_PutAck():主機(jī)產(chǎn)生應(yīng)答位或非應(yīng)答位;I2C_Stop():產(chǎn)生I2C總線的停止?fàn)顟B(tài);I2C_Puts():主機(jī)通過I2C總線向從機(jī)發(fā)送多個字節(jié)的數(shù)據(jù);I2C_Put():主機(jī)通過I2C總線向從機(jī)發(fā)送1個字節(jié)的數(shù)據(jù);I2C_Gets():主機(jī)通過I2C總線從從機(jī)接收多個字節(jié)的數(shù)據(jù);I2C_Get():主機(jī)通過I2C總線從從機(jī)接收1個字節(jié)的數(shù)據(jù);(6)主函數(shù)模塊該模塊的主要功能是系統(tǒng)初始化,定義按鍵,調(diào)用各模塊完成系統(tǒng)功能等。主要包含的函數(shù)有:KeyScan(),SysInit(),main()。各函數(shù)功能如下所示:KeyScan():鍵盤掃描函數(shù);SysInit():系統(tǒng)

16、初始化函數(shù);main():調(diào)用各模塊完成系統(tǒng)功能。四系統(tǒng)調(diào)試1硬件該系統(tǒng)的調(diào)試采用SmartSOPC 實驗箱和Quick51核心板。SmartSOPC教學(xué)實驗開發(fā)平臺集眾多功能于一體,是SOPC、DSP、EDA、ARM、ARMSOC以與8051教學(xué)實驗、科研開發(fā)的最佳選擇。開發(fā)平臺采用“主板+核心板”的模式,更換不同的核心板即可試驗不同平臺的功能。Quick51正是跟SmartSOPC相配套的8051單片機(jī)核心板。它是一款自由的、開放系統(tǒng)資源的單片機(jī)實驗板。單片機(jī)芯片采用Philip最新推出的擁有64KB Flash的增強(qiáng)型8052核單片機(jī)P89LV51RD2,工作電壓3.3V。Quick51

17、與SmartSOPC配合,可以做各種單片機(jī)教學(xué)實驗,如LED點陣掃描顯示、鍵盤檢測、動態(tài)數(shù)碼管、液晶屏、電機(jī)驅(qū)動、I2C總線、紅外收發(fā)、蜂鳴器、數(shù)字溫度計、電子鐘等等。跳線連接情況如下所示:Quick51板上跳線JP1JP7為默認(rèn)設(shè)置,JP1:VCC與/EA短接,JP2:/PSEN與GND斷開,JP3:RST與RC短接,JP4JP6:A16A18全接GND,JP7:RXD短接、TXD短接;Quick51板J14的PB-LE用杜邦線連接到J9;SmartSOPC實驗箱JP6的KEY1、KEY2、KEY3和KEY8分別用跳線帽短接,JP6其它跳線全部斷開;Quick51板的P1端口用8芯排線連接到

18、 SmartSOPC實驗箱B3區(qū)的COM6;Quick51板的J11(PB端口)用8芯排線連接到 SmartSOPC實驗箱B3區(qū)的COM3;Quick51板J5的INT1用杜邦線連接到SmartSOPC實驗箱C2區(qū)的SCL;Quick51板J5的T0用杜邦線連接到SmartSOPC實驗箱C2區(qū)的SDA; Quick51板J5的T1用杜邦線連接到SmartSOPC實驗箱D4區(qū)的nCS;Quick51板J5的WR用杜邦線連接到SmartSOPC實驗箱D4區(qū)的DAT;Quick51板J5的RD用杜邦線連接到SmartSOPC實驗箱D4區(qū)的CLK。2軟件在參考原有程序的基礎(chǔ)上,對程序按要求進(jìn)行修改,并

19、分模塊保存,程序修改好后進(jìn)行調(diào)試,調(diào)試過程中應(yīng)先分模塊進(jìn)行調(diào)試,首先確保電壓能夠正常顯示,調(diào)試好后再將溫度模塊加入并使得溫度可以正常顯示,最后再添加交替顯示部分,各部分模塊都能正常顯示后,再調(diào)試使二者能夠在適當(dāng)?shù)臅r間進(jìn)行交替,不至于時間過長或過短,這時主要注意程序中延時長度的選擇。同時還要注意在交替顯示時能否進(jìn)行實時采樣,若不能,這時,應(yīng)使在電壓和溫度的顯示過程中,對電壓或溫度進(jìn)行多次采樣。五參考文獻(xiàn)1 譚浩強(qiáng)著 . C程序設(shè)計(第三版).:清華大學(xué),20052 徐惠民,安德寧,丁玉珍著 .單片微型計算機(jī)原理、接口與應(yīng)用(第3版).:郵電大學(xué),20073 電子技術(shù)實驗Quick51實驗例程4L

20、M75A(Philips)數(shù)據(jù)手冊5 TLC549數(shù)據(jù)手冊附錄1.電壓模塊#include <reg51.h>#include "Disp.h"#include "VolTab.h"/定義TLC549操作接口sbit CS = P35;sbit DAT = P36;sbit CLK = P37;/*函數(shù):ReadAdc()功能:讀取A/D轉(zhuǎn)換結(jié)果返回:8位ADC代碼*/unsigned char ReadAdc()unsigned char d;unsigned char n;CS = 0;n = 5;while ( -n != 0 );n

21、= 8;dod <<= 1;if ( DAT ) d+;CLK = 1;CLK = 0;while ( -n != 0 );CS = 1;return d;/*函數(shù):Delay()功能:延時(t*10)ms*/void Delay549(unsigned char t)doTH0 = 0xDC;TL0 = 0x00;TR0 = 1;while ( !TF0 );TR0 = 0;TF0 = 0; while ( -t != 0 );/*函數(shù):DispVol()功能:將ADC值轉(zhuǎn)換成電壓值,并顯示參數(shù):v:8位ADC結(jié)果*/void DispVol(unsigned char v)Di

22、spStr(3,VolTabv);DispDotOn(3);/*函數(shù):AdcInit()功能:初始化ADC接口*/void AdcInit()CS = 1;CLK = 0;DAT = 1;ReadAdc();附錄2.溫度模塊#include <reg51.h>#include "Disp.h"#include "I2C.h"#include <string.h>/*函數(shù):Delay()功能:延時1ms65.536s參數(shù):t>0時,延時(t*0.001)st=0時,延時65.536s*/void Delay75(unsigne

23、d int t)doTH0 = 0xFC;TL0 = 0x66;TR0 = 1;while ( !TF0 );TR0 = 0;TF0 = 0; while ( -t != 0 );/*函數(shù):LM75A_GetTemp功能:讀出LM75A的溫度值返回:LM75A溫度寄存器的數(shù)值(乘以0.125可得到攝氏度值)*/int LM75A_GetTemp()unsigned char buf2;int t;I2C_Gets(0x90,0x00,2,buf);t = buf0;t <<= 8;t += buf1;t >>= 5;/去掉無關(guān)位return t;/*函數(shù):ByteToS

24、tr()功能:字節(jié)型變量c轉(zhuǎn)換為十進(jìn)制字符串*/void ByteToStr(unsigned char idata *s, unsigned char c) unsigned char t;t = c / 10;*s+ = '0' + t;c -= t * 10;*s+ = '0' + c;*s = '0'/*函數(shù):DispTemp()功能:在數(shù)碼管上顯示出溫度值參數(shù):t:補(bǔ)碼,除以8以后才是真正溫度值*/void DispTemp(int t)code unsigned char Tab104 ="0","1&q

25、uot;,"2","3","5","6","7","8", "9"unsigned char buf4;bit s;/符號位unsigned char i;/整數(shù)部分unsigned char d;/小數(shù)部分unsigned char x;/臨時變量/分離出符號s = 0;if ( t < 0 )s = 1;t = -t;/分離出整數(shù)和小數(shù)部分i = t / 8;d = t % 8;/整數(shù)部分轉(zhuǎn)換成字符串ByteToStr(buf,i);x = 4

26、- strlen(buf);/清除所有顯示DispClear();/顯示符號if ( s ) DispChar(x,'-');x+;/顯示整數(shù)部分DispStr(x,buf);/顯示小數(shù)點DispDotOn(4);/顯示小數(shù)部分DispStr(5,Tabd);附錄3.I2C模塊#include "I2C.h"/定義延時變量,用于宏I2C_Delay()unsigned char data I2C_Delay_t;/*宏定義:I2C_Delay()功能:延時,模擬I2C總線專用*/#define I2C_Delay()I2C_Delay_t = (I2C_DE

27、LAY_VALUE);while ( -I2C_Delay_t != 0 );/*函數(shù):I2C_Init()功能:I2C總線初始化,使總線處于空閑狀態(tài)說明:在main()函數(shù)的開始處,通常應(yīng)當(dāng)要執(zhí)行一次本函數(shù)*/void I2C_Init()I2C_SCL = 1;I2C_Delay();I2C_SDA = 1;I2C_Delay();/*函數(shù):I2C_Start()功能:產(chǎn)生I2C總線的起始狀態(tài)說明:SCL處于高電平期間,當(dāng)SDA出現(xiàn)下降沿時啟動I2C總線不論SDA和SCL處于什么電平狀態(tài),本函數(shù)總能正確產(chǎn)生起始狀態(tài)本函數(shù)也可以用來產(chǎn)生重復(fù)起始狀態(tài)本函數(shù)執(zhí)行后,I2C總線處于忙狀態(tài)*/voi

28、d I2C_Start()I2C_SDA = 1;I2C_Delay();I2C_SCL = 1;I2C_Delay();I2C_SDA = 0;I2C_Delay();I2C_SCL = 0;I2C_Delay();/*函數(shù):I2C_Write()功能:向I2C總線寫1個字節(jié)的數(shù)據(jù)參數(shù):dat:要寫到總線上的數(shù)據(jù)*/void I2C_Write(unsigned char dat)unsigned char t = 8;doI2C_SDA = (bit)(dat & 0x80);dat <<= 1;I2C_SCL = 1;I2C_Delay();I2C_SCL = 0;I

29、2C_Delay(); while ( -t != 0 );/*函數(shù):I2C_Read()功能:從從機(jī)讀取1個字節(jié)的數(shù)據(jù)返回:讀取的一個字節(jié)數(shù)據(jù)*/unsigned char I2C_Read()unsigned char dat;unsigned char t = 8;I2C_SDA = 1;/在讀取數(shù)據(jù)之前,要把SDA拉高doI2C_SCL = 1;I2C_Delay();dat <<= 1;if ( I2C_SDA ) dat |= 0x01;I2C_SCL = 0;I2C_Delay(); while ( -t != 0 );return dat;/*函數(shù):I2C_GetA

30、ck()功能:讀取從機(jī)應(yīng)答位返回:0:從機(jī)應(yīng)答1:從機(jī)非應(yīng)答說明:從機(jī)在收到每個字節(jié)的數(shù)據(jù)后,要產(chǎn)生應(yīng)答位從機(jī)在收到最后1個字節(jié)的數(shù)據(jù)后,一般要產(chǎn)生非應(yīng)答位*/bit I2C_GetAck()bit ack;I2C_SDA = 1;I2C_Delay();I2C_SCL = 1;I2C_Delay();ack = I2C_SDA;I2C_SCL = 0;I2C_Delay();return ack;/*函數(shù):I2C_PutAck()功能:主機(jī)產(chǎn)生應(yīng)答位或非應(yīng)答位參數(shù):ack=0:主機(jī)產(chǎn)生應(yīng)答位ack=1:主機(jī)產(chǎn)生非應(yīng)答位說明:主機(jī)在接收完每一個字節(jié)的數(shù)據(jù)后,都應(yīng)當(dāng)產(chǎn)生應(yīng)答位主機(jī)在接收完最后一個

31、字節(jié)的數(shù)據(jù)后,應(yīng)當(dāng)產(chǎn)生非應(yīng)答位*/void I2C_PutAck(bit ack)I2C_SDA = ack;I2C_Delay();I2C_SCL = 1;I2C_Delay();I2C_SCL = 0;I2C_Delay();/*函數(shù):I2C_Stop()功能:產(chǎn)生I2C總線的停止?fàn)顟B(tài)說明:SCL處于高電平期間,當(dāng)SDA出現(xiàn)上升沿時停止I2C總線不論SDA和SCL處于什么電平狀態(tài),本函數(shù)總能正確產(chǎn)生停止?fàn)顟B(tài)本函數(shù)執(zhí)行后,I2C總線處于空閑狀態(tài)*/void I2C_Stop()unsigned int t = I2C_STOP_WAIT_VALUE;I2C_SDA = 0;I2C_Delay

32、();I2C_SCL = 1;I2C_Delay();I2C_SDA = 1;I2C_Delay();while ( -t != 0 );/在下一次產(chǎn)生Start之前,要加一定的延時/*函數(shù):I2C_Puts()功能:主機(jī)通過I2C總線向從機(jī)發(fā)送多個字節(jié)的數(shù)據(jù)參數(shù):SlaveAddr:從機(jī)地址(高7位是從機(jī)地址,最低位是寫標(biāo)志0)SubAddr:從機(jī)的子地址Size:數(shù)據(jù)的字節(jié)數(shù)*dat:要發(fā)送的數(shù)據(jù)返回:0:發(fā)送成功1:在發(fā)送過程中出現(xiàn)異常*/bit I2C_Puts(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char

33、Size, char *dat)/檢查長度if ( Size = 0 ) return 0;/確保從機(jī)地址最低位是0SlaveAddr &= 0xFE;/啟動I2C總線I2C_Start();/發(fā)送從機(jī)地址I2C_Write(SlaveAddr);if ( I2C_GetAck() )I2C_Stop();return 1;/發(fā)送子地址I2C_Write(SubAddr);if ( I2C_GetAck() )I2C_Stop();return 1;/發(fā)送數(shù)據(jù)doI2C_Write(*dat+);if ( I2C_GetAck() )I2C_Stop();return 1; while

34、 ( -Size != 0 );/發(fā)送完畢,停止I2C總線,并返回結(jié)果I2C_Stop();return 0;/*函數(shù):I2C_Put()功能:主機(jī)通過I2C總線向從機(jī)發(fā)送1個字節(jié)的數(shù)據(jù)參數(shù):SlaveAddr:從機(jī)地址(高7位是從機(jī)地址,最低位是寫標(biāo)志0)SubAddr:從機(jī)的子地址dat:要發(fā)送的數(shù)據(jù)返回:0:發(fā)送成功1:在發(fā)送過程中出現(xiàn)異常*/bit I2C_Put(unsigned char SlaveAddr, unsigned char SubAddr, char dat)return I2C_Puts(SlaveAddr,SubAddr,1,&dat);/*函數(shù):I2C_

35、Gets()功能:主機(jī)通過I2C總線從從機(jī)接收多個字節(jié)的數(shù)據(jù)參數(shù):SlaveAddr:從機(jī)地址(高7位是從機(jī)地址,最低位是讀標(biāo)志1)SubAddr:從機(jī)的子地址Size:數(shù)據(jù)的字節(jié)數(shù)*dat:保存接收到的數(shù)據(jù)返回:0:接收成功1:在接收過程中出現(xiàn)異常*/bit I2C_Gets(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)/檢查長度if ( Size = 0 ) return 0;/確保從機(jī)地址最低位是0SlaveAddr &= 0xFE;/確保最低位是0/啟動I2C總線I2

36、C_Start();/發(fā)送從機(jī)地址I2C_Write(SlaveAddr);if ( I2C_GetAck() )I2C_Stop();return 1;/發(fā)送子地址I2C_Write(SubAddr);if ( I2C_GetAck() )I2C_Stop();return 1;/發(fā)送重復(fù)起始條件I2C_Start();/發(fā)送從機(jī)地址SlaveAddr |= 0x01;I2C_Write(SlaveAddr);if ( I2C_GetAck() )I2C_Stop();return 1;/接收數(shù)據(jù)for (;)*dat+ = I2C_Read();if ( -Size = 0 )I2C_Pu

37、tAck(1);break;I2C_PutAck(0);/接收完畢,停止I2C總線,并返回結(jié)果I2C_Stop();return 0;/*函數(shù):I2C_Get()功能:主機(jī)通過I2C總線從從機(jī)接收1個字節(jié)的數(shù)據(jù)參數(shù):SlaveAddr:從機(jī)地址(高7位是從機(jī)地址,最低位是讀標(biāo)志1)SubAddr:從機(jī)的子地址*dat:保存接收到的數(shù)據(jù)返回:0:接收成功1:在接收過程中出現(xiàn)異常*/bit I2C_Get(unsigned char SlaveAddr, unsigned char SubAddr, char *dat)return I2C_Gets(SlaveAddr,SubAddr,1,dat

38、);附錄4.顯示模塊/*Disp.c數(shù)碼管掃描顯示驅(qū)動程序*/#include <reg51.h>#include <absacc.h>/定義顯示緩沖區(qū)(由定時中斷程序自動掃描)unsigned char DispBuf8;/*函數(shù):T1INTSVC()功能:定時器T1的中斷服務(wù)函數(shù)*/void T1INTSVC() interrupt 3code unsigned char = 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;static unsigned char n = 0;TR1 = 0;TH1 = 0xFC;TL1 = 0x66

39、;TR1 = 1;P1 = 0xFF;/暫停顯示XBYTE0xE800 = DispBufn;/更新掃描數(shù)據(jù)P1 = n;/重新顯示n+;n &= 0x07;/*函數(shù):DispClear()功能:清除數(shù)碼管的所有顯示*/void DispClear()unsigned char i;for ( i=0; i<8; i+ )DispBufi = 0x00;/*函數(shù):DispChar()功能:在數(shù)碼管上顯示字符參數(shù):x:數(shù)碼管的坐標(biāo)位置(07)c:要顯示的字符(僅限十進(jìn)制數(shù)字和減號)*/void DispChar(unsigned char x, unsigned char c)/0

40、123456789P的數(shù)碼管字型數(shù)據(jù)code unsigned char Tab = 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;x &= 0x07;x = 7 - x;if ( c = '-' )DispBufx = 0x40;else if ( ( c >= '0' ) && ( c <= '9' ) )DispBufx = Tabc-'0'else if ( c = 'P' ) DispBufx = 0x73; /*函

41、數(shù):DispStr()功能:在數(shù)碼管上顯示字符串參數(shù):x:數(shù)碼管的坐標(biāo)位置(07)*s:要顯示的字符串(字符僅限十進(jìn)制數(shù)字和減號)*/void DispStr(unsigned char x, unsigned char *s)unsigned char c;for (;)c = *s;if ( c = '0' ) break;s+;DispChar(x,c);x+;/*函數(shù):DispDotOn()功能:顯示指定位的小數(shù)點參數(shù):x為數(shù)碼管坐標(biāo)*/void DispDotOn(unsigned char x)DispBuf7-x |= 0x80;/*函數(shù):DispInit()功能:數(shù)碼管掃描顯示初始化*/void DispInit()DispClear();EA = 0;TMOD &= 0x0F;TMOD |= 0x10;TH1 = 0xFC;TL1

溫馨提示

  • 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

提交評論