欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4377|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

LPC2000系列ARM芯片的電子琴的設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:570925 發(fā)表于 2019-6-24 16:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1.用LPC2000系列ARM芯片設(shè)計(jì)電子琴,用proteus軟件仿真。
2.按下不同的按鍵,揚(yáng)聲器能夠發(fā)出不同的音調(diào)。
3.用PWM控制揚(yáng)聲器可以實(shí)現(xiàn)音調(diào)的條件。

通過(guò)編程,利用按鍵去控制揚(yáng)聲器的發(fā)聲。
    通過(guò)小組討論分析,結(jié)合設(shè)計(jì)電路性能指標(biāo)、器件的性?xún)r(jià)比,本設(shè)計(jì)電路選擇方案二。
  • 硬件設(shè)計(jì)與介紹
嵌入式的定義:
從技術(shù)的角度定義:以應(yīng)用為中心、以計(jì)算機(jī)技術(shù)為基礎(chǔ)、軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗嚴(yán)格要求的專(zhuān)用計(jì)算機(jī)系統(tǒng)。
    從系統(tǒng)的角度定義:嵌入式系統(tǒng)是設(shè)計(jì)完成復(fù)雜功能的硬件和軟件,并使其緊密耦合在一起的計(jì)算機(jī)系統(tǒng)。術(shù)語(yǔ)嵌入式反映了這些系統(tǒng)通常是更大系統(tǒng)中的一個(gè)完整的部分,稱(chēng)為嵌入的系統(tǒng)。嵌入的系統(tǒng)中可以共存多個(gè)嵌入式系統(tǒng)。
     3.1 213X系列最小系統(tǒng)板介紹:
LPC2131/2132/2138 是基于一個(gè)支持實(shí)時(shí)仿真和嵌入式跟蹤的32/16ARM7TDMI-STM CPU 的微控制器,并帶有32kB、64kB、512 kB 的嵌入的高速Flash 存儲(chǔ)器。128 位寬度的存儲(chǔ)器接口和獨(dú)特的加速結(jié)構(gòu)使32 位代碼能夠在最大時(shí)鐘速率下運(yùn)行。對(duì)代碼規(guī)模有嚴(yán)格控制的應(yīng)用可使用16 位Thumb模式將代碼規(guī)模降低超過(guò)30%,而性能的損失卻很小。
較小的封裝和極低的功耗使 LPC2131/2132/2138 可理想地用于小型系統(tǒng)中,如訪(fǎng)問(wèn)控制和POS 機(jī)。寬范圍的串行通信接口和片內(nèi)8/16/32kB的SRAM使LPC2131/2132/2138 非常適用于通信網(wǎng)關(guān)、協(xié)議轉(zhuǎn)換器、軟modem、聲音辨別和低端成像,為它們提供巨大的緩沖區(qū)空間和強(qiáng)大的處理功能。多個(gè)32位定時(shí)器、1個(gè)或2 個(gè)10 位8 路ADC、10 位DAC、PWM 通道和47個(gè)GPIO 以及多達(dá)9個(gè)邊沿或電平觸發(fā)的外部中斷使它們特別適用于工業(yè)控制和醫(yī)療系統(tǒng)。
主要特性如下:
(1)16/32位ARM7TDMI-S核,超小LQFP64封裝。  ??
(2)8/16/32kB的片內(nèi)靜態(tài)RAM和32/64/128/256/512kB的片內(nèi)Flash程序存儲(chǔ)器。128位寬度接口/加速器可實(shí)現(xiàn)高達(dá)60MHz工作頻率。  ??
(3)通過(guò)片內(nèi)boot裝載程序?qū)崿F(xiàn)在系統(tǒng)編程/在應(yīng)用編程(ISP/IAP)。單個(gè)Flash扇區(qū)或整片擦除時(shí)間 為400ms。256字節(jié)行編程時(shí)間為1ms。  ??
(4)EmbeddedICE RT和嵌入式跟蹤接口通過(guò)片內(nèi)RealMonitor軟件對(duì)代碼進(jìn)行實(shí)時(shí)調(diào)試和高速跟蹤。 ??
(5)1個(gè)(LPC2131/32)或2個(gè)(LPC2134/36/38)8路10位的A/D轉(zhuǎn)換器,共提供16路模擬輸入,每個(gè)通道的轉(zhuǎn)換時(shí)間低至2.44us。  ??
(6)1個(gè)10位的D/A轉(zhuǎn)換器,可產(chǎn)生不同的模擬輸出。(LPC2132/34/36/38)  ?? (7)2個(gè)32位定時(shí)器/外部事件計(jì)數(shù)器(帶4路捕獲和4路比較通道)、PWM單元(6路輸出)和看門(mén)狗。  ??
(8)低功耗實(shí)時(shí)時(shí)鐘具有獨(dú)立的電源和特定的32kHz時(shí)鐘輸入。  ??
(9)多個(gè)串行接口,包括2個(gè)16C550工業(yè)標(biāo)準(zhǔn)UART、2個(gè)高速I(mǎi)2C總線(xiàn)(400 kbit/s)、SPI和具有緩沖作用和數(shù)據(jù)長(zhǎng)度可變功能的SSP。 ??
(10)向量中斷控制器?膳渲脙(yōu)先級(jí)和向量地址。  ??
(11)小型的LQFP64封裝上包含多達(dá)47個(gè)通用I/O口(可承受5V電壓)。 ?? (12)多達(dá)9個(gè)邊沿或電平觸發(fā)的外部中斷管腳。  ??
(13)通過(guò)片內(nèi)PLL(100us的設(shè)置時(shí)間)可實(shí)現(xiàn)最大為60MHz的CPU操作頻率。  ??
(14)片內(nèi)集成振蕩器與外部晶體的操作頻率范圍為1~30 MHz,與外部振蕩器的操作頻率范圍高達(dá) 50MHz。  ??
(15)低功耗模式:空閑和掉電。  ??
(16)可通過(guò)個(gè)別使能/禁止外部功能和外圍時(shí)鐘分頻來(lái)優(yōu)化功耗。 ??
(17)通過(guò)外部中斷或BOD將處理器從掉電模式中喚醒。 ??
(18)單電源,具有上電復(fù)位(POR)和掉電檢測(cè)(BOD)電路。  ??
(19)CPU操作電壓范圍:3.0V~3.6 V (3.3 V± 10﹪),I/O口可承受5V的電壓。
3.2最小系統(tǒng)板結(jié)構(gòu)
    LPC2131/2132/2138 包含一個(gè)支持仿真的ARM7TDMI-S CPU、與片內(nèi)存儲(chǔ)器控制器接口的ARM7 局部總線(xiàn)、與中斷控制器接口的AMBA 高性能總線(xiàn)(AHB)和連接片內(nèi)外設(shè)功能的VLSI 外設(shè)總線(xiàn)(VPB,ARMAMBA 總線(xiàn)的兼容超集)。LPC2131/2132/2138 將ARM7TDMI-S 配置為小端(little-endian)字節(jié)順序。AHB 外設(shè)分配了2M 字節(jié)的地址范圍,它位于4G 字節(jié)ARM 存儲(chǔ)器空間的最頂端。每個(gè)AHB 外設(shè)都分配了16k 字節(jié)的地址空間。LPC2131/2132/2138 的外設(shè)功能(中斷控制器除外)都連接到VPB 總線(xiàn)。AHB到VPB 的橋?qū)PB 總線(xiàn)與AHB 總線(xiàn)相連。VPB 外設(shè)也分配了2M 字節(jié)的地址范圍,從3.5GB 地址點(diǎn)開(kāi)始。每個(gè)VPB 外設(shè)在VPB 地址空間內(nèi)都分配了16k 字節(jié)地址空間。
片內(nèi)外設(shè)與器件管腳的連接由管腳連接模塊控制。該模塊必須由軟件進(jìn)行控制以符合外設(shè)功能與管腳在特定應(yīng)用中的需求。
3.3 片內(nèi)FLASH程序儲(chǔ)存器
LPC2131/2132/2138 分別含有32kB、64kB 和512kB 的FLASH 存儲(chǔ)器系統(tǒng)。該存儲(chǔ)器可用作代碼和數(shù)據(jù)的存儲(chǔ)。對(duì)FLASH 存儲(chǔ)器的編程可通過(guò)幾種方法來(lái)實(shí)現(xiàn):通過(guò)內(nèi)置的串行JTAG 接口,通過(guò)在系統(tǒng)編程(ISP)和UART0,或通過(guò)在應(yīng)用編程(IAP)。使用在應(yīng)用編程的應(yīng)用程序也可以在應(yīng)用程序運(yùn)行時(shí)對(duì)FLAH 進(jìn)行擦除和/或編程,這樣就為數(shù)據(jù)存儲(chǔ)和現(xiàn)場(chǎng)固件的升級(jí)都帶來(lái)了極大的靈活性。如果LPC2131/2132/2138 使用了片內(nèi)引導(dǎo)裝載程序(bootloader),32/64/512kB 的Flash 存儲(chǔ)器就可用來(lái)存放用戶(hù)代碼。
LPC2131/2132/2138 的Flash 存儲(chǔ)器至少可擦除/編程10,000 次,保存數(shù)據(jù)的時(shí)間長(zhǎng)達(dá)10 年。
3.4 片內(nèi)靜態(tài)RAM
片內(nèi)靜態(tài)RAM(SRAM)可用作代碼和/或數(shù)據(jù)的存儲(chǔ),支持8 位、16 位和32 位的訪(fǎng)問(wèn)。LPC2131/2132/2138 含有8/16/32kB 的靜態(tài)RAM。
LPC2131/2132/2138 SRAM 是一個(gè)字節(jié)尋址的存儲(chǔ)器。對(duì)存儲(chǔ)器進(jìn)行字和半字訪(fǎng)問(wèn)時(shí)將忽略地址對(duì)準(zhǔn),訪(fǎng)問(wèn)被尋址的自然對(duì)準(zhǔn)值(因此,對(duì)存儲(chǔ)器進(jìn)行字訪(fǎng)問(wèn)時(shí)將忽略地址位0 和1,半字訪(fǎng)問(wèn)時(shí)將忽略地址位0)。
因此,有效的讀寫(xiě)操作要求半字?jǐn)?shù)據(jù)訪(fǎng)問(wèn)的地址線(xiàn)0 為0(地址以0、2、4、6、8、A、C 和E 結(jié)尾),字?jǐn)?shù)據(jù)訪(fǎng)問(wèn)的地址線(xiàn)0 和1 都為0(地址以0、4、8 和C 結(jié)尾)。該原則同樣用于片外和片內(nèi)存儲(chǔ)器。
SRAM 控制器包含一個(gè)回寫(xiě)緩沖區(qū),它用于防止CPU 在連續(xù)的寫(xiě)操作時(shí)停止運(yùn)行。回寫(xiě)緩沖區(qū)總是保存著軟件發(fā)送到SRAM 的最后一個(gè)字節(jié)。該數(shù)據(jù)只有在軟件請(qǐng)求下一次寫(xiě)操作時(shí)才寫(xiě)入SRAM(數(shù)據(jù)只有在軟件執(zhí)行另外一次寫(xiě)操作時(shí)被寫(xiě)入SRAM)。如果發(fā)生芯片復(fù)位,實(shí)際的SRAM 內(nèi)容將不會(huì)反映最近一次的寫(xiě)請(qǐng)求(即:在一次“熱”芯片復(fù)位后,SRAM 不會(huì)反映最后一次寫(xiě)入的內(nèi)容)。任何在復(fù)位后檢查SRAM 內(nèi)容的程序都必須注意這一點(diǎn)。通過(guò)對(duì)一個(gè)單元執(zhí)行兩次相同的寫(xiě)操作可保證復(fù)位后數(shù)據(jù)的寫(xiě)入。或者,也可通過(guò)在進(jìn)入空閑或掉電模式前執(zhí)行虛寫(xiě)(dummy write)操作來(lái)保證最后的數(shù)據(jù)在復(fù)位后被真正寫(xiě)入到SRAM。
3.5 存儲(chǔ)器映射概念和操作方式
LPC2131/2132/2138 的基本的概念是:每個(gè)存儲(chǔ)器組在存儲(chǔ)器映射中都有一個(gè)“物理上的”位置。它是一個(gè)地址范圍,該范圍內(nèi)可寫(xiě)入程序代碼。每一個(gè)存儲(chǔ)器空間的容量都永久固定在同一個(gè)位置,這樣就不需要將代碼設(shè)計(jì)成在不同地址范圍內(nèi)運(yùn)行。
由于ARM7 處理器上的中斷向量位置(地址0x0000 0000~0x0000 001C,見(jiàn)表2),Boot Block 和SRAM空間的一小部分需要重新映射來(lái)實(shí)現(xiàn)在不同操作模式下對(duì)中斷的使用,見(jiàn)表1。中斷的重新映射通過(guò)存儲(chǔ)器映射控制特性來(lái)實(shí)現(xiàn),詳見(jiàn)系統(tǒng)控制模塊一節(jié)。
表1:LPC2131/2132/2138 存儲(chǔ)器映射模式
模式
激活
用途
Boot裝載程序模式
由任何復(fù)位硬件激活
在任何復(fù)位后都會(huì)執(zhí)行 Boot 裝載程序。Boot Block 中斷向量映射到存儲(chǔ)器的底部以允許處理異常并在Boot 裝載過(guò)程中使用中斷。
用戶(hù)Flash模式
由Boot代碼軟件激活
當(dāng)在存儲(chǔ)器中識(shí)別了一個(gè)有效的用戶(hù)程序標(biāo)識(shí)并且Boot 裝載操作未被執(zhí)行時(shí),由Boot 裝載程序啟動(dòng)。中斷向量沒(méi)有重新映射,它位于Flash 存儲(chǔ)器的底部。
用戶(hù)RAM模式
由用戶(hù)程序軟件激活
由用戶(hù)程序激活。中斷向量重新映射到靜態(tài) RAM 的底部。
3.6 系統(tǒng)控制模塊
系統(tǒng)控制模塊功能匯總:
系統(tǒng)控制模塊包括幾個(gè)系統(tǒng)特性和控制寄存器,這些寄存器具有眾多與特定外設(shè)器件無(wú)關(guān)的功能。
1、晶體振蕩器
2、外部中斷輸入
3、存儲(chǔ)器映射控制
4、PLL
5、功率控制
6、復(fù)位
7、VPB 分頻器
8、喚醒定時(shí)器
每種類(lèi)型的功能都有其自身的寄存器,不需要的位則定義為保留位。為了滿(mǎn)足將來(lái)擴(kuò)展的需要,無(wú)關(guān)/的功能不共用相同的寄存器地址。
表2:系統(tǒng)控制模塊功能相關(guān)的管腳
管腳名稱(chēng)
管腳方向
管腳描述
X1
輸入
晶振輸入--振蕩器和內(nèi)部時(shí)鐘發(fā)生器電路的輸入
X2
輸出
晶振輸出--振蕩器放大器的輸出
EINT0
輸入
外部中斷輸入0--低有效的通用中斷輸入。該管腳可用于將處理器從空閑或掉電模式中喚醒。
P0.1和P0.16可用作EINT0 功能。
EINT1
輸入
外部中斷輸入1--見(jiàn)上面的EINT0 描述。
P0.3 和P0.14可用作EINT1 功能。
復(fù)位后管腳 P0.14上立即出現(xiàn)的低電平被看作是一個(gè)啟動(dòng)ISP 命令處理器的外部硬件請(qǐng)求
EINT2
輸入
外部中斷輸入2--見(jiàn)上面的EINT0 描述。
P0.7 和P0.15 可用作EINT2 功能。
EINT3
輸入
外部中斷輸入3--見(jiàn)上面的EINT0 描述。
P0.9,P0.20和P0.30可用作EINT3 功能。
RESET
輸入
外部復(fù)位輸入--該管腳上的低電平將芯片復(fù)位,使I/O 口和外設(shè)恢復(fù)其默認(rèn)狀態(tài),并使處理器從地址0 開(kāi)始執(zhí)行程序。
                      圖3.1 LPC2138管腳排列圖
  3.7 行列式鍵盤(pán)工作原理
ARM嵌入式系統(tǒng)使用常用的行列式鍵盤(pán)電路,此電路的優(yōu)點(diǎn)是比較節(jié)省I/0口線(xiàn),并且接口簡(jiǎn)單。它的工作模式如下圖所示。它的行線(xiàn)與按鍵的一個(gè)引腳相連,列線(xiàn)與按鍵的另一個(gè)引腳相連。平時(shí)列線(xiàn)被置成低電平,沒(méi)有按鍵被按下時(shí),行線(xiàn)保持高電平,而有按鍵被按下時(shí),行線(xiàn)被拉成低電平。如圖3.2。



圖3.2 鍵盤(pán)掃描模式
  3.8 鍵盤(pán)識(shí)別原理
對(duì)于常規(guī)的按鍵識(shí)別過(guò)程一般分為以下幾步:
(1)用IF語(yǔ)句判斷按鍵是否按下。
(2)調(diào)用延時(shí)函數(shù)延時(shí)去除按鍵抖動(dòng)。
(3)再用IF語(yǔ)句判斷是否真的按下。
(4)是真的按下,則執(zhí)行按鍵處理程序。
(5)用WHILE語(yǔ)句等待按鍵釋放。
為了考慮提高CPU的效率和充分利用CPU的資源等因素,可將第2步和第5步的延時(shí)和等待過(guò)程用其他方式代替。
  3.9鍵盤(pán)電路介紹
為了實(shí)現(xiàn)電子琴的輸入,需要擴(kuò)展鍵盤(pán)以作為控制輸入。系統(tǒng)采用LPC2138的P0.8--P0.13端口引腳作為2X4矩陣鍵盤(pán)的擴(kuò)展接口,電路原理圖如圖3.3所示。
                       圖 3.3 鍵盤(pán)電路

在擴(kuò)展鍵盤(pán)時(shí)需要解決兩個(gè)問(wèn)題,一是鍵盤(pán)的抖動(dòng),二是多鍵同時(shí)按下。鍵盤(pán)的去抖動(dòng)可通過(guò)軟件的適當(dāng)延時(shí)實(shí)現(xiàn),即在讀入端口P0.8~P0.11后,適當(dāng)延時(shí)一段時(shí)間,再讀入端口P0.12~P0.13,兩次比較后確定按鍵是否真按得下。多鍵同時(shí)按下也可通過(guò)軟件設(shè)計(jì)屏蔽多按下的鍵,對(duì)于同一列的鍵同時(shí)按下,可以只取鍵值最小的鍵,屏蔽值大的鍵,或反之。對(duì)于不同列的鍵,可以將P0.12~P0.13設(shè)置優(yōu)先級(jí),如P0.12最高,P0.13最低,或反之。這樣,只取優(yōu)先級(jí)高的鍵,屏蔽優(yōu)先級(jí)低的鍵。
在ARM中,必須將管腳置為GPIO口后才能將管腳作為I/O口的功能來(lái)使用,由于在I/O的初始化中已經(jīng)將用到的管腳設(shè)置為GPIO口,固可以將管腳作為I/O口的功能來(lái)使用。具體方法如下:
先將P0.8-P0.11這4列端口設(shè)置為輸入管腳并且置為低電平,然后將P0.12-P0.13這2行端口設(shè)置為輸出管腳并且置為高電平,通過(guò)判斷是否有按鍵按下,如果有按鍵按下則可以首先確定2行端口的代碼,接著再將4列端口設(shè)置為輸出管腳并且置為高電平,將2行端口設(shè)置為輸入管腳并且置為低電平,以此來(lái)決定4列端口的代碼,然后再講4列端口代碼和2行端口代碼按照2行為高4位,4列為低4位的順序排成一個(gè)8位代碼。
3.10 蜂鳴器驅(qū)動(dòng)電路分析
   蜂鳴器驅(qū)動(dòng)電路分析如下:
   蜂鳴器:發(fā)聲元件,在其兩端施加直流電壓(有源蜂鳴器)或者方波(無(wú)源蜂鳴器)就可以發(fā)聲,其主要參數(shù)是外形尺寸、發(fā)聲方向、工作電壓、工作頻率、工作電流、驅(qū)動(dòng)方式(直流/方波)等。這些都可以根據(jù)需要來(lái)選擇。
   續(xù)流二極管:蜂鳴器本質(zhì)上是一個(gè)感性元件,其電流不能瞬變,因此必須有一個(gè)續(xù)流二極管提供續(xù)流。否則,在蜂鳴器兩端會(huì)產(chǎn)生幾十伏的尖峰電壓,可能損壞驅(qū)動(dòng)三極管,并干擾整個(gè)電路系統(tǒng)的其它部分。
   三極管驅(qū)動(dòng)蜂鳴器電路:三極管Q1起開(kāi)關(guān)作用,其基極的高電平使三極管飽和導(dǎo)通,使蜂鳴器發(fā)聲;而基極低電平則使三極管關(guān)閉,蜂鳴器停止發(fā)聲。如圖3.4。

                        圖3.4實(shí)際選用驅(qū)動(dòng)放大電路

  3.11 整體電路圖
       如圖3.5所示。
                      圖3.5 硬件設(shè)計(jì)電路整體圖
  • 軟件設(shè)計(jì)
   1.程序流程圖如圖4.1所示。
                      圖4.1程序流程圖
  2.軟件設(shè)計(jì)程序代碼如下:
  1. /*******************************************************************************
  2. *File: Main.c
  3. *功能: 使用PWM6輸出PWM信號(hào),通過(guò)濾波電路實(shí)現(xiàn)DAC轉(zhuǎn)換.由按鍵控制PWM占空比,每按一次
  4. *      按鍵將會(huì)改變一次PWM的占空比,使蜂鳴器發(fā)出不同的音調(diào)。
  5. *******************************************************************************/
  6. #include "config.h"
  7. #define   KEY1   0x00004000        /*P0.14引腳連接KEY1*/
  8. #define   KEY2   0x00000400        /*P0.10引腳連接KEY2*/
  9. #define   KEY3   0x00000800        /*P0.11引腳連接KEY3*/
  10. #define   KEY4   0x00001000        /*P0.12引腳連接KEY4*/
  11. #define   KEY5   0x00002000        /*P0.13引腳連接KEY5*/
  12. #define   KEY6   0x00008000        /*P0.15引腳連接KEY6*/
  13. #define   KEY7   0x00010000        /*P0.16引腳連接KEY7*/
  14. #define   KEY8   0x00020000        /*P0.17引腳連接KEY8*/

  15. /*******************************************************************************
  16. *名稱(chēng): WaitKey()
  17. *功能: 等待一個(gè)有效按鍵,有去抖功能
  18. *******************************************************************************/
  19. /*void WaitKey(void)
  20. { uint32 i;

  21.   while(1)
  22.   { while((IOPIN&KEY1)!=0);                 //等待KEY1鍵按下
  23.     for(i=0;i<50;i++);                      //延時(shí)去抖
  24.     if((IOPIN&KEY1)==0)break;
  25.   }
  26.     while((IOPIN&KEY1)==0);                   //等待KEY1鍵放開(kāi)
  27. }*/
  28. void TargetInit(void);
  29. /*******************************************************************************
  30. *名稱(chēng): main()
  31. *功能: 使用PWM6輸出占空比可調(diào)的PWM波形
  32. *******************************************************************************/
  33. int main(void)
  34. { uint32  pwmdata;                        //PWM占空比控制變量
  35.   int i;
  36.   PINSEL0=0x00080000;                     //設(shè)置PWM6連接到P0.9引腳
  37.   PINSEL1=0x00000000;                     //其他引腳設(shè)置為GPIO
  38.   TargetInit();                           //PWM初始化
  39.   pwmdata=1382;
  40.   while(1)
  41.   {  PWMMR0=2765;                         //設(shè)置PWM周期
  42.      PWMMR6=pwmdata;                      //設(shè)置PWM占空比
  43.      PWMLER=0x41;                         //PWMMR0,PWMMR6鎖存,更新PWM占空比
  44.     // WaitKey();                           //等待按鍵

  45.     if(KEY1==0)
  46.                    { while((IOPIN&KEY1)!=0);                 //等待KEY1鍵按下
  47.                   for(i=0;i<50;i++);                      //延時(shí)去抖
  48.                   if((IOPIN&KEY1)==0)break;
  49.                    }
  50.                   while((IOPIN&KEY1)==0);                   //等待KEY1鍵放開(kāi)
  51.                    pwmdata=100;                        //改變PWM占空比控制變量

  52.     if(KEY2==0)
  53.                    { while((IOPIN&KEY2)!=0);                 //等待KEY2鍵按下
  54.                   for(i=0;i<50;i++);                      //延時(shí)去抖
  55.                   if((IOPIN&KEY2)==0)break;
  56.                    }
  57.                   while((IOPIN&KEY2)==0);                   //等待KEY2鍵放開(kāi)
  58.                    pwmdata=300;                        //改變PWM占空比控制變量
  59.                   
  60.     if(KEY3==0)
  61.                    { while((IOPIN&KEY3)!=0);                 //等待KEY3鍵按下
  62.                   for(i=0;i<50;i++);                      //延時(shí)去抖
  63.                   if((IOPIN&KEY3)==0)break;
  64.                    }
  65.                   while((IOPIN&KEY3)==0);                   //等待KEY3鍵放開(kāi)
  66.                    pwmdata=500;                        //改變PWM占空比控制變量
  67.                   
  68.     if(KEY4==0)
  69.                    { while((IOPIN&KEY4)!=0);                 //等待KEY4鍵按下
  70.                   for(i=0;i<50;i++);                      //延時(shí)去抖
  71.                   if((IOPIN&KEY4)==0)break;
  72.                    }
  73.                   while((IOPIN&KEY4)==0);                   //等待KEY4鍵放開(kāi)
  74.                    pwmdata=700;                        //改變PWM占空比控制變量  
  75.                   
  76.     if(KEY5==0)
  77.                    { while((IOPIN&KEY5)!=0);                 //等待KEY5鍵按下
  78.                   for(i=0;i<50;i++);                      //延時(shí)去抖
  79.                   if((IOPIN&KEY5)==0)break;
  80.                    }
  81.                   while((IOPIN&KEY5)==0);                   //等待KEY5鍵放開(kāi)
  82.                    pwmdata=900;                        //改變PWM占空比控制變量
  83.                   
  84.               if(KEY6==0)
  85.                    { while((IOPIN&KEY6)!=0);                 //等待KEY6鍵按下
  86.                   for(i=0;i<50;i++);                      //延時(shí)去抖
  87.                   if((IOPIN&KEY6)==0)break;
  88.                    }
  89.                   while((IOPIN&KEY6)==0);                   //等待KEY6鍵放開(kāi)
  90.                    pwmdata=1100;                        //改變PWM占空比控制變量
  91.                   
  92.     if(KEY7==0)
  93.                    { while((IOPIN&KEY7)!=0);                 //等待KEY7鍵按下
  94.                   for(i=0;i<50;i++);                      //延時(shí)去抖
  95.                   if((IOPIN&KEY7)==0)break;
  96.                    }
  97.                   while((IOPIN&KEY7)==0);                   //等待KEY7鍵放開(kāi)
  98.                    pwmdata=1300;                        //改變PWM占空比控制變量   
  99.                   
  100.                   
  101.     if(KEY8==0)
  102.                    { while((IOPIN&KEY8)!=0);                 //等待KEY8鍵按下
  103.                   for(i=0;i<50;i++);                      //延時(shí)去抖
  104.                   if((IOPIN&KEY8)==0)break;
  105.                    }
  106.                   while((IOPIN&KEY8)==0);                   //等待KEY8鍵放開(kāi)
  107.                    pwmdata=1500;                        //改變PWM占空比控制變量
  108.                        
  109.      if(pwmdata>=2764)pwmdata=0;
  110.   }
  111.   return(0);
  112. }
  113. //PWM初始化函數(shù)
  114.   void TargetInit(void)
  115. {
  116. PWMPR=0x00;                      //不分頻
  117. PWMMCR=0x02;                     //設(shè)置PWMMR0匹配
  118.     PWMMR0=2765;                     //設(shè)置PWM周期
  119. PWMMR6=1382;                     //設(shè)置PWM占空比   
  120. PWMLER=0x41;                     //PWMMR0,PWMMR6鎖存                                               PWMPCR=0x4000;                       //允許PWM單邊輸出
  121.     PWMTCR=0x09;                     //PWM使能
  122. }
復(fù)制代碼


  • 系統(tǒng)的仿真與調(diào)試

   將編譯好的十六制文件下載到proteus中的ARM芯片中。
    第一次用軟件調(diào)試時(shí),沒(méi)有任何現(xiàn)象,檢查了好久終于發(fā)現(xiàn)了原來(lái)是有一個(gè)電源沒(méi)有設(shè)置數(shù)值,也沒(méi)有標(biāo)明電源的極性,將其改為+3.3V時(shí)現(xiàn)象就出現(xiàn)了。
依次按下KEY1-KEY,依次發(fā)出不同音調(diào)的聲音,按下復(fù)位鍵系統(tǒng)回歸到初始狀態(tài)。
    圖5.1 為硬件設(shè)計(jì)電路整體圖。

                          圖5.1 硬件設(shè)計(jì)電路整體圖
  • 設(shè)計(jì)總結(jié)
此次嵌入式設(shè)計(jì)的主要內(nèi)容:基于LPC2000系列的高級(jí)電子琴設(shè)計(jì)。它的主要功能是:實(shí)現(xiàn)不同頻率的音調(diào)輸出。因此要涉及到蜂鳴器的驅(qū)動(dòng)電路,按鍵的掃描程序,最小系統(tǒng)電路的設(shè)計(jì)。
剛開(kāi)始時(shí)拿到這個(gè)設(shè)計(jì)的題目是還有點(diǎn)不知所措,但通過(guò)上網(wǎng)查閱LPC213X系列最小系統(tǒng)板的相關(guān)資料,學(xué)會(huì)了用proteus進(jìn)行ARM仿真,查找了一些以應(yīng)用嵌入式ARM的仿真實(shí)例,分析各個(gè)實(shí)例的工作原理,將各個(gè)實(shí)例的有用模塊綜合運(yùn)用得到本實(shí)訓(xùn)基于嵌入式ARM的高級(jí)電子琴設(shè)計(jì)的原理圖,該圖主要包括三個(gè)模塊:2*4鍵盤(pán)、PWM脈沖輸出、功率放大電路。控制LPC213X系列最小系統(tǒng)板的P0.9口輸出PWM脈沖發(fā)出不同頻率使蜂鳴器發(fā)出不同的聲音,P0.9口外接功放電路連接蜂鳴器發(fā)聲。按鍵輸入功能有8個(gè)輸入故最終確定采用2*4的矩陣鍵盤(pán)作為電子密碼鎖的鍵盤(pán)控制。經(jīng)過(guò)網(wǎng)上收集資料與同學(xué)之間的討論,終于明白了鍵盤(pán)掃描的工作原理,和51單片機(jī)一樣都是利用動(dòng)態(tài)掃描原理最終實(shí)現(xiàn)了鍵盤(pán)輸入的功能。依靠程序完成大部分的功能,所以程序的調(diào)試是重中之重,當(dāng)然前提是能夠編寫(xiě)并會(huì)修改程序。
    此次設(shè)計(jì)總的來(lái)說(shuō)進(jìn)行的還順利,這是小組成員團(tuán)結(jié)付出的結(jié)果,當(dāng)然,在此期間指導(dǎo)老師也為我們提供了巨大的幫助,在此表示深深的感謝!在此期間也學(xué)到了許多,特別是對(duì)軟件的應(yīng)用,如proteus,ADS1.2,AXD,加強(qiáng)了理論與實(shí)踐的聯(lián)系。

完整的Word格式文檔51黑下載地址:
基于LPC2000系列的電子琴的設(shè)計(jì).doc (987.63 KB, 下載次數(shù): 31)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表