單片機(jī)技術(shù)及應(yīng)用項(xiàng)目教程 課件 欒秋平 項(xiàng)目5-8 獨(dú)立式按鍵-多功能秒表的設(shè)計(jì)與制作- 單總線-溫度測量報警系統(tǒng)_第1頁
單片機(jī)技術(shù)及應(yīng)用項(xiàng)目教程 課件 欒秋平 項(xiàng)目5-8 獨(dú)立式按鍵-多功能秒表的設(shè)計(jì)與制作- 單總線-溫度測量報警系統(tǒng)_第2頁
單片機(jī)技術(shù)及應(yīng)用項(xiàng)目教程 課件 欒秋平 項(xiàng)目5-8 獨(dú)立式按鍵-多功能秒表的設(shè)計(jì)與制作- 單總線-溫度測量報警系統(tǒng)_第3頁
單片機(jī)技術(shù)及應(yīng)用項(xiàng)目教程 課件 欒秋平 項(xiàng)目5-8 獨(dú)立式按鍵-多功能秒表的設(shè)計(jì)與制作- 單總線-溫度測量報警系統(tǒng)_第4頁
單片機(jī)技術(shù)及應(yīng)用項(xiàng)目教程 課件 欒秋平 項(xiàng)目5-8 獨(dú)立式按鍵-多功能秒表的設(shè)計(jì)與制作- 單總線-溫度測量報警系統(tǒng)_第5頁
已閱讀5頁,還剩215頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

山東電子職業(yè)技術(shù)學(xué)院電子與通信工程系單片機(jī)程序設(shè)計(jì)與應(yīng)用課程組項(xiàng)目5:獨(dú)立式按鍵——多功能秒表的設(shè)計(jì)與制作1認(rèn)知輕觸機(jī)械式觸點(diǎn)開關(guān)目錄2獨(dú)立式按鍵設(shè)計(jì)3設(shè)計(jì)具有倒計(jì)時功能的多功能秒表器1認(rèn)知輕觸機(jī)械式觸點(diǎn)開關(guān)圖5-6輕觸機(jī)械式觸點(diǎn)開關(guān)按鍵一輕觸機(jī)械式觸點(diǎn)開關(guān)按鍵圖5-7輕觸按鍵的內(nèi)部結(jié)構(gòu)內(nèi)部的結(jié)構(gòu),主要由開關(guān)蓋、柱塞、反作用彈簧、底座、接點(diǎn)和端子組成。圖5-8輕觸按鍵動作時的時序分析圖二輕觸按鍵動作的時序分析按鍵從斷開狀態(tài)到閉合狀態(tài),從閉合狀態(tài)到斷開狀態(tài),均有一個抖動過程,分別稱為前沿抖動和后沿抖動,這個抖動過程的時間一般為5-20ms三抖動的時間是短還是長

圖5-9由RS觸發(fā)器組成的按鍵硬件消抖電路四按鍵的硬件消都抖當(dāng)按鍵由3腳轉(zhuǎn)向1腳,我們可以將其從時間上分為3個階段:離開3腳未與1腳接觸,與1腳接觸但處于機(jī)械抖動,抖動結(jié)束與1腳可靠連接。先看“離開3腳未與1腳接觸”狀態(tài),此時按鍵處于懸空狀態(tài),將維持上一次的狀態(tài),即74LS00與單片機(jī)相連的引腳3輸出低電平;對于“與1腳接觸但處于機(jī)械抖動”狀態(tài),由于已經(jīng)與按鍵的引腳1接觸,74LS00的輸出電平反轉(zhuǎn),無論按鍵怎么抖動,只要不與按鍵的引腳3接觸,74LS00與單片機(jī)相連的引腳3都輸出高電平;最后一種狀態(tài),就比較好理解了,74LS00將輸出高電平。圖5-10RC濾波硬件消抖電路圖中當(dāng)按鍵S1沒有閉合時,電阻R1和電阻R2給電容C1放電,74LS00的引腳1和2為低電平,引腳3輸出高電平。當(dāng)按鍵S1閉合時,VCC通過電阻R1給電容C1充電,由于電容充滿需要一定的時間,所以74LS00的引腳1和2不會立刻達(dá)到高電平電壓的閾值,此時按鍵的抖動就是,對電容C1的斷續(xù)充電過程,當(dāng)電容C1的電壓達(dá)到74LS00高電平電壓的閾值時,正好越過了電容的抖動時間,此時74LS00的引腳3輸出低電平,達(dá)到了應(yīng)交消抖的目的。2獨(dú)立式按鍵設(shè)計(jì)圖5-12獨(dú)立式按鍵一、認(rèn)知獨(dú)立式按鍵圖5-13教學(xué)開發(fā)板上使用的獨(dú)立式按鍵每個按鍵的電路都是獨(dú)立的,當(dāng)其中任意一個按鍵被按下時,它所對應(yīng)的數(shù)據(jù)線的電平就變成低電平,此時單片機(jī)通過I/O端口讀入的這條數(shù)據(jù)線上的數(shù)據(jù)就是邏輯0,表示有按鍵按下。若無按鍵按下,則單片機(jī)通過I/O端口讀入的所有數(shù)據(jù)線上的電平都為高電平(這是由于每個I/O端口都連接了上拉電阻),即邏輯1。二、按鍵的軟件消抖圖5-14按鍵軟件消抖處理流程圖三設(shè)計(jì)具有“啟動/繼續(xù)”、“暫停”與“復(fù)位”的秒表第0位第1位第2位第3位第4位第5位第6位第7位空空顯示分的十位顯示分的個位顯示秒的十位顯示秒的個位顯示0.1秒顯示0.01秒表5-2數(shù)碼管的位與計(jì)時的對應(yīng)關(guān)系步驟如下:(1)打開邏輯層的config.h文件,使能定時器1,并將定時時間設(shè)置為10ms,如程序5-3所示。【程序5-3】#defineINTERNAL_PERIPHERAL_TIMER1_MODE 1 //0: 不初始化TIMER0 //1: 定時10ms //2: 定時1ms(2)打開邏輯層的main.c函數(shù),先準(zhǔn)備記錄分、秒和毫秒的全局變量,如程序5-4所示,在定義變量的時候,我們要依據(jù)變量的取值范圍,考慮變量的數(shù)據(jù)類型。通過項(xiàng)目分析,我們可以得出u8g_Minute的取值范圍為0-60,u8g_Second的取值范圍為0-60,u8g_milliSecond的取值范圍為0-100,所以將這3個全局變量定義為uint8是合適的,因?yàn)閡int8的取值范圍為0-255。有了全局變量后,我們就可以在main函數(shù)和定時器1的中斷服務(wù)處理函數(shù)中傳遞數(shù)據(jù)了。【程序5-4】//定義全局變量uint8u8g_DisplayString[8];uint8u8g_DisplayPoint[8];uint8u8g_Minute,u8g_Second,u8g_milliSecond;(3)在main.c文件中,找到定時器1中斷服務(wù)處理函數(shù),寫入如程序5-5所示的程序。對于這段程序的理解,我們可以參看如圖5-15所示的流程圖,在這里只需要注意的是該程序每10ms調(diào)用1次。【程序5-5】//定時器1溢出中斷服務(wù)處理函數(shù)#ifINTERNAL_PERIPHERAL_TIMER1_MODE!=0ISR(TIMER1_OVF_vect){ //在此完成邏輯內(nèi)容

u8g_milliSecond++; if(u8g_milliSecond>=100) { u8g_milliSecond=0; u8g_Second++; }

if(u8g_Second>=60) { u8g_Second=0; u8g_Minute++; } if(u8g_Minute>=60) { u8g_Minute=60; } //為了提高運(yùn)行速度,將此語句寫在中斷服務(wù)處理函數(shù)里 TCNT1H=TIMER1_TCNT1H; TCNT1L=TIMER1_TCNT1L;}#endif圖5-15定時器1中斷服務(wù)處理函數(shù)流程圖(4)接下來的工作就是要對變量u8g_Minute、u8g_Second和u8g_milliSecond進(jìn)行解析,提取十位和個位,送數(shù)碼管顯示,在上一個項(xiàng)目中,我們已經(jīng)知道只需將欲顯示的數(shù)字傳遞給數(shù)組u8g_DisplayString,u8g_DisplayPoint即可,在使用數(shù)組u8g_DisplayString,u8g_DisplayPoint之前,需要對其進(jìn)行初始化,如程序5-6所示。程序開始時,將數(shù)組u8g_DisplayString和u8g_DisplayPoint中的所有元素都賦值為初始值0x00,然后將u8g_DisplayString[0]和u8g_DisplayString[1]賦值為0xff,表示數(shù)碼管0位和1位不顯示數(shù)字,然后將u8g_DisplayPoint[3]和u8g_DisplayPoint[5]設(shè)置為0x01,表示數(shù)碼管的3位和5位顯示小數(shù)點(diǎn)。【程序5-6】//初始化全局變量

for(i=0;i<8;i++){ u8g_DisplayString[i]=0x00; u8g_DisplayPoint[i]=0x00; }u8g_DisplayString[0]=0xff;u8g_DisplayString[1]=0xff; u8g_DisplayPoint[3]=0x01;u8g_DisplayPoint[5]=0x01;u8g_milliSecond=0;u8g_Second=0;u8g_Minute=0;(5)程序5-7示出了,提取變量u8g_Minute、u8g_Second和u8g_milliSecond十位和個位的方法。因?yàn)楸容^簡單,讀者自行研究一下,在這里就不再贅述了。【程序5-7】while(1){ **********************************

在這里完成自己的項(xiàng)目邏輯 ********************************** */ u8g_DisplayString[2]=u8g_Minute/10; u8g_DisplayString[3]=u8g_Minute%10; u8g_DisplayString[4]=u8g_Second/10; u8g_DisplayString[5]=u8g_Second%10; u8g_DisplayString[6]=u8g_milliSecond/10; u8g_DisplayString[7]=u8g_milliSecond%10; /*

**********************************

喂狗語句,大部分工程項(xiàng)目都不應(yīng)去除 ********************************** */ #ifINTERNAL_PERIPHERAL_WDT_MODE!=0

TARGET_WatchDogReset(); #endif}(6)現(xiàn)在我們就可以對程序進(jìn)行編譯,然后下載到教學(xué)開發(fā)板中,給程序上電,我們可以看到數(shù)碼管從00:00:00開始計(jì)時,如果不掉電的話,可以一致計(jì)時到60:00:00。(7)現(xiàn)在的程序已經(jīng)可以計(jì)時了,但是還不能進(jìn)行控制,下面的程序?qū)⒓尤?個按鍵,用于計(jì)時控制,這三個按鍵的功能,我們這樣定義:S0用于計(jì)時的啟動/繼續(xù),S1用于計(jì)時的暫停,S2用于時間的復(fù)位(當(dāng)點(diǎn)按S2鍵后,時間歸0并暫停計(jì)時)。(8)為了實(shí)現(xiàn)上述功能,我們還需再加入一個用于控制計(jì)時的變量u8g_ControlCount,并在main函數(shù)中對其賦初值。(9)接下來,我們在定時器1中斷服務(wù)處理函數(shù)中,加入控制變量u8g_ControlCount,如程序5-10所示。這段程序代碼,應(yīng)該不難理解,其功能是只有當(dāng)u8g_ControlCount為1時,才進(jìn)行計(jì)時,否則就停止計(jì)時。(10)下面再加入使用按鍵對計(jì)時進(jìn)行控制的程序,如程序5-11所示(略)。(11)現(xiàn)在我們可以對程序進(jìn)行編譯,并下載到教學(xué)開發(fā)板中,如果一切順利的話,我們就可以用按鍵來控制秒表的計(jì)時了。教學(xué)開發(fā)板上電時,數(shù)碼管顯示00:00:00,我們點(diǎn)按S0鍵,可以觀察到計(jì)時開始,點(diǎn)按S1鍵可以觀察到計(jì)時暫停,點(diǎn)按S2鍵可以觀察到計(jì)時復(fù)位并暫停。圖5-16控制定時器啟動/繼續(xù)、暫停和復(fù)位的程序流程圖3設(shè)計(jì)具有倒計(jì)時功能的多功能秒表器一、認(rèn)知蜂鳴器圖5-18蜂鳴器電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號電流通過電磁線圈,使電磁線圈產(chǎn)生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性的振動發(fā)聲。二、倒計(jì)時時間的調(diào)整程序的總體設(shè)計(jì)思路為:我們將程序分為兩種工作模式:正計(jì)時模式和倒計(jì)時模式,點(diǎn)擊按鍵S2進(jìn)入正計(jì)時模式并將時間置為00:00:00,此時點(diǎn)擊按鍵S0開始正計(jì)時,點(diǎn)擊按鍵S1暫停計(jì)時;點(diǎn)擊按鍵S3進(jìn)入倒計(jì)時模式,此時數(shù)碼管上顯示00:00:00,我們可以通過左調(diào)S4鍵、右調(diào)S5鍵、上調(diào)S6鍵和下調(diào)S7鍵,進(jìn)行時間調(diào)整,時間調(diào)整完畢后,點(diǎn)擊按鍵S0開始倒計(jì)時,點(diǎn)擊S1暫停倒計(jì)時。當(dāng)?shù)褂?jì)時的時間變?yōu)?0:00:00后,蜂鳴器鳴叫,直到點(diǎn)擊S1按鍵停止鳴叫,將工作模式轉(zhuǎn)為正計(jì)時。步驟如下:(1)復(fù)制程序“例5.12”,雙擊文件夾中的Program.atsln打開工程。(2)打開main.c文件,先加入一些全局變量,(3)處理定時器1中斷服務(wù)處理函數(shù)(4)對啟動/繼續(xù)鍵處理程序進(jìn)行調(diào)整(5)對暫停鍵處理程序進(jìn)行調(diào)整(6)對正計(jì)時模式復(fù)位鍵處理程序進(jìn)行調(diào)整

(7)在程序中加入“倒計(jì)時功能”按鍵程序(8)在程序中加入左調(diào)按鍵程序(9)在程序中加入右調(diào)按鍵程序(10)在程序中加入上調(diào)按鍵程序(11)在程序中加入下調(diào)按鍵程序(12)在程序中加入閃爍實(shí)現(xiàn)程序圖5-20數(shù)碼管閃爍邏輯流程圖山東電子職業(yè)技術(shù)學(xué)院電子與通信工程系單片機(jī)程序設(shè)計(jì)與應(yīng)用課程組項(xiàng)目6:IIC總線——萬年歷的設(shè)計(jì)與制作1認(rèn)知智能設(shè)備中的實(shí)時時鐘目錄2認(rèn)知IIC總線3使用C語言模擬IIC總線4設(shè)計(jì)顯示當(dāng)前時間的萬年歷1認(rèn)知智能設(shè)備中的實(shí)時時鐘一認(rèn)知實(shí)時時鐘實(shí)時時鐘英文的全稱為RealTimeClock,縮寫為RTC。通過對其字面意思的理解,我們很容易的知道實(shí)時時鐘是用來提供當(dāng)前準(zhǔn)確時間的一種模塊或芯片。早在上個世紀(jì)40年代,人們已經(jīng)認(rèn)知到了實(shí)時時鐘的重要性,例如航空、航海、電子通信或者戰(zhàn)爭指揮等,人們都需要一種標(biāo)準(zhǔn)而且準(zhǔn)確的時間。但限于當(dāng)時電子技術(shù)的發(fā)展水平,那時記錄時間的方法一般以機(jī)械式鐘表為主。1、早期的RTC

早期RTC產(chǎn)品實(shí)質(zhì)是一個帶有計(jì)算機(jī)(單片機(jī))通訊口的分頻器。它通過對晶振所產(chǎn)生的振蕩頻率分頻和累加,得到年、月、日、時、分、秒等時間信息并通過計(jì)算機(jī)通訊口送入處理器處理。這一時期RTC的特征如下:在控制口線上為并行口;功耗較大;采用普通CMOS工藝;封裝為雙列直插式;芯片普遍沒有現(xiàn)代RTC所具有的萬年歷及閏年月自動切換功能,也無法處理2000年問題。現(xiàn)在已經(jīng)被淘汰。2、中期的RTC在20世紀(jì)90年代中期出現(xiàn)了新一代RTC,它采用特殊CMOS工藝;功耗大為降低,典型值約0.5μA以下;供電電壓僅為1.4V以下;和計(jì)算機(jī)(單片機(jī))通訊口也變?yōu)榇蟹绞剑霈F(xiàn)了諸如三線SIO和四線SPI,以及部分產(chǎn)品采用的2線IIC總線;包封上采用SOP/SSOP封裝,體積大為縮小;從功能上來說,片內(nèi)智能化程度大幅提高、具有萬年歷功能,輸出控制也變得靈活多樣。其中美國DALLS公司推出的RTC甚至已經(jīng)出現(xiàn)時基軟件調(diào)校功能及振蕩器停振自動檢測功能而且芯片的價格極為低廉。目前,這些芯片已被客戶大量使用中。3、現(xiàn)代的RTC最新一代RTC產(chǎn)品中,除了包含第二代產(chǎn)品所具有的全部功能,更加入了復(fù)合功能,如低電壓檢測,主備用電池切換功能,EEPROM、看門狗和抗印制板漏電功能等。二實(shí)時時鐘模塊的內(nèi)部組成圖6-7SD2405ALPI模塊內(nèi)部原理框圖三認(rèn)知SD2405實(shí)時時鐘模塊(1)低功耗:1.0μA典型值(內(nèi)部電池供電,Ta=25℃)。(2)工作電壓:3.3V~5.5V,工作溫度:-30℃~+80℃。(3)標(biāo)準(zhǔn)IIC總線接口方式,最高速度400KHZ(4.5V~5.5V)。(4)年、月、日、星期、時、分、秒的BCD碼輸入/輸出,并可通過獨(dú)立的地址訪問各時間寄存器。(5)閏年自動調(diào)整功能(從2000年~2099年)。(6)可選擇12/24小時制式,內(nèi)置年、月、日、星期、時、分、秒共7字節(jié)的報警數(shù)據(jù)寄存器及1字節(jié)的報警允許寄存器。(7)內(nèi)置12字節(jié)通用SRAM寄存器可用于存儲用戶的一般數(shù)據(jù)。(8)三種中斷均可選擇從INT腳輸出,并具有兩個中斷標(biāo)志位.(9)可設(shè)定并自動重置的單路報警中斷功能(時間范圍最長設(shè)至100年),年、月、日、星期、時、分、秒報警,共有96種組合方式,并有單事件報警和周期性報警兩種中斷輸出模式.(10)周期性頻率中斷輸出:從32768Hz~1/16Hz……1秒共十五種方波脈沖。

三認(rèn)知SD2405實(shí)時時鐘模塊(11)自動重置的8位倒計(jì)時定時器,可選的4種時鐘源(4096HZ、64HZ、1HZ、1/60HZ)。(12)內(nèi)置時鐘精度數(shù)字調(diào)整功能,可通過程序來調(diào)整走時的快慢。用戶采用外置的溫度傳感器,設(shè)定適應(yīng)溫度。(13)變化的調(diào)整值,可實(shí)現(xiàn)在寬溫范圍內(nèi)高精度的計(jì)時功能。(14)具備內(nèi)部電源自動切換功能:芯片依據(jù)不同的電壓自動從VDD切換到VBAT或從VBAT切換到VDD。(15)在VBAT模式下,芯片具有中斷輸出允許或禁止的功能,可滿足在備用電池供電時輸出中斷的需要。(16)內(nèi)置IIC總線0.5秒自動復(fù)位功能(從Start命令開始計(jì)時),保證時鐘數(shù)據(jù)的有效性及可靠性,避免IIC總線掛死問題。(17)內(nèi)置三個時鐘數(shù)據(jù)寫保護(hù)位,避免對數(shù)據(jù)的誤寫操作,可更好地保護(hù)時鐘數(shù)據(jù)。(18)內(nèi)置VBAT模式IIC總線通信禁止功能,從而避免在電池供電時CPU對時鐘操作所消耗的電池電量,也可避免在主電源上、下電的過程中因CPU的I/O端口所輸出的不受控的雜波信號對時鐘芯片的誤寫操作,進(jìn)一步提高時鐘芯片的可靠性。(19)內(nèi)置上電復(fù)位電路及指示位。三認(rèn)知SD2405實(shí)時時鐘模塊(20)內(nèi)置電源穩(wěn)壓,內(nèi)部計(jì)時電壓可低至1.5V。(21)芯片管腳抗靜電(ESD)>4KV。(22)內(nèi)置晶振,出廠前已對時鐘進(jìn)行校準(zhǔn),時鐘精度為±5ppm(在25℃±1℃下),即年誤差小于2.6分鐘。(23)內(nèi)置充電電池及充電電路,常溫下累計(jì)電池電量近550mAh、電池使用壽命為5~8年時間。(24)封裝形式:16腳的DIP封裝,SD2405ALPI為工業(yè)級型號。四SD2405實(shí)時時鐘模塊的硬件電路設(shè)計(jì)圖6-9SD2405ALPI硬件設(shè)計(jì)原理圖2認(rèn)知IIC總線二總線分類(1)按照系統(tǒng)類型進(jìn)行分類(2)按數(shù)據(jù)線的寬度進(jìn)行分類

這個比較好理解,就是總線單位時間傳遞數(shù)據(jù)量(位)的個數(shù),可以分為8位、16位、32位、64位和128位。(3)按傳輸方式進(jìn)行分類

按照這種分類可以把總線分為并行總線和串行總線。(4)按傳輸控制方式進(jìn)行分類三IIC總線IIC總線的英文全稱是InterIntegratedCircuit(內(nèi)部集成電路),是上世紀(jì)80年代Philips公司研發(fā)的一款同步串行總線。三IIC總線特點(diǎn)(1)IIC總線由2條物理線組成,這樣的設(shè)計(jì)即節(jié)省了芯片的I/O引腳,又節(jié)省了PCB的面積及線材成本。(2)IIC總線協(xié)議規(guī)范比較簡單,各部件的邏輯很容易在芯片內(nèi)部以硬件的方式予以實(shí)現(xiàn)。對于具有一定設(shè)計(jì)經(jīng)驗(yàn)的工程師而言,即使內(nèi)部沒有硬件IIC總線幾口,通過軟件模擬的方式實(shí)現(xiàn)IIC總線也是比較簡單的。(3)IIC總線支持種類繁多的器件,極大程度的方便了工程師在設(shè)計(jì)產(chǎn)品時的芯片選型。(4)應(yīng)用IIC總線,多數(shù)器件可以同時直接掛在總線上,不需附加額外的I/O線或者地址譯碼線。三IIC總線特點(diǎn)(5)IIC總線擁有良好的伸縮性,可以在原始總線的基礎(chǔ)上隨時刪除或新增各種器件。工程師可以使用程序設(shè)計(jì)的方法實(shí)現(xiàn)IIC總線的自檢,用以發(fā)現(xiàn)總線上器件的變化。(6)IIC總線擁有良好的電器兼容性,由于其采用開漏的I/O相互連接,這樣在不需額外轉(zhuǎn)換的情況下,兼容3V/5V的邏輯電平。在具體應(yīng)用時,只需選擇適當(dāng)?shù)纳侠娮杓纯伞#?)IIC總線支持多種通信方式,除了一主多從這種常見的通信方式外,還支持多主機(jī)通信、雙主機(jī)通信,以及廣播方式等。(8)IIC總線同時兼顧低速通信和高速通信,即可以使用低于10kb/s的速率與低速器件進(jìn)行傳輸,也可以使用400kb/s的速率與高速器件進(jìn)行通信。3使用C語言模擬IIC總線一IIC總線的結(jié)構(gòu)及工作原理圖6-15IIC總線結(jié)構(gòu)二IIC總線典型信號的C語言實(shí)現(xiàn)圖6-15IIC總線的典型信號

起始信號(START):當(dāng)SCL為高電平時,SDA由高電平向低電平跳變,產(chǎn)生開始信號。當(dāng)總線空閑的時候,例如,沒有主動設(shè)備在使用總線(SDA和SCL都處于高電平),主機(jī)通過發(fā)送起始信號建立通信。

終止信號(STOP):當(dāng)SCL為高電平時,SDA由低電平向高電平跳變,產(chǎn)生終止信號。主機(jī)通過發(fā)送終止信號,結(jié)束數(shù)據(jù)通信。

三單字節(jié)數(shù)據(jù)的發(fā)送與接收圖6-18IIC總線數(shù)據(jù)傳輸格式四實(shí)際器件的讀寫操作圖6-19IIC總線寫從機(jī)數(shù)據(jù)圖6-20IIC總線讀從機(jī)數(shù)據(jù)五理解完整的IIC驅(qū)動程序IIC驅(qū)動程序由3個文件組成:IIC.c、IIC.h、IIC_config.h,其中驅(qū)動程序代碼存于IIC.c中,IIC.h是驅(qū)動程序的頭文件圖6-21IIC總線驅(qū)動程序在層次化體系結(jié)構(gòu)中的位置4設(shè)計(jì)顯示當(dāng)前時間的萬年歷圖6-22電子萬年歷一認(rèn)知SD2405的寄存器寄存器——實(shí)時時鐘數(shù)據(jù)寄存器二認(rèn)知BCD碼BCD碼(BinaryCodedDecimal)亦稱二-十進(jìn)制碼,用4位二進(jìn)制數(shù)來表示1位十進(jìn)制數(shù)中的0-9,是一種二進(jìn)制的數(shù)字編碼形式。BCD碼這種編碼方法利用4個位存儲1個十進(jìn)制的數(shù),使二進(jìn)制和十進(jìn)制之間的轉(zhuǎn)換得以快捷的進(jìn)行。BCD碼又可以分為8421碼、5421碼、2421碼、余3碼和Gray碼。其中最為常用的就是8421碼,它和4位自然二進(jìn)制碼相似,各位的權(quán)值位8、4、2、1,它只選用了4位二進(jìn)制碼中的前10組0000-1001表示對應(yīng)的十進(jìn)制數(shù)0-9,余下的6組棄之不用。SD2405采用的就是BCD碼中的8421碼編碼方法,我們可以很簡單的理解這些內(nèi)容,就是SD2405種從寄存器中讀出的數(shù)據(jù)高4位表示10進(jìn)制的十位,低4位表示10進(jìn)制的各位。例如,我們讀出的數(shù)據(jù)是23H,實(shí)際上就是十進(jìn)制的23。當(dāng)然,如果使用C語言進(jìn)行處理,直接從IIC總線上返回的數(shù)據(jù)是16進(jìn)制的23H,我們還需通過程序設(shè)計(jì)轉(zhuǎn)換為十進(jìn)制的23,才好正確的顯示和進(jìn)行數(shù)學(xué)處理。三使用結(jié)構(gòu)體標(biāo)識當(dāng)前時間在C語言中,可以使用結(jié)構(gòu)體(struct)來存放一組不同類型的數(shù)據(jù),其定義形式如下:struct

結(jié)構(gòu)體名{

結(jié)構(gòu)體所包含的變量和數(shù)組}

結(jié)構(gòu)體是一種集合,它里面包含了多個變量和數(shù)組,她們的類型可以相同,也可以不同,每個這樣的變量或數(shù)組都稱為結(jié)構(gòu)體的成員變量(member)。例如,在本項(xiàng)目中,為了增強(qiáng)程序的可讀性,我們就可以定義Time結(jié)構(gòu)體,并使用year、month、day、hour、minute、second、week作為其成員變量,如程序6-11所示。【程序6-11】structTime { uint8year; uint8month; uint8day; uint8hour; uint8minute; uint8second; uint8week;};Time為結(jié)構(gòu)體名,它包含了5個成員變量,分別是year(年)、month(月)、day(日)、hour(小時)、minute(分鐘)、second(秒)、week(星期)。結(jié)構(gòu)體成員變量的定義方式與變量和數(shù)組的定義方式是相同的,只是不能初始化。注意在大括號后面的分號“;”是不能缺少的,它是結(jié)構(gòu)體定義語句的一部分。四解讀SD2405驅(qū)動程序SD2405驅(qū)動程序的頭文件,程序中首先定義了SD2405的從地址宏0x64,該地址可以從SD2405的數(shù)據(jù)手冊中查到;接下來定義結(jié)構(gòu)體變量SD2405Time,用來表示當(dāng)前時間;最后定義了2個函數(shù)SD2405_ReadTime和SD2405_SetTime,用來從SD2405讀取時間和修改SD2405的時間。【程序6-13】#ifndefSD2405_H_#defineSD2405_H_

#defineSD24050x64 //SD2405時鐘芯片地址structTimeSD2405Time;voidSD2405_ReadTime(void);voidSD2405_SetTime(void);

#endif/*SD2405_H_*/SD2405_SetTime函數(shù),如程序6-15所示,程序調(diào)用IIC_WriteOneByteAddressDevice向SD2405寫入數(shù)據(jù),寫入數(shù)據(jù)的順序和讀出數(shù)據(jù)的順序相同。程序中設(shè)置小時的語句,將hour與0x80進(jìn)行或運(yùn)算,是為了將hour的最高為設(shè)置為1,表示24小時制。【程序6-15】voidSD2405_SetTime(void){

IIC_WriteOneByteAddressDevice(SD2405,0x10,0x80);

IIC_WriteOneByteAddressDevice(SD2405,0x0F,0x84);

IIC_WriteOneByteAddressDevice(SD2405,0x06,SD2405Time.year);

IIC_WriteOneByteAddressDevice(SD2405,0x05,SD2405Time.month);

IIC_WriteOneByteAddressDevice(SD2405,0x04,SD2405Time.day);

IIC_WriteOneByteAddressDevice(SD2405,0x02,SD2405Time.hour|0x80);

IIC_WriteOneByteAddressDevice(SD2405,0x01,SD2405Time.minute);

IIC_WriteOneByteAddressDevice(SD2405,0x00,SD2405Time.second);

IIC_WriteOneByteAddressDevice(SD2405,0x10,0x00);

IIC_WriteOneByteAddressDevice(SD2405,0x0F,0x00);IIC_WriteOneByteAddressDevice(SD2405,0x03,SD2405Time.week);}五再數(shù)碼管上顯示時間(1)復(fù)制模板工程,雙擊文件夾中的Program.atsln打開工程。(2)打開config.h文件,對整個工程進(jìn)行設(shè)置,我們的工程中使用到的外部模塊有數(shù)碼管和SD2405,需在配置文件中予以使能。(3)由于數(shù)碼管需開啟定時器,并將定時器的時間設(shè)置為1ms,所以在本項(xiàng)目中,我們開啟定時0,并將定時時間設(shè)置為1ms,如程序6-17所示。【程序6-17】#defineINTERNAL_PERIPHERAL_TIMER0_MODE 1 //0: 不初始化TIMER0 //1: 定時1ms //2: 將TIEMR0初始化為快速PWM模式,由引腳PD6進(jìn)行輸出(4)SD2405需使用IIC總線,我們必須對IIC總線的使用情況進(jìn)行配置,先看原理圖,如圖6-23所示。在這里我們指定使用灰排線將單片機(jī)的端口C與SD2405相連接,則SD2405的SCL與單片機(jī)PC2相連接,SD2405的SDA與單片機(jī)的PC3相連接。圖6-23SD2405原理圖(5)這樣,我們就可以對IIC的配置文件進(jìn)行設(shè)置了,打開IIC_config.h文件,進(jìn)行如程序6-18的設(shè)置,將SCL定義為與PC2相連接,將SDA定義為與PC3相連接。【程序6-18】#ifndefIIC_CONFIG_H_#defineIIC_CONFIG_H_

#defineIIC_PORT PORTC#defineIIC_DDR DDRC#defineIIC_PIN PINC

#defineIIC_SCL BIT2#defineIIC_SDA BIT3

#endif/*IIC_CONFIG_H_*/(6)上述內(nèi)容設(shè)置完畢后,我們就可以進(jìn)行main.c的程序設(shè)計(jì)了,現(xiàn)定義全局變量,用于主函數(shù)與定時器0中斷服務(wù)程序交換信息,如程序6-19所示。在程序中,我們在定義變量u8g_DisplayPoint的同時,還對u8g_DisplayPoint進(jìn)行了初始化,讓其第3、5、7位顯示小數(shù)點(diǎn),其余位不顯示小數(shù)點(diǎn),以方便將時間各位隔開,以增強(qiáng)數(shù)碼管的可讀性。【程序6-19】//定義全局變量uint8u8g_DisplayString[8];uint8u8g_DisplayPoint[8]={0,0,0,1,0,1,0,1};(7)接下來,我們在定時器0的中斷服務(wù)函數(shù)中,完成對數(shù)碼管的調(diào)用,如程序6-20所示,這些程序已經(jīng)在上一個項(xiàng)目中給大家介紹過,如果忘記了,復(fù)習(xí)一下就好。【程序6-20】//定時器0溢出中斷服務(wù)處理函數(shù)#ifINTERNAL_PERIPHERAL_TIMER0_MODE!=0ISR(TIMER0_OVF_vect){ #ifINTERNAL_PERIPHERAL_TIMER0_MODE==1 //在此完成邏輯內(nèi)容 staticuint8u8_Number;

u8_Number++; if(u8_Number>7) { u8_Number=0; }

NIXIETUBE_SelectLED(u8_Number);

NIXIETUBE_DrawLED(u8g_DisplayString[u8_Number],u8g_DisplayPoint[u8_Number]);

#ifPROTOCOL_MINIUART_UART0_MODE!=0

miniUART_TimerInterrupt(&miniUART_UART0); #endif #ifPROTOCOL_MINIUART_CH432T_UART0_MODE!=0

miniUART_TimerInterrupt(&miniUART_CH432T_UART0); #endif #ifPROTOCOL_MINIUART_CH432T_UART1_MODE!=0

miniUART_TimerInterrupt(&miniUART_CH432T_UART1); #endif TCNT0=TIMER0_TCNT0;#elifINTERNAL_PERIPHERAL_TIMER0_MODE==2

#endif}#endif(8)最后,我們完成主循環(huán)里的程序,如程序6-21所示。在循環(huán)中,首先讀取SD2405的時間到變量SD2405Time中,然后將其賦值給u8g_DisplayString數(shù)組,u8g_DisplayString的0-3位顯示年,5-6位顯示月,7-8位顯示日,并延時1秒,讓使用者能夠看清楚。接下來,再次讀取SD2405的時間到變量SD2405Time,并將中的數(shù)值賦值給u8g_DisplayString數(shù)組,第0位顯示星期,2-3位顯示小時,5-6位顯示分鐘,7-8位顯示秒。【程序6-21】while(1) { /* **********************************

在這里完成自己的項(xiàng)目邏輯 ********************************** */ SD2405_ReadTime(); u8g_DisplayString[0]=2; u8g_DisplayString[1]=0; u8g_DisplayString[2]=SD2405Time.year>>4; u8g_DisplayString[3]=SD2405Time.year&0x0f; u8g_DisplayString[4]=SD2405Time.month>>4; u8g_DisplayString[5]=SD2405Time.month&0x0f; u8g_DisplayString[6]=SD2405Time.day>>4; u8g_DisplayString[7]=SD2405Time.day&0x0f;

TARGET_Delayms(1000,1); SD2405_ReadTime(); u8g_DisplayString[0]=SD2405Time.week&0x0f; u8g_DisplayString[1]=16; u8g_DisplayString[2]=SD2405Time.hour>>4; u8g_DisplayString[3]=SD2405Time.hour&0x0f; u8g_DisplayString[4]=SD2405Time.minute>>4; u8g_DisplayString[5]=SD2405Time.minute&0x0f; u8g_DisplayString[6]=SD2405Time.second>>4; u8g_DisplayString[7]=SD2405Time.second&0x0f;

TARGET_Delayms(1000,1); /* **********************************

喂狗語句,大部分工程項(xiàng)目都不應(yīng)去除 ********************************** */ #ifINTERNAL_PERIPHERAL_WDT_MODE!=0

TARGET_WatchDogReset(); #endif }(9)完成程序的代碼后,我們對程序進(jìn)行編譯,然后用下載器將編譯后的映像文件下載到教學(xué)開發(fā)板中,如果一切順利的話,我們應(yīng)該能夠看到教學(xué)開發(fā)板的數(shù)碼管交替顯示年-月-日,星期-時-分-秒。(10)還是為了保證讀者在閱讀上的完整性,我們將main.c的所有程序,在這里給大家列出,如程序6-22所示。【程序6-22】//加入包含文件#include"../include.h"

//定義系統(tǒng)常量

//定義全局變量uint8u8g_DisplayString[8];uint8u8g_DisplayPoint[8]={0,0,0,1,0,1,0,1};

//主程序intmain(void){ //定義局部變量 uint8i; //目標(biāo)板初始化,該函數(shù)會自動初始化相應(yīng)的外設(shè)文件

TARGET_Init(); //初始化全局變量

//在上電時,執(zhí)行的相應(yīng)操作 //后臺主循環(huán)while(1) { /* **********************************

在這里完成自己的項(xiàng)目邏輯 ********************************** */ SD2405_ReadTime(); u8g_DisplayString[0]=2; u8g_DisplayString[1]=0; u8g_DisplayString[2]=SD2405Time.year>>4; u8g_DisplayString[3]=SD2405Time.year&0x0f; u8g_DisplayString[4]=SD2405Time.month>>4; u8g_DisplayString[5]=SD2405Time.month&0x0f; u8g_DisplayString[6]=SD2405Time.day>>4; u8g_DisplayString[7]=SD2405Time.day&0x0f;

TARGET_Delayms(1000,1); SD2405_ReadTime(); u8g_DisplayString[0]=SD2405Time.week&0x0f; u8g_DisplayString[1]=16; u8g_DisplayString[2]=SD2405Time.hour>>4; u8g_DisplayString[3]=SD2405Time.hour&0x0f; u8g_DisplayString[4]=SD2405Time.minute>>4; u8g_DisplayString[5]=SD2405Time.minute&0x0f; u8g_DisplayString[6]=SD2405Time.second>>4; u8g_DisplayString[7]=SD2405Time.second&0x0f;

TARGET_Delayms(1000,1);/* **********************************

喂狗語句,大部分工程項(xiàng)目都不應(yīng)去除 ********************************** */ #ifINTERNAL_PERIPHERAL_WDT_MODE!=0

TARGET_WatchDogReset(); #endif } return0; //永不執(zhí)行}

//串口0接收中斷服務(wù)處理函數(shù),接收到的數(shù)據(jù)存儲在UDR0寄存器中#ifINTERNAL_PERIPHERAL_UART0_MODE!=0ISR(USART__RX_vect){ uint8u8_UartData;

u8_UartData=UDR0;

#ifPROTOCOL_MINIUART_UART0_MODE!=0

miniUART_UartInterrupt(&miniUART_UART0,u8_UartData); #endif}#endif//定時器0溢出中斷服務(wù)處理函數(shù)#ifINTERNAL_PERIPHERAL_TIMER0_MODE!=0ISR(TIMER0_OVF_vect){ #ifINTERNAL_PERIPHERAL_TIMER0_MODE==1 //在此完成邏輯內(nèi)容 staticuint8u8_Number;

u8_Number++; if(u8_Number>7) { u8_Number=0; }

NIXIETUBE_SelectLED(u8_Number);

NIXIETUBE_DrawLED(u8g_DisplayString[u8_Number],u8g_DisplayPoint[u8_Number]);

#ifPROTOCOL_MINIUART_UART0_MODE!=0

miniUART_TimerInterrupt(&miniUART_UART0); #endif #ifPROTOCOL_MINIUART_CH432T_UART0_MODE!=0

miniUART_TimerInterrupt(&miniUART_CH432T_UART0); #endif #ifPROTOCOL_MINIUART_CH432T_UART1_MODE!=0

miniUART_TimerInterrupt(&miniUART_CH432T_UART1); #endif//為了提高運(yùn)行速度,將此語句寫在中斷服務(wù)處理函數(shù)里,用戶在使用時,可不理會下列語句 TCNT0=TIMER0_TCNT0;#elifINTERNAL_PERIPHERAL_TIMER0_MODE==2

#endif}#endif

//定時器1溢出中斷服務(wù)處理函數(shù)#ifINTERNAL_PERIPHERAL_TIMER1_MODE!=0ISR(TIMER1_OVF_vect){ //在此完成邏輯內(nèi)容

//為了提高運(yùn)行速度,將此語句寫在中斷服務(wù)處理函數(shù)里,用戶在使用時,可不理會下列語句 TCNT1H=TIMER1_TCNT1H; TCNT1L=TIMER1_TCNT1L;}#endif//外部中斷0中斷服務(wù)處理函數(shù)#ifINTERNAL_PERIPHERAL_INT0_MODE!=0ISR(INT0_vect){ //如果使用了CH432T,則調(diào)用相應(yīng)的中斷處理函數(shù) #ifEXTERNAL_MODULE_CH432T_MODE!=0 CH432T_INT(); #endif}#endif//外部中斷1中斷服務(wù)處理函數(shù)#ifINTERNAL_PERIPHERAL_INT1_MODE!=0ISR(INT1_vect){ //如果使用了CH432T,則調(diào)用相應(yīng)的中斷處理函數(shù) #ifEXTERNAL_MODULE_CH432T_MODE!=0 CH432T_INT(); #endif}#endif//CH432T擴(kuò)展串口0,接收調(diào)用函數(shù)#ifEXTERNAL_MODULE_CH432T_MODE!=0voidCH432T_Uart0(uint8u8_UartData){ #ifPROTOCOL_MINIUART_CH432T_UART0_MODE!=0

miniUART_UartInterrupt(&miniUART_CH432T_UART0,u8_UartData); #endif}#endif

//CH432T擴(kuò)展串口1,接收調(diào)用函數(shù)#ifEXTERNAL_MODULE_CH432T_MODE!=0voidCH432T_Uart1(uint8u8_UartData){ #ifPROTOCOL_MINIUART_CH432T_UART1_MODE!=0

miniUART_UartInterrupt(&miniUART_CH432T_UART1,u8_UartData); #endif}#endif

山東電子職業(yè)技術(shù)學(xué)院電子與通信工程系單片機(jī)程序設(shè)計(jì)與應(yīng)用課程組項(xiàng)目7:異步串行通信——與計(jì)算機(jī)之間傳遞信息1理解數(shù)據(jù)通信的基本概念目錄2認(rèn)知通用異步串行總線3操縱單片機(jī)中的UART4修正萬年歷的時間1理解數(shù)據(jù)通信的基本概念圖7-4貝爾與電話一數(shù)據(jù)通信

數(shù)據(jù)通信是為了實(shí)現(xiàn)計(jì)算機(jī)與計(jì)算機(jī)或終端與計(jì)算機(jī)之間的信息交互而產(chǎn)生的一種通信技術(shù)。典型的數(shù)據(jù)通信系統(tǒng)可以用下面的等式來描述,即:數(shù)據(jù)通信=數(shù)據(jù)處理+數(shù)據(jù)傳輸圖7-5數(shù)據(jù)通信系統(tǒng)組成結(jié)構(gòu)圖數(shù)據(jù)通信系統(tǒng)的組成結(jié)構(gòu)圖如圖7-5所示,數(shù)據(jù)源是數(shù)據(jù)的產(chǎn)生者或發(fā)送者,數(shù)據(jù)宿是數(shù)據(jù)的接收者和數(shù)據(jù)的終點(diǎn),它們是各種類型的計(jì)算機(jī)系統(tǒng)或終端設(shè)備,統(tǒng)稱為數(shù)據(jù)終端設(shè)備。傳輸信道分為模擬信道和數(shù)字信道兩種,模擬系統(tǒng)只能傳輸連續(xù)的模擬信號,如早期的電話網(wǎng)等。數(shù)字信道傳輸離散的數(shù)字信號,即由二進(jìn)制碼構(gòu)成的數(shù)字序列。數(shù)據(jù)信號要在信道上傳輸,必須采用信號變換設(shè)備。對模擬信道,信號變換設(shè)備即調(diào)制解調(diào)器,它把計(jì)算機(jī)或終端送來的數(shù)據(jù)信號變換為模擬信號再送往信道,或者反過來把信道送來的模擬信號變換為數(shù)據(jù)信號再送到計(jì)算機(jī)或終端。對數(shù)字信道,信號變換設(shè)備即接口設(shè)備,其作用是實(shí)現(xiàn)信號碼型與電平的轉(zhuǎn)換,信道特性的均衡,收發(fā)時鐘的形成與供給以及碼速控制等。二認(rèn)知數(shù)據(jù)通信有線傳輸媒介(1)雙絞線雙絞線是由兩條相互絕緣的銅導(dǎo)線扭絞起來構(gòu)成的一對線,而作為一條通信線路,其結(jié)構(gòu)示意圖如圖7-7所示。采用這樣的扭絞結(jié)構(gòu)可以大幅度提高線路的抗干擾能力,它一般作為建筑物內(nèi)一種有效但低價的傳輸介質(zhì)。圖7-7雙絞線結(jié)構(gòu)示意圖二認(rèn)知數(shù)據(jù)通信有線傳輸媒介(2)同軸電纜圖7-8同軸電纜結(jié)構(gòu)示意圖同軸電纜也像雙腳線那樣由一對導(dǎo)體組成,但它們是按同軸的形式構(gòu)成先對,其結(jié)構(gòu)如圖7-8所示。其中最里層是內(nèi)導(dǎo)體,外包一層絕緣體,外面再套一個空心的圓柱形外導(dǎo)體,最外層是起保護(hù)作用的塑料外皮,內(nèi)導(dǎo)體和外導(dǎo)體構(gòu)成一組線對。單根同軸電纜直徑約為0.5-2.5cm,由于同軸電纜的外導(dǎo)體是接地的,所以同軸電纜具有較好的抗干擾能力。

同軸電纜與雙絞線相比價格稍貴,但因其具有帶寬寬、數(shù)據(jù)傳輸速率高、傳輸距離長、抗干擾能力強(qiáng)等優(yōu)點(diǎn),是用途非常廣泛的傳輸介質(zhì),現(xiàn)已被廣泛用于較高速率和較高頻率的數(shù)據(jù)傳輸中,如長距離電報、電話傳輸、有限電視、局域網(wǎng)絡(luò)和短距離系統(tǒng)連接的通信線路中。二認(rèn)知數(shù)據(jù)通信有線傳輸媒介(3)電力線圖7-9電力線載波通信技術(shù)電力線載波通信技術(shù)(PowerLineCommunication),簡稱PLC,是利用電力線傳輸數(shù)據(jù)和媒體信號的一種通信方式,該技術(shù)把載有信息數(shù)據(jù)的高頻信號加載于電力線上進(jìn)行傳輸,接收方把高頻信號分離出來再傳至計(jì)算機(jī)或終端等設(shè)備,以實(shí)現(xiàn)信息的傳遞。電力線載波通信技術(shù)的優(yōu)點(diǎn)是不需要重新架設(shè)網(wǎng)絡(luò),只要有電線,就可以進(jìn)行數(shù)據(jù)傳輸,但其也存在著只能再一個配電變壓器區(qū)域范圍內(nèi)傳送,一般只能在單相電力線上傳輸?shù)炔蛔泓c(diǎn)。二認(rèn)知數(shù)據(jù)通信有線傳輸媒介(4)電話線

利用現(xiàn)有的電話進(jìn)行數(shù)據(jù)通信是一種非常經(jīng)濟(jì)的通信方式,它具有造價低、可以同時傳送語音信號和數(shù)據(jù)信號等諸多優(yōu)點(diǎn)。但是在遠(yuǎn)程數(shù)據(jù)通信上,存在傳輸線上的分布電容導(dǎo)致數(shù)據(jù)波形失真等問題。這是因?yàn)閮蓷l電話線間的絕緣材料導(dǎo)致分布電容的存在,線路越長分布電容越大,造成信號之間的串?dāng)_,所以電話線傳輸距離和傳輸速度上都受限制。二認(rèn)知數(shù)據(jù)通信有線傳輸媒介(5)波導(dǎo)線圖7-11波導(dǎo)管通信技術(shù)如果發(fā)送頻率足夠高,那么信號的電磁成分可在自由空間傳播,從而不需要任何實(shí)際道題。盡管如此,為避免由于信號擴(kuò)散而引起的干擾和損耗,同時為了使信號沿需要的路由傳輸,我們把這線電磁波禁閉在一種有界媒質(zhì)中,這就是波導(dǎo)管。通常,波導(dǎo)管被用來把微波發(fā)射器和接受器連接到它們的天線,其工作頻率為200-110000MHz。二認(rèn)知數(shù)據(jù)通信有線傳輸媒介(6)光纖圖7-12光纖管通信技術(shù)光纖就是光導(dǎo)纖維的簡稱,是傳送光信號的媒介。光纖通信的主要優(yōu)點(diǎn)有:頻率寬,通信量大;在很寬的頻帶范圍內(nèi),光纖對各頻率的傳輸損耗和色散幾乎不等,不需要在接收端和中繼站采取幅度或時延等均衡措施;不受電磁干擾和靜電干擾的影響,即在同一根光纜中,臨近各根光纖之間幾乎沒有串?dāng)_;構(gòu)成光纖的主要原料是石英,石英的資源豐富且價格便宜;保密性好、線徑細(xì)、體積小、重量輕、損耗小、誤碼率低等特點(diǎn)。光纖已經(jīng)成為當(dāng)今重要的傳輸媒質(zhì)之一,為數(shù)字和計(jì)算機(jī)通信網(wǎng)的迅速發(fā)展提供了良好的傳輸環(huán)境。三認(rèn)知數(shù)據(jù)通信無線傳輸媒介所謂無線傳輸媒質(zhì),是指無須架設(shè)或鋪埋電纜或光纜,而通過自由空間、將電信號轉(zhuǎn)換為無線電波進(jìn)行傳送。發(fā)送端把待傳的信息轉(zhuǎn)換為無線電信號,依靠無線電波在空間傳播,而接收端則把無線信號還原成發(fā)生哦難關(guān)所傳遞的信號。頻段名稱主要應(yīng)用30-300KHzLF(低頻)長波導(dǎo)航300KHz-3MHzMF(中頻)中波商用調(diào)幅無線電3-30MHzHF(高頻)短波短波無線電30-300MHzVHF(甚高頻)超短波甚高頻電視,調(diào)頻無線電300MHz-3GHzUHF(超高頻)微波超高頻電視,地面微波3-30GHzSHF(特高頻)地面微波,衛(wèi)星微波30-300GHzEHF(極高頻)實(shí)驗(yàn)用點(diǎn)點(diǎn)通信(1)短波通信圖7-13短波通信技術(shù)(2)微波通信圖7-14微波通信技術(shù)微波通信分為模擬微波通信和數(shù)字微波通信兩種,模擬微波通信采用調(diào)頻制,數(shù)字微波通信采用相移鍵控。微波通信的傳輸質(zhì)量比較穩(wěn)定,影響質(zhì)量的主要因素是雨雪天氣對微波產(chǎn)生的吸收損耗,不利地形或環(huán)境對微波造成的衰落現(xiàn)象。微波通信以其成本低、中繼距離遠(yuǎn)等優(yōu)點(diǎn),成為長途通信的主要手段之一。(3)衛(wèi)星通信圖7-15衛(wèi)星通信技術(shù)衛(wèi)星通信就是地球上的無線電通信站之間利用人造衛(wèi)星作中繼站而進(jìn)行的通信。人造衛(wèi)星已成為當(dāng)今通信的重要媒質(zhì)之一,通信衛(wèi)星被發(fā)射到地球赤道上空36000km的靜止軌道上,利用衛(wèi)星上的通信轉(zhuǎn)發(fā)器,可以接收由陸地衛(wèi)星地球站發(fā)射的信號。該信號經(jīng)過放大、變頻后,轉(zhuǎn)發(fā)到其它的地球站,從而完成地球站之間的傳輸。一個衛(wèi)星可以覆蓋地球表面1/3地區(qū),所以衛(wèi)星通信具有頻帶寬,通信容量大,中繼站少等諸多優(yōu)點(diǎn),并且兩個地球站間的直接通信距離可達(dá)13000km,所以衛(wèi)星通信已經(jīng)成為當(dāng)今長途通信的主要手段之一,也是計(jì)算機(jī)通信的良好媒質(zhì)之一。(4)激光通信圖7-16激光通信技術(shù)

激光通信是利用激光傳輸信息的通信方式,激光是一種新型光源,具有亮度高、方向性強(qiáng)、單色性好、相干性強(qiáng)等特征。它具有通信容量大、不受電磁干擾、保密性強(qiáng)、設(shè)備輕便、機(jī)動性好等優(yōu)點(diǎn),但使用時光學(xué)收發(fā)天線相互對準(zhǔn)困難,通信距離限于視距(數(shù)公里至數(shù)十公里范圍),易受氣候影響,在惡劣條件下會造成通信中斷。

激光通信中,激光光束的發(fā)散角通常在毫弧度,甚至微弧度量級,它能夠較好的解決日益嚴(yán)重的衛(wèi)星件的電磁波干擾和保密問題。激光通信中的天線尺寸非常小,但其信息量巨大。此外,深空對于光波是一種無損耗、無干擾的良好傳輸介質(zhì),傳輸同樣速率的信息裝備,激光通信性價比最高。(6)散射通信圖7-18散射通信技術(shù)

散射通信是利用地面發(fā)射的無線電波在對流層散射而返回地面的一種通信方式,工作頻率范圍為100MHz-10GHz,通信距離一般為150-400km,最高可達(dá)800-1000km。

與短波通信相比,散射通信的傳輸頻帶較寬,而且通信容量大,能進(jìn)行多路復(fù)用。散射通信的主要缺點(diǎn)是傳輸損耗的,接收信號的強(qiáng)度變化大,為了克服衰落現(xiàn)象,需要采取多種措施,如采用分級接收,加大甜心,使用大功率發(fā)射極和低噪聲接收機(jī)等,致使成本提高。散射通信由于通信容量大,不受核爆、磁暴和極光的影響,因而在軍事通信中以及無法進(jìn)行微波通信的條件下,有很高的使用價值。四認(rèn)知認(rèn)知數(shù)據(jù)通信的傳輸模式(1)并行傳輸并行傳輸是指一個或多個字符數(shù)據(jù)在并行信道上同時傳輸?shù)姆绞剑⑿袀鬏敃r,一次傳輸一個或多個字符數(shù)據(jù),速度較快,但其需要并行通道(在線路板級,我們就可以稱為并行總線),線路投資大,不適合遠(yuǎn)距離傳輸(2)串行傳輸

串行傳輸是構(gòu)成字符數(shù)據(jù)的二進(jìn)制代碼序列在一條信道上以位為單位,按時間順序的傳輸方式。串行傳輸時,發(fā)送端按位發(fā)送,接收端按位接收,同時還要對所傳輸?shù)淖址右源_認(rèn),所以收發(fā)雙方要采取同步措施,否則接收端不能正確區(qū)分出所傳輸?shù)淖址チ送ㄐ诺囊饬x。串行傳輸速度雖慢,但是只需要一條傳輸信道,且線路投資少,易于實(shí)現(xiàn),是當(dāng)前現(xiàn)代通信發(fā)展的主要傳輸方式。(3)同步傳輸

同步傳輸方式即為位同步傳輸技術(shù),在同步傳輸方式下,收發(fā)雙方必須建立精準(zhǔn)的位定時信號,用以正確區(qū)分每位的數(shù)據(jù)信號。在線路板級,我們可以通過時鐘線的方式予以實(shí)現(xiàn),這在項(xiàng)目6種已經(jīng)給大家介紹過。如果只有一個信道,則必須在數(shù)據(jù)發(fā)送前加入標(biāo)志序列,以完成收發(fā)雙方的同步。(4)異步傳輸

異步傳輸不需要同步信號,它以字節(jié)為傳輸單位,當(dāng)發(fā)送1個字節(jié)數(shù)據(jù)時,字節(jié)前要加入“起始”信號,字節(jié)后要加入“停止”信號。傳輸時,字節(jié)可以連續(xù)發(fā)送,也可以單獨(dú)發(fā)送,兩字節(jié)之間的間隔時間可以不確定,實(shí)現(xiàn)起來較為簡單。本項(xiàng)目所使用的與計(jì)算機(jī)之間的傳輸模式就是異步串行傳輸,我們會在下一個任務(wù)中給大家進(jìn)行詳細(xì)的介紹。(5)雙工通信雙工通信是對相互通信的兩臺通信設(shè)備間數(shù)據(jù)流向的描述,或者說是對一臺通信設(shè)備執(zhí)行收發(fā)操作能力的描述。雙工包括全雙工、半雙工和單工,其鏈路結(jié)構(gòu)如圖7-19所示。圖7-19雙工通信鏈路結(jié)構(gòu)單工方式如圖7-19(a)所示,是指兩臺通信設(shè)備間數(shù)據(jù)只能再一個方向上傳送,在單工方式下,兩臺通信設(shè)備中,一臺為發(fā)送設(shè)備,另一臺為接收設(shè)備,它們之間有一臺通信線路就可以了。半雙工方式如圖7-19(b)所示,指相互通信的兩臺通信設(shè)備具有收發(fā)數(shù)據(jù)的能力,但在某一時間內(nèi)它們智能執(zhí)行一種操作(收或發(fā)),不能同時執(zhí)行收發(fā)兩種操作。相應(yīng)的,在它們之間的通信線路上可在兩個方向上傳輸數(shù)據(jù),但在某一時間內(nèi)卻智能在一個方向上傳送數(shù)據(jù)。全雙工方式如圖7-19(c)所示,指相互通信的兩臺通信設(shè)備可以同時發(fā)送和接收數(shù)據(jù),即數(shù)據(jù)同時可在兩個方向上傳送,所以它們之間至少需要兩條通信線路。2認(rèn)知異步串行總線一認(rèn)知通用異步串行總線UART圖7-23UART數(shù)據(jù)格式(1)起始位

起始位約定為0,用0表示UART通信開始進(jìn)行一個幀的發(fā)送。(2)數(shù)據(jù)位

在起始位之后,設(shè)置的是5-8位的數(shù)據(jù)位,UART傳輸時先從幀的最低位開始傳送,然后依次傳送直到幀的最高位,早期數(shù)據(jù)位的多少是由硬件事先確定好的,現(xiàn)代的UART組件數(shù)據(jù)位多少可以由軟件進(jìn)行確定。(3)奇偶校驗(yàn)位奇偶校驗(yàn)位是用來保證數(shù)據(jù)傳輸?shù)目煽啃院驼_性的,奇偶效驗(yàn)位跟在數(shù)據(jù)位之后,占用了1位的空間,用來驗(yàn)證接收到的數(shù)據(jù)是否正確,有奇校驗(yàn)和偶校驗(yàn)之分,當(dāng)然,收發(fā)雙方也可以約定不使用奇偶校驗(yàn)位。

奇校驗(yàn):要求UART中所需傳輸?shù)亩C(jī)制數(shù)據(jù)位和校驗(yàn)位之中1的個數(shù)之和為奇數(shù),若所需傳輸?shù)臄?shù)據(jù)位之中的1的個數(shù)之和為奇數(shù),校驗(yàn)位就設(shè)置為0;若所需傳輸?shù)臄?shù)據(jù)位之中的1的個數(shù)之和為偶數(shù),校驗(yàn)位就設(shè)置為1。

偶校驗(yàn):要求UART中所需傳輸?shù)亩C(jī)制數(shù)據(jù)位和校驗(yàn)位之中1的個數(shù)之和為偶數(shù),若所需傳輸?shù)臄?shù)據(jù)位之中的1的個數(shù)之和為奇數(shù),校驗(yàn)位就設(shè)置為1;若所需傳輸?shù)臄?shù)據(jù)位之中的1的個數(shù)之和為偶數(shù),校驗(yàn)位就設(shè)置為0。(4)停止位停止位可以設(shè)置為1位、1.5位或2位,約定為1,用來表示UART結(jié)束了1幀的傳輸。5)空閑位空閑位約定為1,用0表示UART的傳輸線上沒有數(shù)據(jù)傳輸,但在大部分情況下,UART中不設(shè)置空閑位,以追求傳輸?shù)母咝省6J(rèn)知衡量UART傳輸速率的方法(1)波特率在信息傳輸通道中,攜帶數(shù)據(jù)信息的信號單元,我們稱為碼元,每秒鐘傳輸?shù)拇a元數(shù)稱為碼元的傳輸速率,簡稱波特率。波特率是指數(shù)據(jù)信號對載波的調(diào)制速率,它用單位時間內(nèi)載波調(diào)制狀態(tài)改變的次數(shù)來表示,也就是每秒鐘調(diào)制的碼元數(shù),其單位是Baud,波特率是傳輸通道頻寬的指標(biāo)。(2)比特率每秒鐘通過信道傳輸?shù)男畔⒘糠Q為位傳輸速率,也就是每秒鐘傳送的二進(jìn)制位數(shù),簡稱比特率。比特率表示有效數(shù)據(jù)的傳輸速率,用bps(b/s)來表示。(3)波特率與比特率的關(guān)系我們用例子來說明波特率與比特率的關(guān)系,例如我們需要每秒鐘傳送240個字符,每個字符格式包含10位(1個起始位,1個停止位,8個數(shù)據(jù)位),則該傳輸?shù)拇a元是字符,所以波特率為240Baud,而比特率則為240*10=2400bps。又如,我們需要每秒鐘傳送240個二進(jìn)制位,這時傳輸?shù)拇a元是位,所以波特率為240Baud,而比特率也為240bps。三認(rèn)知UART的總線標(biāo)準(zhǔn)接口(1)RS-232邏輯“0”時,驅(qū)動器輸出電平5-15V邏輯“0”時,驅(qū)動器接收電平>3V邏輯“1”時,驅(qū)動器輸出電平-15-5V邏輯“1”時,驅(qū)動器接收電平<-3V表7-2RS-232的電氣特性(2)RS-422RS-422是EIA公布的“平衡電壓數(shù)字接口電路的電氣特性”標(biāo)準(zhǔn),這個標(biāo)準(zhǔn)是改善RS-232標(biāo)準(zhǔn)的電氣特性,又考慮與RS-232兼容而指定的。RS-422與RS-232的關(guān)鍵不同在于把單端輸入改為雙端差分輸入,信號地不再共用,雙方的信號地也不再接到一起。RS-422給出了對電纜、驅(qū)動器的要求,規(guī)定了雙端電氣接口形式,其標(biāo)準(zhǔn)是雙絞線傳送信號。它通過傳輸線驅(qū)動器,把邏輯電平變換為電位差;通過傳輸線接收器,由點(diǎn)位差轉(zhuǎn)換為邏輯電平,實(shí)現(xiàn)信號接收。RS-422比RS-232具有更快的傳輸速度和更遠(yuǎn)的傳輸距離。傳輸率最大可為10Mbps,在此速率下,電纜長度允許120米。如果采用較低的傳輸速率,最大距離可達(dá)1200米。RS-422為全雙工總線,可同時進(jìn)行收發(fā)操作,所以在硬件設(shè)計(jì)上將收發(fā)當(dāng)作2個通道來處理,每個通道使用2條信號線,通過信號線直接電位差傳遞“0”、“1”狀態(tài)。RS-422不僅能夠?qū)崿F(xiàn)點(diǎn)對點(diǎn)的信號傳輸,還可以實(shí)現(xiàn)點(diǎn)對多點(diǎn)的信號傳輸。RS-422規(guī)定驅(qū)動器輸出電平為-6至6V,接收器可以檢測到的輸入信號電平可低到200mV。(3)RS-485使用RS-422進(jìn)行數(shù)據(jù)傳輸需要4條信號線,為了減少傳輸線纜的數(shù)量,EIA在RS-422的基礎(chǔ)上,推出了RS-485標(biāo)準(zhǔn)。RS-485采用半雙工工作模式,在某一時刻,通信雙發(fā)的兩端,只能一端進(jìn)行發(fā)送操作。接口RS-232RS-422RS-485操作方式單端差動差動最大距離15米1200米1200米最大速率200kbps10Mbps10Mbps最大驅(qū)動器數(shù)目1132最大接收器數(shù)目11032接收靈敏度±3V±200mV±200mV驅(qū)動器輸出阻抗300Ω60kΩ120kΩ接收器負(fù)載阻抗3-7kΩ>4kΩ>12kΩ負(fù)載阻抗3-7kΩ100Ω60Ω表7-3RS-232、RS-422和RS-485的性能比較3操縱單片機(jī)中UART一理解UART的硬件結(jié)構(gòu)圖7-27ATmega168PA的UART模塊的硬件結(jié)構(gòu)二理解UART硬件驅(qū)動初始化具體流程如下:(1)程序首先定義32位變量u32_BaudRate,然后根據(jù)UART0配置宏低4位的具體數(shù)值,將u32_BaudRate設(shè)置成相應(yīng)的波特率;(2)設(shè)置UCSR0B寄存器,允許UART0進(jìn)行發(fā)送和接收操作,并使能接收中斷;(3)取出u32_BaudRate的低8位設(shè)置到UBRR0L寄存器中,再取出u32_BaudRate的高8位設(shè)置到UBRR0H寄存器中,這樣UART0的波特率就設(shè)置好了。(4)設(shè)置UCSR0C寄存器,將UART0設(shè)置為8位數(shù)據(jù)位和1位停止位,這種設(shè)置方式是工業(yè)現(xiàn)場總線最常用的設(shè)置方式。(5)取出UART0配置宏的高4位,根據(jù)其具體數(shù)值設(shè)置校驗(yàn)位,至此初始化程序完成。三理解UART硬件驅(qū)動發(fā)送與接收UART硬件驅(qū)動支持3個發(fā)送函數(shù),分別用于發(fā)送字節(jié)、發(fā)送字符串和發(fā)送帶有回車和換行的字符串。函數(shù)Uart0_SendByte的程序源碼如程序7-4所示,程序首先進(jìn)入一個while循環(huán),其退出條件是UDR0寄存器中的數(shù)據(jù)已經(jīng)發(fā)送完畢。當(dāng)條件滿足時,退出循環(huán),然后將欲發(fā)送的數(shù)據(jù)送入UDR0寄存器,單片機(jī)會自動根據(jù)已經(jīng)配置好的UART參數(shù),將數(shù)據(jù)從TxD引腳發(fā)送出去。【程序7-4】voidUart0_SendByte(uint8u8_byte){ while(!(UCSR0A&(1<<UDRE0))); UDR0=u8_byte;}函數(shù)Uart0_SendString用于發(fā)送字符串信息,如程序7-5所示,在調(diào)用該函數(shù)時,將字符串的首地址作為指針傳遞給該函數(shù)。函數(shù)由while循環(huán)構(gòu)成,沒循環(huán)一次,都從字符串中取出1個字符,通過調(diào)用Uart0_SendByte函數(shù)將其發(fā)送出去,然后字符串指針向后移1位,直到移至字符串的結(jié)尾字符“\0”,while循環(huán)結(jié)束。【程序7-5】voidUart0_SendString(uint8*u8_string){ while(*u8_string) { Uart0_SendByte(*u8_string); u8_string++; }}函數(shù)Uart0_SendStringPro的程序代碼如程序7-6所示,這段代碼在理解上就非常簡單了,它調(diào)用Uart0_SendString將字符串發(fā)送出去后,再補(bǔ)上回車換行符。【程序7-6】voidUart0_SendStringPro(uint8*u8_string){ Uart0_SendString(u8_string); Uart0_SendByte(0x0D); Uart0_SendByte(0x0A);}四在計(jì)算機(jī)上顯示實(shí)時時鐘的當(dāng)前時間步驟如下:(1)復(fù)制例程6.22,我們在上一個項(xiàng)目的例程的基礎(chǔ)上,加入UART發(fā)送信息的功能。(2)打開config.h文件,對串行口進(jìn)行配置,如程序7-8所示,將配置變量設(shè)置為0x0C,即波特率為115200bps,無奇偶校驗(yàn)。【程序7-8】#defineINTERNAL_PERIPHERAL_UART0_MODE0x0C(3)使用PORTD與如圖7-29所示的電路圖相連接。我們使用灰排線將P8端口與P3端口連接,這樣PD0就成為了UART的發(fā)送引腳,PD1成為UART的接收引腳,PD2是IIC總線的SCL,PD3是IIC總線的SDA。圖7-29USB

溫馨提示

  • 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

提交評論