




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
山東電子職業技術學院電子與通信工程系單片機程序設計與應用課程組項目5:獨立式按鍵——多功能秒表的設計與制作1認知輕觸機械式觸點開關目錄2獨立式按鍵設計3設計具有倒計時功能的多功能秒表器1認知輕觸機械式觸點開關圖5-6輕觸機械式觸點開關按鍵一輕觸機械式觸點開關按鍵圖5-7輕觸按鍵的內部結構內部的結構,主要由開關蓋、柱塞、反作用彈簧、底座、接點和端子組成。圖5-8輕觸按鍵動作時的時序分析圖二輕觸按鍵動作的時序分析按鍵從斷開狀態到閉合狀態,從閉合狀態到斷開狀態,均有一個抖動過程,分別稱為前沿抖動和后沿抖動,這個抖動過程的時間一般為5-20ms三抖動的時間是短還是長
圖5-9由RS觸發器組成的按鍵硬件消抖電路四按鍵的硬件消都抖當按鍵由3腳轉向1腳,我們可以將其從時間上分為3個階段:離開3腳未與1腳接觸,與1腳接觸但處于機械抖動,抖動結束與1腳可靠連接。先看“離開3腳未與1腳接觸”狀態,此時按鍵處于懸空狀態,將維持上一次的狀態,即74LS00與單片機相連的引腳3輸出低電平;對于“與1腳接觸但處于機械抖動”狀態,由于已經與按鍵的引腳1接觸,74LS00的輸出電平反轉,無論按鍵怎么抖動,只要不與按鍵的引腳3接觸,74LS00與單片機相連的引腳3都輸出高電平;最后一種狀態,就比較好理解了,74LS00將輸出高電平。圖5-10RC濾波硬件消抖電路圖中當按鍵S1沒有閉合時,電阻R1和電阻R2給電容C1放電,74LS00的引腳1和2為低電平,引腳3輸出高電平。當按鍵S1閉合時,VCC通過電阻R1給電容C1充電,由于電容充滿需要一定的時間,所以74LS00的引腳1和2不會立刻達到高電平電壓的閾值,此時按鍵的抖動就是,對電容C1的斷續充電過程,當電容C1的電壓達到74LS00高電平電壓的閾值時,正好越過了電容的抖動時間,此時74LS00的引腳3輸出低電平,達到了應交消抖的目的。2獨立式按鍵設計圖5-12獨立式按鍵一、認知獨立式按鍵圖5-13教學開發板上使用的獨立式按鍵每個按鍵的電路都是獨立的,當其中任意一個按鍵被按下時,它所對應的數據線的電平就變成低電平,此時單片機通過I/O端口讀入的這條數據線上的數據就是邏輯0,表示有按鍵按下。若無按鍵按下,則單片機通過I/O端口讀入的所有數據線上的電平都為高電平(這是由于每個I/O端口都連接了上拉電阻),即邏輯1。二、按鍵的軟件消抖圖5-14按鍵軟件消抖處理流程圖三設計具有“啟動/繼續”、“暫停”與“復位”的秒表第0位第1位第2位第3位第4位第5位第6位第7位空空顯示分的十位顯示分的個位顯示秒的十位顯示秒的個位顯示0.1秒顯示0.01秒表5-2數碼管的位與計時的對應關系步驟如下:(1)打開邏輯層的config.h文件,使能定時器1,并將定時時間設置為10ms,如程序5-3所示。【程序5-3】#defineINTERNAL_PERIPHERAL_TIMER1_MODE 1 //0: 不初始化TIMER0 //1: 定時10ms //2: 定時1ms(2)打開邏輯層的main.c函數,先準備記錄分、秒和毫秒的全局變量,如程序5-4所示,在定義變量的時候,我們要依據變量的取值范圍,考慮變量的數據類型。通過項目分析,我們可以得出u8g_Minute的取值范圍為0-60,u8g_Second的取值范圍為0-60,u8g_milliSecond的取值范圍為0-100,所以將這3個全局變量定義為uint8是合適的,因為uint8的取值范圍為0-255。有了全局變量后,我們就可以在main函數和定時器1的中斷服務處理函數中傳遞數據了。【程序5-4】//定義全局變量uint8u8g_DisplayString[8];uint8u8g_DisplayPoint[8];uint8u8g_Minute,u8g_Second,u8g_milliSecond;(3)在main.c文件中,找到定時器1中斷服務處理函數,寫入如程序5-5所示的程序。對于這段程序的理解,我們可以參看如圖5-15所示的流程圖,在這里只需要注意的是該程序每10ms調用1次。【程序5-5】//定時器1溢出中斷服務處理函數#ifINTERNAL_PERIPHERAL_TIMER1_MODE!=0ISR(TIMER1_OVF_vect){ //在此完成邏輯內容
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; } //為了提高運行速度,將此語句寫在中斷服務處理函數里 TCNT1H=TIMER1_TCNT1H; TCNT1L=TIMER1_TCNT1L;}#endif圖5-15定時器1中斷服務處理函數流程圖(4)接下來的工作就是要對變量u8g_Minute、u8g_Second和u8g_milliSecond進行解析,提取十位和個位,送數碼管顯示,在上一個項目中,我們已經知道只需將欲顯示的數字傳遞給數組u8g_DisplayString,u8g_DisplayPoint即可,在使用數組u8g_DisplayString,u8g_DisplayPoint之前,需要對其進行初始化,如程序5-6所示。程序開始時,將數組u8g_DisplayString和u8g_DisplayPoint中的所有元素都賦值為初始值0x00,然后將u8g_DisplayString[0]和u8g_DisplayString[1]賦值為0xff,表示數碼管0位和1位不顯示數字,然后將u8g_DisplayPoint[3]和u8g_DisplayPoint[5]設置為0x01,表示數碼管的3位和5位顯示小數點。【程序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十位和個位的方法。因為比較簡單,讀者自行研究一下,在這里就不再贅述了。【程序5-7】while(1){ **********************************
在這里完成自己的項目邏輯 ********************************** */ 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; /*
**********************************
喂狗語句,大部分工程項目都不應去除 ********************************** */ #ifINTERNAL_PERIPHERAL_WDT_MODE!=0
TARGET_WatchDogReset(); #endif}(6)現在我們就可以對程序進行編譯,然后下載到教學開發板中,給程序上電,我們可以看到數碼管從00:00:00開始計時,如果不掉電的話,可以一致計時到60:00:00。(7)現在的程序已經可以計時了,但是還不能進行控制,下面的程序將加入3個按鍵,用于計時控制,這三個按鍵的功能,我們這樣定義:S0用于計時的啟動/繼續,S1用于計時的暫停,S2用于時間的復位(當點按S2鍵后,時間歸0并暫停計時)。(8)為了實現上述功能,我們還需再加入一個用于控制計時的變量u8g_ControlCount,并在main函數中對其賦初值。(9)接下來,我們在定時器1中斷服務處理函數中,加入控制變量u8g_ControlCount,如程序5-10所示。這段程序代碼,應該不難理解,其功能是只有當u8g_ControlCount為1時,才進行計時,否則就停止計時。(10)下面再加入使用按鍵對計時進行控制的程序,如程序5-11所示(略)。(11)現在我們可以對程序進行編譯,并下載到教學開發板中,如果一切順利的話,我們就可以用按鍵來控制秒表的計時了。教學開發板上電時,數碼管顯示00:00:00,我們點按S0鍵,可以觀察到計時開始,點按S1鍵可以觀察到計時暫停,點按S2鍵可以觀察到計時復位并暫停。圖5-16控制定時器啟動/繼續、暫停和復位的程序流程圖3設計具有倒計時功能的多功能秒表器一、認知蜂鳴器圖5-18蜂鳴器電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性的振動發聲。二、倒計時時間的調整程序的總體設計思路為:我們將程序分為兩種工作模式:正計時模式和倒計時模式,點擊按鍵S2進入正計時模式并將時間置為00:00:00,此時點擊按鍵S0開始正計時,點擊按鍵S1暫停計時;點擊按鍵S3進入倒計時模式,此時數碼管上顯示00:00:00,我們可以通過左調S4鍵、右調S5鍵、上調S6鍵和下調S7鍵,進行時間調整,時間調整完畢后,點擊按鍵S0開始倒計時,點擊S1暫停倒計時。當倒計時的時間變為00:00:00后,蜂鳴器鳴叫,直到點擊S1按鍵停止鳴叫,將工作模式轉為正計時。步驟如下:(1)復制程序“例5.12”,雙擊文件夾中的Program.atsln打開工程。(2)打開main.c文件,先加入一些全局變量,(3)處理定時器1中斷服務處理函數(4)對啟動/繼續鍵處理程序進行調整(5)對暫停鍵處理程序進行調整(6)對正計時模式復位鍵處理程序進行調整
(7)在程序中加入“倒計時功能”按鍵程序(8)在程序中加入左調按鍵程序(9)在程序中加入右調按鍵程序(10)在程序中加入上調按鍵程序(11)在程序中加入下調按鍵程序(12)在程序中加入閃爍實現程序圖5-20數碼管閃爍邏輯流程圖山東電子職業技術學院電子與通信工程系單片機程序設計與應用課程組項目6:IIC總線——萬年歷的設計與制作1認知智能設備中的實時時鐘目錄2認知IIC總線3使用C語言模擬IIC總線4設計顯示當前時間的萬年歷1認知智能設備中的實時時鐘一認知實時時鐘實時時鐘英文的全稱為RealTimeClock,縮寫為RTC。通過對其字面意思的理解,我們很容易的知道實時時鐘是用來提供當前準確時間的一種模塊或芯片。早在上個世紀40年代,人們已經認知到了實時時鐘的重要性,例如航空、航海、電子通信或者戰爭指揮等,人們都需要一種標準而且準確的時間。但限于當時電子技術的發展水平,那時記錄時間的方法一般以機械式鐘表為主。1、早期的RTC
早期RTC產品實質是一個帶有計算機(單片機)通訊口的分頻器。它通過對晶振所產生的振蕩頻率分頻和累加,得到年、月、日、時、分、秒等時間信息并通過計算機通訊口送入處理器處理。這一時期RTC的特征如下:在控制口線上為并行口;功耗較大;采用普通CMOS工藝;封裝為雙列直插式;芯片普遍沒有現代RTC所具有的萬年歷及閏年月自動切換功能,也無法處理2000年問題。現在已經被淘汰。2、中期的RTC在20世紀90年代中期出現了新一代RTC,它采用特殊CMOS工藝;功耗大為降低,典型值約0.5μA以下;供電電壓僅為1.4V以下;和計算機(單片機)通訊口也變為串行方式,出現了諸如三線SIO和四線SPI,以及部分產品采用的2線IIC總線;包封上采用SOP/SSOP封裝,體積大為縮小;從功能上來說,片內智能化程度大幅提高、具有萬年歷功能,輸出控制也變得靈活多樣。其中美國DALLS公司推出的RTC甚至已經出現時基軟件調校功能及振蕩器停振自動檢測功能而且芯片的價格極為低廉。目前,這些芯片已被客戶大量使用中。3、現代的RTC最新一代RTC產品中,除了包含第二代產品所具有的全部功能,更加入了復合功能,如低電壓檢測,主備用電池切換功能,EEPROM、看門狗和抗印制板漏電功能等。二實時時鐘模塊的內部組成圖6-7SD2405ALPI模塊內部原理框圖三認知SD2405實時時鐘模塊(1)低功耗:1.0μA典型值(內部電池供電,Ta=25℃)。(2)工作電壓:3.3V~5.5V,工作溫度:-30℃~+80℃。(3)標準IIC總線接口方式,最高速度400KHZ(4.5V~5.5V)。(4)年、月、日、星期、時、分、秒的BCD碼輸入/輸出,并可通過獨立的地址訪問各時間寄存器。(5)閏年自動調整功能(從2000年~2099年)。(6)可選擇12/24小時制式,內置年、月、日、星期、時、分、秒共7字節的報警數據寄存器及1字節的報警允許寄存器。(7)內置12字節通用SRAM寄存器可用于存儲用戶的一般數據。(8)三種中斷均可選擇從INT腳輸出,并具有兩個中斷標志位.(9)可設定并自動重置的單路報警中斷功能(時間范圍最長設至100年),年、月、日、星期、時、分、秒報警,共有96種組合方式,并有單事件報警和周期性報警兩種中斷輸出模式.(10)周期性頻率中斷輸出:從32768Hz~1/16Hz……1秒共十五種方波脈沖。
三認知SD2405實時時鐘模塊(11)自動重置的8位倒計時定時器,可選的4種時鐘源(4096HZ、64HZ、1HZ、1/60HZ)。(12)內置時鐘精度數字調整功能,可通過程序來調整走時的快慢。用戶采用外置的溫度傳感器,設定適應溫度。(13)變化的調整值,可實現在寬溫范圍內高精度的計時功能。(14)具備內部電源自動切換功能:芯片依據不同的電壓自動從VDD切換到VBAT或從VBAT切換到VDD。(15)在VBAT模式下,芯片具有中斷輸出允許或禁止的功能,可滿足在備用電池供電時輸出中斷的需要。(16)內置IIC總線0.5秒自動復位功能(從Start命令開始計時),保證時鐘數據的有效性及可靠性,避免IIC總線掛死問題。(17)內置三個時鐘數據寫保護位,避免對數據的誤寫操作,可更好地保護時鐘數據。(18)內置VBAT模式IIC總線通信禁止功能,從而避免在電池供電時CPU對時鐘操作所消耗的電池電量,也可避免在主電源上、下電的過程中因CPU的I/O端口所輸出的不受控的雜波信號對時鐘芯片的誤寫操作,進一步提高時鐘芯片的可靠性。(19)內置上電復位電路及指示位。三認知SD2405實時時鐘模塊(20)內置電源穩壓,內部計時電壓可低至1.5V。(21)芯片管腳抗靜電(ESD)>4KV。(22)內置晶振,出廠前已對時鐘進行校準,時鐘精度為±5ppm(在25℃±1℃下),即年誤差小于2.6分鐘。(23)內置充電電池及充電電路,常溫下累計電池電量近550mAh、電池使用壽命為5~8年時間。(24)封裝形式:16腳的DIP封裝,SD2405ALPI為工業級型號。四SD2405實時時鐘模塊的硬件電路設計圖6-9SD2405ALPI硬件設計原理圖2認知IIC總線二總線分類(1)按照系統類型進行分類(2)按數據線的寬度進行分類
這個比較好理解,就是總線單位時間傳遞數據量(位)的個數,可以分為8位、16位、32位、64位和128位。(3)按傳輸方式進行分類
按照這種分類可以把總線分為并行總線和串行總線。(4)按傳輸控制方式進行分類三IIC總線IIC總線的英文全稱是InterIntegratedCircuit(內部集成電路),是上世紀80年代Philips公司研發的一款同步串行總線。三IIC總線特點(1)IIC總線由2條物理線組成,這樣的設計即節省了芯片的I/O引腳,又節省了PCB的面積及線材成本。(2)IIC總線協議規范比較簡單,各部件的邏輯很容易在芯片內部以硬件的方式予以實現。對于具有一定設計經驗的工程師而言,即使內部沒有硬件IIC總線幾口,通過軟件模擬的方式實現IIC總線也是比較簡單的。(3)IIC總線支持種類繁多的器件,極大程度的方便了工程師在設計產品時的芯片選型。(4)應用IIC總線,多數器件可以同時直接掛在總線上,不需附加額外的I/O線或者地址譯碼線。三IIC總線特點(5)IIC總線擁有良好的伸縮性,可以在原始總線的基礎上隨時刪除或新增各種器件。工程師可以使用程序設計的方法實現IIC總線的自檢,用以發現總線上器件的變化。(6)IIC總線擁有良好的電器兼容性,由于其采用開漏的I/O相互連接,這樣在不需額外轉換的情況下,兼容3V/5V的邏輯電平。在具體應用時,只需選擇適當的上拉電阻即可。(7)IIC總線支持多種通信方式,除了一主多從這種常見的通信方式外,還支持多主機通信、雙主機通信,以及廣播方式等。(8)IIC總線同時兼顧低速通信和高速通信,即可以使用低于10kb/s的速率與低速器件進行傳輸,也可以使用400kb/s的速率與高速器件進行通信。3使用C語言模擬IIC總線一IIC總線的結構及工作原理圖6-15IIC總線結構二IIC總線典型信號的C語言實現圖6-15IIC總線的典型信號
起始信號(START):當SCL為高電平時,SDA由高電平向低電平跳變,產生開始信號。當總線空閑的時候,例如,沒有主動設備在使用總線(SDA和SCL都處于高電平),主機通過發送起始信號建立通信。
終止信號(STOP):當SCL為高電平時,SDA由低電平向高電平跳變,產生終止信號。主機通過發送終止信號,結束數據通信。
三單字節數據的發送與接收圖6-18IIC總線數據傳輸格式四實際器件的讀寫操作圖6-19IIC總線寫從機數據圖6-20IIC總線讀從機數據五理解完整的IIC驅動程序IIC驅動程序由3個文件組成:IIC.c、IIC.h、IIC_config.h,其中驅動程序代碼存于IIC.c中,IIC.h是驅動程序的頭文件圖6-21IIC總線驅動程序在層次化體系結構中的位置4設計顯示當前時間的萬年歷圖6-22電子萬年歷一認知SD2405的寄存器寄存器——實時時鐘數據寄存器二認知BCD碼BCD碼(BinaryCodedDecimal)亦稱二-十進制碼,用4位二進制數來表示1位十進制數中的0-9,是一種二進制的數字編碼形式。BCD碼這種編碼方法利用4個位存儲1個十進制的數,使二進制和十進制之間的轉換得以快捷的進行。BCD碼又可以分為8421碼、5421碼、2421碼、余3碼和Gray碼。其中最為常用的就是8421碼,它和4位自然二進制碼相似,各位的權值位8、4、2、1,它只選用了4位二進制碼中的前10組0000-1001表示對應的十進制數0-9,余下的6組棄之不用。SD2405采用的就是BCD碼中的8421碼編碼方法,我們可以很簡單的理解這些內容,就是SD2405種從寄存器中讀出的數據高4位表示10進制的十位,低4位表示10進制的各位。例如,我們讀出的數據是23H,實際上就是十進制的23。當然,如果使用C語言進行處理,直接從IIC總線上返回的數據是16進制的23H,我們還需通過程序設計轉換為十進制的23,才好正確的顯示和進行數學處理。三使用結構體標識當前時間在C語言中,可以使用結構體(struct)來存放一組不同類型的數據,其定義形式如下:struct
結構體名{
結構體所包含的變量和數組}
結構體是一種集合,它里面包含了多個變量和數組,她們的類型可以相同,也可以不同,每個這樣的變量或數組都稱為結構體的成員變量(member)。例如,在本項目中,為了增強程序的可讀性,我們就可以定義Time結構體,并使用year、month、day、hour、minute、second、week作為其成員變量,如程序6-11所示。【程序6-11】structTime { uint8year; uint8month; uint8day; uint8hour; uint8minute; uint8second; uint8week;};Time為結構體名,它包含了5個成員變量,分別是year(年)、month(月)、day(日)、hour(小時)、minute(分鐘)、second(秒)、week(星期)。結構體成員變量的定義方式與變量和數組的定義方式是相同的,只是不能初始化。注意在大括號后面的分號“;”是不能缺少的,它是結構體定義語句的一部分。四解讀SD2405驅動程序SD2405驅動程序的頭文件,程序中首先定義了SD2405的從地址宏0x64,該地址可以從SD2405的數據手冊中查到;接下來定義結構體變量SD2405Time,用來表示當前時間;最后定義了2個函數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函數,如程序6-15所示,程序調用IIC_WriteOneByteAddressDevice向SD2405寫入數據,寫入數據的順序和讀出數據的順序相同。程序中設置小時的語句,將hour與0x80進行或運算,是為了將hour的最高為設置為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);}五再數碼管上顯示時間(1)復制模板工程,雙擊文件夾中的Program.atsln打開工程。(2)打開config.h文件,對整個工程進行設置,我們的工程中使用到的外部模塊有數碼管和SD2405,需在配置文件中予以使能。(3)由于數碼管需開啟定時器,并將定時器的時間設置為1ms,所以在本項目中,我們開啟定時0,并將定時時間設置為1ms,如程序6-17所示。【程序6-17】#defineINTERNAL_PERIPHERAL_TIMER0_MODE 1 //0: 不初始化TIMER0 //1: 定時1ms //2: 將TIEMR0初始化為快速PWM模式,由引腳PD6進行輸出(4)SD2405需使用IIC總線,我們必須對IIC總線的使用情況進行配置,先看原理圖,如圖6-23所示。在這里我們指定使用灰排線將單片機的端口C與SD2405相連接,則SD2405的SCL與單片機PC2相連接,SD2405的SDA與單片機的PC3相連接。圖6-23SD2405原理圖(5)這樣,我們就可以對IIC的配置文件進行設置了,打開IIC_config.h文件,進行如程序6-18的設置,將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)上述內容設置完畢后,我們就可以進行main.c的程序設計了,現定義全局變量,用于主函數與定時器0中斷服務程序交換信息,如程序6-19所示。在程序中,我們在定義變量u8g_DisplayPoint的同時,還對u8g_DisplayPoint進行了初始化,讓其第3、5、7位顯示小數點,其余位不顯示小數點,以方便將時間各位隔開,以增強數碼管的可讀性。【程序6-19】//定義全局變量uint8u8g_DisplayString[8];uint8u8g_DisplayPoint[8]={0,0,0,1,0,1,0,1};(7)接下來,我們在定時器0的中斷服務函數中,完成對數碼管的調用,如程序6-20所示,這些程序已經在上一個項目中給大家介紹過,如果忘記了,復習一下就好。【程序6-20】//定時器0溢出中斷服務處理函數#ifINTERNAL_PERIPHERAL_TIMER0_MODE!=0ISR(TIMER0_OVF_vect){ #ifINTERNAL_PERIPHERAL_TIMER0_MODE==1 //在此完成邏輯內容 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)最后,我們完成主循環里的程序,如程序6-21所示。在循環中,首先讀取SD2405的時間到變量SD2405Time中,然后將其賦值給u8g_DisplayString數組,u8g_DisplayString的0-3位顯示年,5-6位顯示月,7-8位顯示日,并延時1秒,讓使用者能夠看清楚。接下來,再次讀取SD2405的時間到變量SD2405Time,并將中的數值賦值給u8g_DisplayString數組,第0位顯示星期,2-3位顯示小時,5-6位顯示分鐘,7-8位顯示秒。【程序6-21】while(1) { /* **********************************
在這里完成自己的項目邏輯 ********************************** */ 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); /* **********************************
喂狗語句,大部分工程項目都不應去除 ********************************** */ #ifINTERNAL_PERIPHERAL_WDT_MODE!=0
TARGET_WatchDogReset(); #endif }(9)完成程序的代碼后,我們對程序進行編譯,然后用下載器將編譯后的映像文件下載到教學開發板中,如果一切順利的話,我們應該能夠看到教學開發板的數碼管交替顯示年-月-日,星期-時-分-秒。(10)還是為了保證讀者在閱讀上的完整性,我們將main.c的所有程序,在這里給大家列出,如程序6-22所示。【程序6-22】//加入包含文件#include"../include.h"
//定義系統常量
//定義全局變量uint8u8g_DisplayString[8];uint8u8g_DisplayPoint[8]={0,0,0,1,0,1,0,1};
//主程序intmain(void){ //定義局部變量 uint8i; //目標板初始化,該函數會自動初始化相應的外設文件
TARGET_Init(); //初始化全局變量
//在上電時,執行的相應操作 //后臺主循環while(1) { /* **********************************
在這里完成自己的項目邏輯 ********************************** */ 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);/* **********************************
喂狗語句,大部分工程項目都不應去除 ********************************** */ #ifINTERNAL_PERIPHERAL_WDT_MODE!=0
TARGET_WatchDogReset(); #endif } return0; //永不執行}
//串口0接收中斷服務處理函數,接收到的數據存儲在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溢出中斷服務處理函數#ifINTERNAL_PERIPHERAL_TIMER0_MODE!=0ISR(TIMER0_OVF_vect){ #ifINTERNAL_PERIPHERAL_TIMER0_MODE==1 //在此完成邏輯內容 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
//定時器1溢出中斷服務處理函數#ifINTERNAL_PERIPHERAL_TIMER1_MODE!=0ISR(TIMER1_OVF_vect){ //在此完成邏輯內容
//為了提高運行速度,將此語句寫在中斷服務處理函數里,用戶在使用時,可不理會下列語句 TCNT1H=TIMER1_TCNT1H; TCNT1L=TIMER1_TCNT1L;}#endif//外部中斷0中斷服務處理函數#ifINTERNAL_PERIPHERAL_INT0_MODE!=0ISR(INT0_vect){ //如果使用了CH432T,則調用相應的中斷處理函數 #ifEXTERNAL_MODULE_CH432T_MODE!=0 CH432T_INT(); #endif}#endif//外部中斷1中斷服務處理函數#ifINTERNAL_PERIPHERAL_INT1_MODE!=0ISR(INT1_vect){ //如果使用了CH432T,則調用相應的中斷處理函數 #ifEXTERNAL_MODULE_CH432T_MODE!=0 CH432T_INT(); #endif}#endif//CH432T擴展串口0,接收調用函數#ifEXTERNAL_MODULE_CH432T_MODE!=0voidCH432T_Uart0(uint8u8_UartData){ #ifPROTOCOL_MINIUART_CH432T_UART0_MODE!=0
miniUART_UartInterrupt(&miniUART_CH432T_UART0,u8_UartData); #endif}#endif
//CH432T擴展串口1,接收調用函數#ifEXTERNAL_MODULE_CH432T_MODE!=0voidCH432T_Uart1(uint8u8_UartData){ #ifPROTOCOL_MINIUART_CH432T_UART1_MODE!=0
miniUART_UartInterrupt(&miniUART_CH432T_UART1,u8_UartData); #endif}#endif
山東電子職業技術學院電子與通信工程系單片機程序設計與應用課程組項目7:異步串行通信——與計算機之間傳遞信息1理解數據通信的基本概念目錄2認知通用異步串行總線3操縱單片機中的UART4修正萬年歷的時間1理解數據通信的基本概念圖7-4貝爾與電話一數據通信
數據通信是為了實現計算機與計算機或終端與計算機之間的信息交互而產生的一種通信技術。典型的數據通信系統可以用下面的等式來描述,即:數據通信=數據處理+數據傳輸圖7-5數據通信系統組成結構圖數據通信系統的組成結構圖如圖7-5所示,數據源是數據的產生者或發送者,數據宿是數據的接收者和數據的終點,它們是各種類型的計算機系統或終端設備,統稱為數據終端設備。傳輸信道分為模擬信道和數字信道兩種,模擬系統只能傳輸連續的模擬信號,如早期的電話網等。數字信道傳輸離散的數字信號,即由二進制碼構成的數字序列。數據信號要在信道上傳輸,必須采用信號變換設備。對模擬信道,信號變換設備即調制解調器,它把計算機或終端送來的數據信號變換為模擬信號再送往信道,或者反過來把信道送來的模擬信號變換為數據信號再送到計算機或終端。對數字信道,信號變換設備即接口設備,其作用是實現信號碼型與電平的轉換,信道特性的均衡,收發時鐘的形成與供給以及碼速控制等。二認知數據通信有線傳輸媒介(1)雙絞線雙絞線是由兩條相互絕緣的銅導線扭絞起來構成的一對線,而作為一條通信線路,其結構示意圖如圖7-7所示。采用這樣的扭絞結構可以大幅度提高線路的抗干擾能力,它一般作為建筑物內一種有效但低價的傳輸介質。圖7-7雙絞線結構示意圖二認知數據通信有線傳輸媒介(2)同軸電纜圖7-8同軸電纜結構示意圖同軸電纜也像雙腳線那樣由一對導體組成,但它們是按同軸的形式構成先對,其結構如圖7-8所示。其中最里層是內導體,外包一層絕緣體,外面再套一個空心的圓柱形外導體,最外層是起保護作用的塑料外皮,內導體和外導體構成一組線對。單根同軸電纜直徑約為0.5-2.5cm,由于同軸電纜的外導體是接地的,所以同軸電纜具有較好的抗干擾能力。
同軸電纜與雙絞線相比價格稍貴,但因其具有帶寬寬、數據傳輸速率高、傳輸距離長、抗干擾能力強等優點,是用途非常廣泛的傳輸介質,現已被廣泛用于較高速率和較高頻率的數據傳輸中,如長距離電報、電話傳輸、有限電視、局域網絡和短距離系統連接的通信線路中。二認知數據通信有線傳輸媒介(3)電力線圖7-9電力線載波通信技術電力線載波通信技術(PowerLineCommunication),簡稱PLC,是利用電力線傳輸數據和媒體信號的一種通信方式,該技術把載有信息數據的高頻信號加載于電力線上進行傳輸,接收方把高頻信號分離出來再傳至計算機或終端等設備,以實現信息的傳遞。電力線載波通信技術的優點是不需要重新架設網絡,只要有電線,就可以進行數據傳輸,但其也存在著只能再一個配電變壓器區域范圍內傳送,一般只能在單相電力線上傳輸等不足點。二認知數據通信有線傳輸媒介(4)電話線
利用現有的電話進行數據通信是一種非常經濟的通信方式,它具有造價低、可以同時傳送語音信號和數據信號等諸多優點。但是在遠程數據通信上,存在傳輸線上的分布電容導致數據波形失真等問題。這是因為兩條電話線間的絕緣材料導致分布電容的存在,線路越長分布電容越大,造成信號之間的串擾,所以電話線傳輸距離和傳輸速度上都受限制。二認知數據通信有線傳輸媒介(5)波導線圖7-11波導管通信技術如果發送頻率足夠高,那么信號的電磁成分可在自由空間傳播,從而不需要任何實際道題。盡管如此,為避免由于信號擴散而引起的干擾和損耗,同時為了使信號沿需要的路由傳輸,我們把這線電磁波禁閉在一種有界媒質中,這就是波導管。通常,波導管被用來把微波發射器和接受器連接到它們的天線,其工作頻率為200-110000MHz。二認知數據通信有線傳輸媒介(6)光纖圖7-12光纖管通信技術光纖就是光導纖維的簡稱,是傳送光信號的媒介。光纖通信的主要優點有:頻率寬,通信量大;在很寬的頻帶范圍內,光纖對各頻率的傳輸損耗和色散幾乎不等,不需要在接收端和中繼站采取幅度或時延等均衡措施;不受電磁干擾和靜電干擾的影響,即在同一根光纜中,臨近各根光纖之間幾乎沒有串擾;構成光纖的主要原料是石英,石英的資源豐富且價格便宜;保密性好、線徑細、體積小、重量輕、損耗小、誤碼率低等特點。光纖已經成為當今重要的傳輸媒質之一,為數字和計算機通信網的迅速發展提供了良好的傳輸環境。三認知數據通信無線傳輸媒介所謂無線傳輸媒質,是指無須架設或鋪埋電纜或光纜,而通過自由空間、將電信號轉換為無線電波進行傳送。發送端把待傳的信息轉換為無線電信號,依靠無線電波在空間傳播,而接收端則把無線信號還原成發生哦難關所傳遞的信號。頻段名稱主要應用30-300KHzLF(低頻)長波導航300KHz-3MHzMF(中頻)中波商用調幅無線電3-30MHzHF(高頻)短波短波無線電30-300MHzVHF(甚高頻)超短波甚高頻電視,調頻無線電300MHz-3GHzUHF(超高頻)微波超高頻電視,地面微波3-30GHzSHF(特高頻)地面微波,衛星微波30-300GHzEHF(極高頻)實驗用點點通信(1)短波通信圖7-13短波通信技術(2)微波通信圖7-14微波通信技術微波通信分為模擬微波通信和數字微波通信兩種,模擬微波通信采用調頻制,數字微波通信采用相移鍵控。微波通信的傳輸質量比較穩定,影響質量的主要因素是雨雪天氣對微波產生的吸收損耗,不利地形或環境對微波造成的衰落現象。微波通信以其成本低、中繼距離遠等優點,成為長途通信的主要手段之一。(3)衛星通信圖7-15衛星通信技術衛星通信就是地球上的無線電通信站之間利用人造衛星作中繼站而進行的通信。人造衛星已成為當今通信的重要媒質之一,通信衛星被發射到地球赤道上空36000km的靜止軌道上,利用衛星上的通信轉發器,可以接收由陸地衛星地球站發射的信號。該信號經過放大、變頻后,轉發到其它的地球站,從而完成地球站之間的傳輸。一個衛星可以覆蓋地球表面1/3地區,所以衛星通信具有頻帶寬,通信容量大,中繼站少等諸多優點,并且兩個地球站間的直接通信距離可達13000km,所以衛星通信已經成為當今長途通信的主要手段之一,也是計算機通信的良好媒質之一。(4)激光通信圖7-16激光通信技術
激光通信是利用激光傳輸信息的通信方式,激光是一種新型光源,具有亮度高、方向性強、單色性好、相干性強等特征。它具有通信容量大、不受電磁干擾、保密性強、設備輕便、機動性好等優點,但使用時光學收發天線相互對準困難,通信距離限于視距(數公里至數十公里范圍),易受氣候影響,在惡劣條件下會造成通信中斷。
激光通信中,激光光束的發散角通常在毫弧度,甚至微弧度量級,它能夠較好的解決日益嚴重的衛星件的電磁波干擾和保密問題。激光通信中的天線尺寸非常小,但其信息量巨大。此外,深空對于光波是一種無損耗、無干擾的良好傳輸介質,傳輸同樣速率的信息裝備,激光通信性價比最高。(6)散射通信圖7-18散射通信技術
散射通信是利用地面發射的無線電波在對流層散射而返回地面的一種通信方式,工作頻率范圍為100MHz-10GHz,通信距離一般為150-400km,最高可達800-1000km。
與短波通信相比,散射通信的傳輸頻帶較寬,而且通信容量大,能進行多路復用。散射通信的主要缺點是傳輸損耗的,接收信號的強度變化大,為了克服衰落現象,需要采取多種措施,如采用分級接收,加大甜心,使用大功率發射極和低噪聲接收機等,致使成本提高。散射通信由于通信容量大,不受核爆、磁暴和極光的影響,因而在軍事通信中以及無法進行微波通信的條件下,有很高的使用價值。四認知認知數據通信的傳輸模式(1)并行傳輸并行傳輸是指一個或多個字符數據在并行信道上同時傳輸的方式,并行傳輸時,一次傳輸一個或多個字符數據,速度較快,但其需要并行通道(在線路板級,我們就可以稱為并行總線),線路投資大,不適合遠距離傳輸(2)串行傳輸
串行傳輸是構成字符數據的二進制代碼序列在一條信道上以位為單位,按時間順序的傳輸方式。串行傳輸時,發送端按位發送,接收端按位接收,同時還要對所傳輸的字符加以確認,所以收發雙方要采取同步措施,否則接收端不能正確區分出所傳輸的字符,失去了通信的意義。串行傳輸速度雖慢,但是只需要一條傳輸信道,且線路投資少,易于實現,是當前現代通信發展的主要傳輸方式。(3)同步傳輸
同步傳輸方式即為位同步傳輸技術,在同步傳輸方式下,收發雙方必須建立精準的位定時信號,用以正確區分每位的數據信號。在線路板級,我們可以通過時鐘線的方式予以實現,這在項目6種已經給大家介紹過。如果只有一個信道,則必須在數據發送前加入標志序列,以完成收發雙方的同步。(4)異步傳輸
異步傳輸不需要同步信號,它以字節為傳輸單位,當發送1個字節數據時,字節前要加入“起始”信號,字節后要加入“停止”信號。傳輸時,字節可以連續發送,也可以單獨發送,兩字節之間的間隔時間可以不確定,實現起來較為簡單。本項目所使用的與計算機之間的傳輸模式就是異步串行傳輸,我們會在下一個任務中給大家進行詳細的介紹。(5)雙工通信雙工通信是對相互通信的兩臺通信設備間數據流向的描述,或者說是對一臺通信設備執行收發操作能力的描述。雙工包括全雙工、半雙工和單工,其鏈路結構如圖7-19所示。圖7-19雙工通信鏈路結構單工方式如圖7-19(a)所示,是指兩臺通信設備間數據只能再一個方向上傳送,在單工方式下,兩臺通信設備中,一臺為發送設備,另一臺為接收設備,它們之間有一臺通信線路就可以了。半雙工方式如圖7-19(b)所示,指相互通信的兩臺通信設備具有收發數據的能力,但在某一時間內它們智能執行一種操作(收或發),不能同時執行收發兩種操作。相應的,在它們之間的通信線路上可在兩個方向上傳輸數據,但在某一時間內卻智能在一個方向上傳送數據。全雙工方式如圖7-19(c)所示,指相互通信的兩臺通信設備可以同時發送和接收數據,即數據同時可在兩個方向上傳送,所以它們之間至少需要兩條通信線路。2認知異步串行總線一認知通用異步串行總線UART圖7-23UART數據格式(1)起始位
起始位約定為0,用0表示UART通信開始進行一個幀的發送。(2)數據位
在起始位之后,設置的是5-8位的數據位,UART傳輸時先從幀的最低位開始傳送,然后依次傳送直到幀的最高位,早期數據位的多少是由硬件事先確定好的,現代的UART組件數據位多少可以由軟件進行確定。(3)奇偶校驗位奇偶校驗位是用來保證數據傳輸的可靠性和正確性的,奇偶效驗位跟在數據位之后,占用了1位的空間,用來驗證接收到的數據是否正確,有奇校驗和偶校驗之分,當然,收發雙方也可以約定不使用奇偶校驗位。
奇校驗:要求UART中所需傳輸的二機制數據位和校驗位之中1的個數之和為奇數,若所需傳輸的數據位之中的1的個數之和為奇數,校驗位就設置為0;若所需傳輸的數據位之中的1的個數之和為偶數,校驗位就設置為1。
偶校驗:要求UART中所需傳輸的二機制數據位和校驗位之中1的個數之和為偶數,若所需傳輸的數據位之中的1的個數之和為奇數,校驗位就設置為1;若所需傳輸的數據位之中的1的個數之和為偶數,校驗位就設置為0。(4)停止位停止位可以設置為1位、1.5位或2位,約定為1,用來表示UART結束了1幀的傳輸。5)空閑位空閑位約定為1,用0表示UART的傳輸線上沒有數據傳輸,但在大部分情況下,UART中不設置空閑位,以追求傳輸的高效率。二認知衡量UART傳輸速率的方法(1)波特率在信息傳輸通道中,攜帶數據信息的信號單元,我們稱為碼元,每秒鐘傳輸的碼元數稱為碼元的傳輸速率,簡稱波特率。波特率是指數據信號對載波的調制速率,它用單位時間內載波調制狀態改變的次數來表示,也就是每秒鐘調制的碼元數,其單位是Baud,波特率是傳輸通道頻寬的指標。(2)比特率每秒鐘通過信道傳輸的信息量稱為位傳輸速率,也就是每秒鐘傳送的二進制位數,簡稱比特率。比特率表示有效數據的傳輸速率,用bps(b/s)來表示。(3)波特率與比特率的關系我們用例子來說明波特率與比特率的關系,例如我們需要每秒鐘傳送240個字符,每個字符格式包含10位(1個起始位,1個停止位,8個數據位),則該傳輸的碼元是字符,所以波特率為240Baud,而比特率則為240*10=2400bps。又如,我們需要每秒鐘傳送240個二進制位,這時傳輸的碼元是位,所以波特率為240Baud,而比特率也為240bps。三認知UART的總線標準接口(1)RS-232邏輯“0”時,驅動器輸出電平5-15V邏輯“0”時,驅動器接收電平>3V邏輯“1”時,驅動器輸出電平-15-5V邏輯“1”時,驅動器接收電平<-3V表7-2RS-232的電氣特性(2)RS-422RS-422是EIA公布的“平衡電壓數字接口電路的電氣特性”標準,這個標準是改善RS-232標準的電氣特性,又考慮與RS-232兼容而指定的。RS-422與RS-232的關鍵不同在于把單端輸入改為雙端差分輸入,信號地不再共用,雙方的信號地也不再接到一起。RS-422給出了對電纜、驅動器的要求,規定了雙端電氣接口形式,其標準是雙絞線傳送信號。它通過傳輸線驅動器,把邏輯電平變換為電位差;通過傳輸線接收器,由點位差轉換為邏輯電平,實現信號接收。RS-422比RS-232具有更快的傳輸速度和更遠的傳輸距離。傳輸率最大可為10Mbps,在此速率下,電纜長度允許120米。如果采用較低的傳輸速率,最大距離可達1200米。RS-422為全雙工總線,可同時進行收發操作,所以在硬件設計上將收發當作2個通道來處理,每個通道使用2條信號線,通過信號線直接電位差傳遞“0”、“1”狀態。RS-422不僅能夠實現點對點的信號傳輸,還可以實現點對多點的信號傳輸。RS-422規定驅動器輸出電平為-6至6V,接收器可以檢測到的輸入信號電平可低到200mV。(3)RS-485使用RS-422進行數據傳輸需要4條信號線,為了減少傳輸線纜的數量,EIA在RS-422的基礎上,推出了RS-485標準。RS-485采用半雙工工作模式,在某一時刻,通信雙發的兩端,只能一端進行發送操作。接口RS-232RS-422RS-485操作方式單端差動差動最大距離15米1200米1200米最大速率200kbps10Mbps10Mbps最大驅動器數目1132最大接收器數目11032接收靈敏度±3V±200mV±200mV驅動器輸出阻抗300Ω60kΩ120kΩ接收器負載阻抗3-7kΩ>4kΩ>12kΩ負載阻抗3-7kΩ100Ω60Ω表7-3RS-232、RS-422和RS-485的性能比較3操縱單片機中UART一理解UART的硬件結構圖7-27ATmega168PA的UART模塊的硬件結構二理解UART硬件驅動初始化具體流程如下:(1)程序首先定義32位變量u32_BaudRate,然后根據UART0配置宏低4位的具體數值,將u32_BaudRate設置成相應的波特率;(2)設置UCSR0B寄存器,允許UART0進行發送和接收操作,并使能接收中斷;(3)取出u32_BaudRate的低8位設置到UBRR0L寄存器中,再取出u32_BaudRate的高8位設置到UBRR0H寄存器中,這樣UART0的波特率就設置好了。(4)設置UCSR0C寄存器,將UART0設置為8位數據位和1位停止位,這種設置方式是工業現場總線最常用的設置方式。(5)取出UART0配置宏的高4位,根據其具體數值設置校驗位,至此初始化程序完成。三理解UART硬件驅動發送與接收UART硬件驅動支持3個發送函數,分別用于發送字節、發送字符串和發送帶有回車和換行的字符串。函數Uart0_SendByte的程序源碼如程序7-4所示,程序首先進入一個while循環,其退出條件是UDR0寄存器中的數據已經發送完畢。當條件滿足時,退出循環,然后將欲發送的數據送入UDR0寄存器,單片機會自動根據已經配置好的UART參數,將數據從TxD引腳發送出去。【程序7-4】voidUart0_SendByte(uint8u8_byte){ while(!(UCSR0A&(1<<UDRE0))); UDR0=u8_byte;}函數Uart0_SendString用于發送字符串信息,如程序7-5所示,在調用該函數時,將字符串的首地址作為指針傳遞給該函數。函數由while循環構成,沒循環一次,都從字符串中取出1個字符,通過調用Uart0_SendByte函數將其發送出去,然后字符串指針向后移1位,直到移至字符串的結尾字符“\0”,while循環結束。【程序7-5】voidUart0_SendString(uint8*u8_string){ while(*u8_string) { Uart0_SendByte(*u8_string); u8_string++; }}函數Uart0_SendStringPro的程序代碼如程序7-6所示,這段代碼在理解上就非常簡單了,它調用Uart0_SendString將字符串發送出去后,再補上回車換行符。【程序7-6】voidUart0_SendStringPro(uint8*u8_string){ Uart0_SendString(u8_string); Uart0_SendByte(0x0D); Uart0_SendByte(0x0A);}四在計算機上顯示實時時鐘的當前時間步驟如下:(1)復制例程6.22,我們在上一個項目的例程的基礎上,加入UART發送信息的功能。(2)打開config.h文件,對串行口進行配置,如程序7-8所示,將配置變量設置為0x0C,即波特率為115200bps,無奇偶校驗。【程序7-8】#defineINTERNAL_PERIPHERAL_UART0_MODE0x0C(3)使用PORTD與如圖7-29所示的電路圖相連接。我們使用灰排線將P8端口與P3端口連接,這樣PD0就成為了UART的發送引腳,PD1成為UART的接收引腳,PD2是IIC總線的SCL,PD3是IIC總線的SDA。圖7-29USB
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年河北建設集團招聘真題
- ③寒假提升練-專題06 電離平衡(學生版)-2025年高二化學寒假銜接講練 (人教版)
- 2025年物理考試知識總結試題及答案
- 中國物流行業市場發展現狀及前景趨勢與投資分析研究報告2025-2028版
- 中國燒烤調料行業市場發展前景及發展趨勢與投資戰略研究報告2025-2028版
- 2024年江蘇徐州醫科大學招聘專職輔導員筆試真題
- 中國消防車行業發展趨勢與投資戰略研究報告2025-2028版
- 2024年杭州鋼鐵集團有限公司總部部門招聘筆試真題
- 中國檸檬行業市場深度調研及供需與投資價值研究報告2025-2028版
- 2024年福建省康輝國際旅行社股份有限公司招聘筆試真題
- 內蒙古普通高等學校畢業生登記表
- DL∕T 1928-2018 火力發電廠氫氣系統安全運行技術導則
- 健康養老產業行業營銷策略方案
- DZ∕T 0173-2022 大地電磁測深法技術規程
- 醫療服務售后服務保證協議書
- 在線網課知慧《形勢與政策(吉林大學)》單元測試考核答案
- 樣本相關系數課件
- 三年級必讀書課外閱讀測試(附答案)
- 畢業設計論文-智能電表的設計
- 《電力人工智能訓練數據集歸集標準》標準
- 減重肥胖手術
評論
0/150
提交評論