版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 目錄</b></p><p> 摘要…………………………………………………1</p><p> 一、設計任務和要求………………………………2</p><p> 二、設計過程……………………………………………2</p><p> 三、設計流程圖……………………………………………6<
2、;/p><p> 四、源程序清單及說明……………………………………7</p><p> 五、調試過程………………………………………………11</p><p> 六、設計心得………………………………………………11</p><p> 七、參考文獻………………………………………………11</p><p><b&g
3、t; 摘要</b></p><p> 今年來,32位嵌入式系統(tǒng)發(fā)展很快,32位單片機已逐漸占領8位機的市場,并以很高的性價比贏得了越來越多的用戶的青睞。隨著科技和工藝的進步,32位單片機的優(yōu)勢會更加突顯出來,將會成為嵌入式系統(tǒng)的主流。在32位嵌入式系統(tǒng)中,基于ARM的應用占據了大部分份額。</p><p> EasyARM2131開發(fā)板是廣州周立功公司設計的EasyARM
4、系列開發(fā)套件之一,采用了PHILIPS公司基于ARM7TDMI-S 核、單電源供電、LQFP64封裝的LPC2131,具有JTAG仿真調試、ISP編程等功能。</p><p> 本次設計是采用LPC2138的32位芯片設計的可調萬年歷,具有調時、調分,60秒倒計時和準點報時的功能。同時當倒計時至0時,LED亮;采用的是PWM輸出音樂準點報時。</p><p> 關鍵詞:ARM
5、LPC2138 LED PWM</p><p> 一、設計任務和要求:</p><p><b> 1、 課程設計目的</b></p><p> (1) 了解嵌入式芯片的工作原理,從而學會制作相關的東西。</p><p> (2) 通過課程設計進一步的了解各種在設計中常用到的程序的作用及程序的調試方法。<
6、;/p><p> (3) 進一步了解嵌入式系統(tǒng)以及嵌入式在實際生活中的應用</p><p><b> 2、 課程設計要求</b></p><p> (1) 本次設計要包含ARM板上的幾個模塊</p><p> (2) 本次設計要有一定有實際意義(有應用價值)</p><p><b>
7、 二、設計過程: </b></p><p> 本設計實現(xiàn)了時鐘、星期、日期(月、日)的顯示,校時校分,60秒倒計時以及準點報時等功能。各功能原理描述如下:</p><p> ?。ㄒ唬?、時鐘、星期、日期(月、日)的顯示:</p><p> LPC2138的RTC時鐘可由獨立的32.768kHz振蕩器或基于VPB時鐘的可編程預分頻器來提供。RTC提供秒
8、、分、小時、日、月、年和星期。</p><p> RTC功能結構方框圖:</p><p> RTC包含了許多寄存器,按照功能可分:混合寄存器、時間寄存器、時間計數器、報警寄存器和預分頻器。</p><p> 如下圖所示,設置時鐘控制寄存器(CCR)可以選擇RTC的計數時鐘,實時時鐘CTC計數器的時鐘源使用由PCLK通過基準時鐘分頻器(PREINT、PREFRA
9、C)調整出的 32768Hz時鐘信號,或者直接使用獨立的外部 32.768KHz振蕩器產生的時鐘信號。CTC是一個 15 位的計數器,它位于秒計數器之前,CTC每秒計數 32768個時鐘;當有CTC秒進位時,完整時間CTME0~2、RTC時間寄存器(如SEC、MIN等)將會更新。RTC時鐘控制寄存器CCR用于使能實時時鐘和CTC復位控制等。</p><p> ?。ǘ?、校時校分:</p><
10、p> 本功能采用按鍵控制。EasyARM2131開發(fā)板上的6個按鍵,電路圖如下圖所示:</p><p> 先要設置IODIR使口線成為輸入方式,然后讀取IOPIN的值,判斷是否有鍵按下,若KEY1按下,則小時計數器HOUR加1,若KEY2按下,則分鐘計數器加1,從而實現(xiàn)了校時校分的功能。</p><p> (三)、60秒倒計時:</p><p> 定義
11、一個外部變量yhy且初始值為59,當RTC產生增量中斷時,yhy減1。當yhy為0時,8個LED全亮,否則全暗。再賦予yhy等于59進行下一次倒計時。Yhy的顯示取代RTC的年。即RTC顯示年的四個數碼管中選兩個用來顯示yhy的值。Yhy的值將和秒、分、日、月、星期一起送到上位機顯示。</p><p> EasyARM2131開發(fā)板上的8路LED(LED8~LED1)分別可選擇P1[25:18]進行控制。當跳線
12、JP12全部選擇LED8~LED1后,P1.25~P1.18分別控制這8路LED。當P1[25:18]都輸出低電平時,8個 LED點亮,當P1[25:18]都輸出高電平時,8個LED熄滅。實驗程序首先設置管腳連接GPIO,接著設置P1[25:18]口為輸出模式,然后通過IO1CLR和IO1SET控制P1[25:18],驅動8個LED的亮滅, </p><p> 8路LED電路如下圖所示:</p>
13、<p><b> ?。ㄋ模?、準點報時:</b></p><p> 當時鐘計數至準點時,PWM2輸出音樂,報時時間為15秒。</p><p> LPC2138的脈寬調制器(PWM)建立在標準定時器0/1之上。兩個匹配寄存器可用控制單邊沿PWM輸出。PWMMR0控制PWM周期率,另一個匹配寄存器(PWMMR1~PWMMR6)控制PWM邊沿的位置。每個額外的單
14、邊沿PWM輸出只需要一個匹配寄存器,因為所有PWM輸出的重復率速率是相同的。多個單邊沿控制PWM輸出在每個PWM周期的開始,當PWMMR0發(fā)生匹配時,都有一個上升沿。</p><p> 通過改變PWMMR0的值,可以改變PWM輸出的頻率。實驗設定PWM輸出單邊沿PWM方波,控制蜂鳴器BEEP發(fā)聲,改變PWM的頻率,蜂鳴器發(fā)出不同頻率的聲音。進行PWM音樂輸出實驗,需要了解一些簡譜和頻率的關系。</p>
15、;<p> 單邊沿控制PWM輸出規(guī)則示意圖:</p><p> PWM輸出音樂流程圖:</p><p><b> 三、設計流程圖:</b></p><p> 四、源程序清單及說明:</p><p> #include "config.h"</p><p>
16、; #include "music.h"</p><p> const uint32 KEY1 = 1 << 16;// P0.16連接KEY1</p><p> const uint32 KEY3 = 1 << 18;// P0.18連接KEY3</p><p> const uint32 LEDS8 =
17、 (0XFF << 18);// P1[25:18]控制LED8~LED1,低電平點亮 </p><p> int yhy=59;</p><p> uint8 hour_flag=0;</p><p> // 定義串口模式設置的數據結構</p><p> typedef struct UartMode</p&g
18、t;<p> {uint8 datab;// 字長度 5/6/7/8</p><p> uint8 stopb;// 停止位 1/2</p><p> uint8 parity;// 奇偶校驗 0-無校驗, 1-奇校驗, 2-偶校驗</p><p> } UARTMODE;</p><p> /* 歌曲曲譜
19、 - 虹彩妹妹*/</p><p> const uint32 HCMM[] =</p><p> {_LA, _SO, _MI, _LA, _SO, _MI,</p><p> _LA, _LA, _SO, _LA,</p><p> _LA, _SO, _MI, _LA, _SO, _MI,</p><p&g
20、t;<b> };</b></p><p> /* 歌曲節(jié)拍 */</p><p> const uint32 HCMM_L[] =</p><p> {_4, _8, _8, _4, _8, _8,</p><p> _8, _4, _8, _2,</p><p> _4, _8,
21、 _8, _4, _8, _8,</p><p><b> };</b></p><p> /******************************************************************************</p><p> **函數名稱 :UART0_Init()</p><
22、;p> ** 函數功能 :初始化串口:設置工作模式和波特率。</p><p> ******************************************************************************/</p><p> uint8 UART0_Init (uint32 baud, UARTMODE set)</p><p
23、> {uint32 bak;</p><p><b> // 參數過濾</b></p><p> if ((0 == baud) || (baud > 115200))return (0);</p><p> if ((set.datab < 5) || (set.datab > 8))return (0)
24、;</p><p> if ((0 == set.stopb) || (set.stopb > 2)) return (0);</p><p> if (set.parity > 4)return (0);</p><p> // 設置串口波特率</p><p> U0LCR = 0x80;// DLAB=1<
25、/p><p> bak = (Fpclk >> 4) / baud;</p><p> U0DLM = bak >> 8;</p><p> U0DLL = bak & 0xff;</p><p><b> // 設置串口模式</b></p><p> bak
26、 = set.datab - 5;</p><p> if (2 == set.stopb)bak |= 0x04;</p><p> if (0 != set.parity)</p><p> {set.parity = set.parity - 1;</p><p> bak |= 0x08;</p><
27、p><b> }</b></p><p> bak |= set.parity << 4;</p><p> U0LCR = bak;</p><p> return (0);</p><p><b> }</b></p><p> /*****
28、*************************************************************************</p><p> ** 函數名稱 :SendByte()</p><p> ** 函數功能 :向串口UART0發(fā)送字節(jié)數據,并等待發(fā)送完畢。</p><p> ***************************
29、***************************************************/</p><p> void SendByte (uint8 data)</p><p> {U0THR = data;</p><p> while ((U0LSR & 0X20) == 0);// 等待數據發(fā)送</p><
30、p><b> }</b></p><p> /******************************************************************************</p><p> ** 函數名稱 :PC_DispChar()</p><p> ** 函數功能 :向PC機發(fā)送顯示字符。<
31、;/p><p> ******************************************************************************/</p><p> void PC_DispChar (uint8 no, uint8 chr)</p><p> {SendByte(0xff);</p><p>
32、; SendByte(0x81);</p><p> SendByte(no);</p><p> SendByte(chr);</p><p> SendByte(0x00);</p><p><b> }</b></p><p> uint8 const SHOWTABLE[10]
33、 = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};</p><p> /******************************************************************************</p><p> ** 函數名稱 :SendTimeRtc()</p><p&
34、gt; ** 函數功能 :讀取RTC的時間值,并將讀出的時分秒值通過串口送到上位機顯示。</p><p> ******************************************************************************/</p><p> void SendTimeRtc (void)</p><p> {ui
35、nt32 datas;</p><p> uint32 times;</p><p> uint32 bak;</p><p> times = CTIME0;// 讀取完整的時鐘寄存器</p><p> datas = CTIME1;</p><p> PC_DispChar(1, SHOWTABLE
36、[yhy/10]);</p><p> PC_DispChar(2, SHOWTABLE[yhy % 10]);</p><p> bak = (datas >> 8) & 0x0f;// 獲取 月</p><p> PC_DispChar(4, SHOWTABLE[bak / 10]);</p><p> P
37、C_DispChar(5, SHOWTABLE[bak % 10]);</p><p> bak = datas & 0x1f;// 獲取 日</p><p> PC_DispChar(6, SHOWTABLE[bak / 10]);</p><p> PC_DispChar(7, SHOWTABLE[bak % 10]);</p>
38、<p> bak = (times >> 24) & 0x07;// 獲取 星期</p><p> PC_DispChar(8, SHOWTABLE[bak]);</p><p> bak = (times >> 16) & 0x1f;// 獲取 小時</p><p> PC_DispChar(9
39、, SHOWTABLE[bak / 10]);</p><p> PC_DispChar(10, SHOWTABLE[bak % 10]);</p><p> bak = (times >> 8) & 0x3f;// 獲取 分鐘</p><p> PC_DispChar(11, SHOWTABLE[bak / 10]);</p&g
40、t;<p> PC_DispChar(12, SHOWTABLE[bak % 10]);</p><p> bak = times & 0x3f;// 獲取 秒鐘</p><p> PC_DispChar(13, SHOWTABLE[bak / 10]);</p><p> PC_DispChar(14, SHOWTABLE[b
41、ak % 10]);</p><p><b> }</b></p><p> /******************************************************************************</p><p> ** 函數名稱 :DelayNS()</p><p> *
42、* 函數功能 :長軟件延時</p><p> ******************************************************************************/</p><p> void DelayNS (uint32 dly)</p><p> {uint32 i;</p><p>
43、for ( ; dly>0; dly--)</p><p> for (i=0; i<500000; i++);</p><p><b> }</b></p><p> /******************************************************************************
44、</p><p> ** 函數名稱 :RTCInit()</p><p> ** 函數功能 :初始化實時時鐘</p><p> ******************************************************************************/</p><p> void RTCInit (v
45、oid)</p><p> {PREINT = Fpclk / 32768 - 1; // 設置基準時鐘分頻器</p><p> PREFRAC = Fpclk - (Fpclk / 32768) * 32768;</p><p> CCR = 0x00; // 禁止時間計
46、數器</p><p> MONTH = 01;</p><p> DOM = 10;</p><p> DOW = 4;</p><p> HOUR = 8;</p><p> MIN =59;</p><p> SEC = 50;</p><p
47、> CIIR = 0x01;// 設置秒值的增量產生1次中斷</p><p> CCR = 0x01;// 啟動RTC</p><p><b> }</b></p><p> /**************************************************************************
48、****</p><p> ** 函數名稱 :main()</p><p> ** 函數功能 :讀取實時時鐘的值,通過串口發(fā)送出去。</p><p> ******************************************************************************/</p><p> int
49、 main (void)</p><p> uint8 s_cnt=0; </p><p> UARTMODE uart0_set;</p><p> PINSEL0 = 0x00000005; // 連接IO到UART0</p><p> PINSEL1 = 0x00000000;</p><p>
50、 PINSEL2 = PINSEL2 & (~0x08);// P1[25:16]連接GPIO</p><p> IO1DIR = LEDS8;// 設置LEDS8控制口為輸出</p><p> uart0_set.datab = 8;</p><p> uart0_set.stopb = 1;</p><p> u
51、art0_set.parity = 0;</p><p> UART0_Init(115200, uart0_set);</p><p> U0FCR = 0x01;// FIFO使能</p><p> /* PWM初始化 */</p><p> PWMPR = 0x00; // 不分頻,計數頻率為Fpclk&l
52、t;/p><p> PWMMCR = 0x02;// 設置PWMMR0匹配時復位PWMTC</p><p> PWMPCR = 0x0400;// 允許PWM2輸出,單邊PWM</p><p> PWMMR0 = Fpclk / 450;</p><p> PWMMR2 = PWMMR0 / 2;// 50
53、%占空比</p><p> PWMLER = 0x05;// PWM0和PWM2匹配鎖存</p><p> PWMTCR = 0x02; // 復位PWMTC</p><p> RTCInit();</p><p><b> while (1)</b></p><
54、;p> { if ((IO0PIN & KEY1) == 0) </p><p> { CCR = 0x00; // 禁止時間計數器</p><p> DelayNS(1);</p><p> HOUR=(HOUR+1)%24; // 如果KEY1按下,</p><p&g
55、t; CCR = 0x01; // 啟動RTC</p><p><b> }</b></p><p> if ((IO0PIN & KEY3) == 0) </p><p> { CCR = 0x00; // 禁止時間計數器</p><p>
56、 DelayNS(1);</p><p> MIN=(MIN+1)%60; // 如果KEY3按下,</p><p> CCR = 0x01; // 啟動RTC</p><p><b> }</b></p><p> while (0 == (ILR & 0x01))
57、// 等待RTC增量中斷</p><p> { if((SEC==0)&&(MIN==0))</p><p> { hour_flag=1;}</p><p><b> } </b></p><p> ILR = 0x01;// 清除中斷標志</p><p>
58、 yhy=yhy-1;</p><p> if(yhy==0)</p><p> IO1CLR = LEDS8;// 8個LED點亮</p><p><b> else </b></p><p> IO1SET = LEDS8;// 8個LED熄滅 </p><p>
59、 if(yhy==(-1))</p><p><b> yhy=59;</b></p><p> SendTimeRtc();</p><p> if (hour_flag) //每秒一次</p><p> { if (s_cnt<16)</p><p>
60、; { PINSEL0 = 0x00000005 | (0x02 << 14);// 連接IO到UART0</p><p> PWMMR0 = Fpclk / HCMM[s_cnt]; // 設置輸出頻率</p><p> PWMTCR = 0x09; // 啟動PWM輸出</p><p&g
61、t; PWMLER = 0x05; // 更新匹配值后,必須鎖存</p><p><b> s_cnt++;</b></p><p><b> }</b></p><p><b> else</b></p><p> { PINSEL
62、0 = 0x00000005 ; // 連接IO到UART0</p><p><b> s_cnt=0;</b></p><p> hour_flag=0;</p><p><b> }</b></p><p><b> }</b></p>
63、;<p><b> }</b></p><p> return (0);</p><p><b> }</b></p><p> /********************************************************************************
64、 End Of File</p><p> *******************************************************************************</p><p> 修改,即引入外部變量yhy來代替年份的顯示即每次增量中斷產生時yhy減1。將修改的程序進行編譯然后下載到芯片,然后運行。觀
65、察開發(fā)板的現(xiàn)象,看是否能五、調試過程:</p><p> 整個設計的調試過程是分步進行的。</p><p> 1)、 60秒倒計時的調試:對深入淺出ARM7課本中的萬年歷源程序進行實現(xiàn)倒計時功能。倒計時功能實現(xiàn)后再添加LED的提示,即當倒計時至0時所有LED亮否則滅。同樣將添加好的程序進行編譯并下載到芯片,然后運行,觀察開發(fā)板現(xiàn)象看看是否能實現(xiàn)所需功能。這一項相對簡單,所以調試過程也
66、很快成功。</p><p> 2)、 校時、校分的調試:在能夠實現(xiàn)倒計時功能的程序中添加校時校分的程序。KEY1按下計數器停止計數小時(HOUR)加1,KEY3按下計數器停止計數分鐘(MIN)加1。程序添加完之后編譯,編譯無錯之后下載到芯片,然后運行。按下KEY1或KEY3,觀察是否能實現(xiàn)所需功能。這個過程運用到了按鍵,所以存在一個消抖的問題,若消抖不合理可能可能會造成按鍵按一下,小時或分鐘可能不止加1。&
67、lt;/p><p> 3)、 準點報時:在前面的程序當中添加準點報時的程序。準點報時采用的是PWM2輸出15秒的音樂。先將PWM2輸出音樂的程序單獨調試運行,反復修改頻率直至輸出音樂達到最好的效果。然后將程序添加到前面的程序當中。這個過程遇到了一個問題:當PWM2輸出音樂的時候計數器會停止計數。說明添加不合理。將流程圖重新畫了一遍,再引入了一個標志位,反復修改程序并調試,直至準點報時的時候計數器仍能計數。具體見
68、源程序。</p><p><b> 六、設計心得:</b></p><p> 在實訓的這五天里,前三天老師每天上午都在講課,我基本都聽不懂,感覺自己都學得好差。下午在圖書館查找資料,形成設計思想,寫出大概的程序。最后兩天時間就是呆在實驗室,經常忘了時間,在實驗室反復修改,調試。與同學相互討論,咨詢老師。在此,我要特別感謝我的同學廖艷霞和華永金,還有指導老師涂老師,
69、謝謝他們的指點。</p><p> 通過這次實訓,感覺自己的動手能力還有待提高,當然,在這次實訓中,我能夠獨立的思考。以前摸棱兩可的知識變得更加清晰了。對ARM7感覺沒有以前那么恐怖了。這門課程的學習最主要的還是自學,終于理解師傅領進門,修行在個人著句話了。</p><p><b> 七、參考文獻:</b></p><p> [1]:周立
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論